Index: mixer/applet.c
===================================================================
--- mixer/applet.c	(revision 10288)
+++ mixer/applet.c	(working copy)
@@ -81,6 +81,11 @@
 
 static void	gnome_volume_applet_refresh	(GnomeVolumeApplet *applet,
 						 gboolean           force_refresh);
+
+#ifdef HAVE_GST_MIXER_NOTIFIES
+static void     cb_notify_message (GstBus *bus, GstMessage *message, gpointer data);
+#endif
+
 static gboolean	cb_check			(gpointer   data);
 
 static void	cb_volume			(GtkAdjustment *adj,
@@ -243,6 +248,12 @@
   /* i18n */
   ao = gtk_widget_get_accessible (GTK_WIDGET (applet));
   atk_object_set_name (ao, _("Volume Control"));
+
+  /* Bus for notifications */
+#ifdef HAVE_GST_MIXER_NOTIFIES
+  applet->bus = gst_bus_new ();
+  gst_bus_add_signal_watch (applet->bus);
+#endif
 }
 
 /* Parse the list of tracks that are stored in GConf */
@@ -369,6 +380,9 @@
     return FALSE;
 
   applet->mixer = g_object_ref (active_element);
+#ifdef HAVE_GST_MIXER_NOTIFIES
+  gst_element_set_bus (GST_ELEMENT (applet->mixer), applet->bus);
+#endif
   applet->tracks = active_tracks;
   g_list_foreach (applet->tracks, (GFunc) g_object_ref, NULL);
 
@@ -438,7 +452,19 @@
 
   gnome_volume_applet_refresh (applet, TRUE);
   if (res) {
+#ifdef HAVE_GST_MIXER_NOTIFIES
+    if (gst_mixer_get_mixer_flags (GST_MIXER (applet->mixer)) & 
+        GST_MIXER_FLAG_AUTO_NOTIFICATIONS) {
+      g_print ("Notifications available\n");
+      g_signal_connect (G_OBJECT (applet->bus), "message::element", 
+          (GCallback) cb_notify_message, applet);
+    }
+    else {
+      applet->timeout = g_timeout_add (100, cb_check, applet);
+    }
+#else
     applet->timeout = g_timeout_add (100, cb_check, applet);
+#endif
   }
 
   if (res) {
@@ -480,6 +506,13 @@
     g_list_free (applet->elements);
     applet->elements = NULL;
   }
+#ifdef HAVE_GST_MIXER_NOTIFIES
+  gst_bus_remove_signal_watch (applet->bus);
+  if (applet->bus) {
+    gst_object_unref (applet->bus);
+    applet->bus = NULL;
+  }
+#endif
 
   if (applet->tracks) {
     g_list_foreach (applet->tracks, (GFunc) g_object_unref, NULL);
@@ -1154,6 +1187,35 @@
 				"state", mute ? "1" : "0", NULL);
 }
 
+#ifdef HAVE_GST_MIXER_NOTIFIES
+static void
+cb_notify_message (GstBus *bus, GstMessage *message, gpointer data)
+{
+  GnomeVolumeApplet *applet = GNOME_VOLUME_APPLET (data);
+  GstMixerMessageType type;
+  GstMixerTrack *first_track;
+  GstMixerTrack *track = NULL;
+
+  if (applet->tracks == NULL) 
+    return; /* No tracks, can't update anything anyway */
+
+  first_track = g_list_first (applet->tracks)->data;
+
+  /* This code only calls refresh if the first_track changes, because the
+   * refresh code only retrieves the current value from that track anyway */
+  type = gst_mixer_message_get_type (message);
+  if (type == GST_MIXER_MESSAGE_MUTE_TOGGLED) {
+    gst_mixer_message_parse_mute_toggled (message, &track, NULL);
+  }
+  else { 
+    gst_mixer_message_parse_volume_changed (message, &track, NULL, NULL);
+  }
+
+  if (first_track == track)
+    gnome_volume_applet_refresh (GNOME_VOLUME_APPLET (data), FALSE);
+}
+#endif
+
 static gboolean
 cb_check (gpointer data)
 {
Index: mixer/applet.h
===================================================================
--- mixer/applet.h	(revision 10288)
+++ mixer/applet.h	(working copy)
@@ -72,6 +72,7 @@
 
   /* element */
   GstMixer *mixer;
+  GstBus *bus;
   gboolean lock;
   gint state;
   GList *tracks;
Index: configure.in
===================================================================
--- configure.in	(revision 10288)
+++ configure.in	(working copy)
@@ -481,11 +481,22 @@
 
 AM_CONDITIONAL(APPLET_MIXER, test "x$HAVE_GST" = "xyes")
 AM_CONDITIONAL(HAVE_GST10, test "x$HAVE_GST_VER" = "x0.10")
+
+HAVE_GST_MIXER_NOTIFIES=no
 if test "x$HAVE_GST_VER" = "x0.10" ; then
 	AC_DEFINE(HAVE_GST10, 1, [Using Gstreamer 0.10])
 	# these don't seem to come from any pkg-config file
 	MIXER_LIBS="$MIXER_LIBS -lgstinterfaces-0.10 -lgstaudio-0.10"
+
+        PKG_CHECK_MODULES(GST_MIXER_NOTIFICATIONS,
+            gstreamer-plugins-base-0.10 >= 0.10.13.1, 
+            HAVE_GST_MIXER_NOTIFIES=yes, HAVE_GST_MIXER_NOTIFIES=no)
+        if test "x$HAVE_GST_MIXER_NOTIFIES" = "xyes"; then
+          AC_DEFINE(HAVE_GST_MIXER_NOTIFIES, 1, 
+              [Have GStreamer mixer notification API])
+        fi
 fi
+AM_CONDITIONAL(HAVE_GST_MIXER_NOTIFIES, test "x$HAVE_GST_MIXER_NOTIFIES" = "xyes")
 
 AC_SUBST(MIXER_CFLAGS)
 AC_SUBST(MIXER_LIBS)
@@ -767,6 +778,7 @@
 	 - invest-applet		$BUILD_INVEST_APPLET
 	 - mini-commander		$enable_mini_commander
 	 - mixer			$HAVE_GST
+	        - mixer	notifications	$HAVE_GST_MIXER_NOTIFIES
 	 - modemlights			$BUILD_MODEM_LIGHTS
 	 - multiload			$build_gtop_applets
 	 - stickynotes			$enable_stickynotes
