[gnome-media] break feedback loop for source volume control



commit d31e06a1e609a479165d4e01c06dda4250dbb91d
Author: Lennart Poettering <lennart poettering net>
Date:   Fri May 15 02:03:26 2009 +0200

    break feedback loop for source volume control
---
 gnome-volume-control/src/gvc-mixer-control.c |    8 ++++
 gnome-volume-control/src/gvc-mixer-source.c  |   46 ++++++++++++++++++++++++--
 2 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/gnome-volume-control/src/gvc-mixer-control.c b/gnome-volume-control/src/gvc-mixer-control.c
index 166bdc3..e7f49d0 100644
--- a/gnome-volume-control/src/gvc-mixer-control.c
+++ b/gnome-volume-control/src/gvc-mixer-control.c
@@ -594,6 +594,10 @@ update_source (GvcMixerControl      *control,
                                                map);
                 g_object_unref (map);
                 is_new = TRUE;
+        } else if (gvc_mixer_stream_is_running (stream)) {
+                /* Ignore events if volume changes are outstanding */
+                g_debug ("Ignoring event, volume changes are outstanding");
+                return;
         }
 
         max_volume = pa_cvolume_max (&info->volume);
@@ -730,6 +734,10 @@ update_sink_input (GvcMixerControl          *control,
                                                    map);
                 g_object_unref (map);
                 is_new = TRUE;
+        } else if (gvc_mixer_stream_is_running (stream)) {
+                /* Ignore events if volume changes are outstanding */
+                g_debug ("Ignoring event, volume changes are outstanding");
+                return;
         }
 
         max_volume = pa_cvolume_max (&info->volume);
diff --git a/gnome-volume-control/src/gvc-mixer-source.c b/gnome-volume-control/src/gvc-mixer-source.c
index 2c2e833..33b0ada 100644
--- a/gnome-volume-control/src/gvc-mixer-source.c
+++ b/gnome-volume-control/src/gvc-mixer-source.c
@@ -35,12 +35,13 @@
 
 struct GvcMixerSourcePrivate
 {
-        gpointer dummy;
+        pa_operation *change_volume_op;
 };
 
 static void     gvc_mixer_source_class_init (GvcMixerSourceClass *klass);
 static void     gvc_mixer_source_init       (GvcMixerSource      *mixer_source);
 static void     gvc_mixer_source_finalize   (GObject            *object);
+static void     gvc_mixer_source_dispose    (GObject           *object);
 
 G_DEFINE_TYPE (GvcMixerSource, gvc_mixer_source, GVC_TYPE_MIXER_STREAM)
 
@@ -74,7 +75,10 @@ gvc_mixer_source_push_volume (GvcMixerStream *stream)
                 return FALSE;
         }
 
-        pa_operation_unref(o);
+        if (source->priv->change_volume_op != NULL)
+                pa_operation_unref (source->priv->change_volume_op);
+
+        source->priv->change_volume_op = o;
 
         return TRUE;
 }
@@ -106,12 +110,29 @@ gvc_mixer_source_change_is_muted (GvcMixerStream *stream,
         return TRUE;
 }
 
+static gboolean
+gvc_mixer_source_is_running (GvcMixerStream *stream)
+{
+        GvcMixerSource *source = GVC_MIXER_SOURCE (stream);
+
+        if (source->priv->change_volume_op == NULL)
+                return FALSE;
+
+        if ((pa_operation_get_state(source->priv->change_volume_op) == PA_OPERATION_RUNNING))
+                return TRUE;
+
+        pa_operation_unref(source->priv->change_volume_op);
+        source->priv->change_volume_op = NULL;
+
+        return FALSE;
+}
+
 static GObject *
 gvc_mixer_source_constructor (GType                  type,
                             guint                  n_construct_properties,
                             GObjectConstructParam *construct_params)
 {
-        GObject       *object;
+        GObject        *object;
         GvcMixerSource *self;
 
         object = G_OBJECT_CLASS (gvc_mixer_source_parent_class)->constructor (type, n_construct_properties, construct_params);
@@ -128,10 +149,12 @@ gvc_mixer_source_class_init (GvcMixerSourceClass *klass)
         GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass);
 
         object_class->constructor = gvc_mixer_source_constructor;
+        object_class->dispose = gvc_mixer_source_dispose;
         object_class->finalize = gvc_mixer_source_finalize;
 
         stream_class->push_volume = gvc_mixer_source_push_volume;
         stream_class->change_is_muted = gvc_mixer_source_change_is_muted;
+        stream_class->is_running = gvc_mixer_source_is_running;
 
         g_type_class_add_private (klass, sizeof (GvcMixerSourcePrivate));
 }
@@ -140,7 +163,24 @@ static void
 gvc_mixer_source_init (GvcMixerSource *source)
 {
         source->priv = GVC_MIXER_SOURCE_GET_PRIVATE (source);
+}
+
+static void
+gvc_mixer_source_dispose (GObject *object)
+{
+        GvcMixerSource *mixer_source;
+
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GVC_IS_MIXER_SOURCE (object));
+
+        mixer_source = GVC_MIXER_SOURCE (object);
+
+        if (mixer_source->priv->change_volume_op) {
+                pa_operation_unref(mixer_source->priv->change_volume_op);
+                mixer_source->priv->change_volume_op = NULL;
+        }
 
+        G_OBJECT_CLASS (gvc_mixer_source_parent_class)->dispose (object);
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]