[gnome-media] break feedback loop for sink input volume control



commit 65d5073c675debd2da220bbcdf153740e568c5e5
Author: Lennart Poettering <lennart poettering net>
Date:   Fri May 15 02:09:06 2009 +0200

    break feedback loop for sink input volume control
---
 gnome-volume-control/src/gvc-mixer-sink-input.c |   47 +++++++++++++++++++++-
 1 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/gnome-volume-control/src/gvc-mixer-sink-input.c b/gnome-volume-control/src/gvc-mixer-sink-input.c
index c000e18..83ea651 100644
--- a/gnome-volume-control/src/gvc-mixer-sink-input.c
+++ b/gnome-volume-control/src/gvc-mixer-sink-input.c
@@ -35,12 +35,13 @@
 
 struct GvcMixerSinkInputPrivate
 {
-        gpointer dummy;
+        pa_operation *change_volume_op;
 };
 
 static void     gvc_mixer_sink_input_class_init (GvcMixerSinkInputClass *klass);
 static void     gvc_mixer_sink_input_init       (GvcMixerSinkInput      *mixer_sink_input);
-static void     gvc_mixer_sink_input_finalize   (GObject            *object);
+static void     gvc_mixer_sink_input_finalize   (GObject                *object);
+static void     gvc_mixer_sink_input_dispose    (GObject                *object);
 
 G_DEFINE_TYPE (GvcMixerSinkInput, gvc_mixer_sink_input, GVC_TYPE_MIXER_STREAM)
 
@@ -53,6 +54,7 @@ gvc_mixer_sink_input_push_volume (GvcMixerStream *stream)
         pa_context        *context;
         const pa_cvolume  *cv;
         guint              num_channels;
+        GvcMixerSinkInput *sink_input = GVC_MIXER_SINK_INPUT(stream);
 
         index = gvc_mixer_stream_get_index (stream);
 
@@ -74,7 +76,10 @@ gvc_mixer_sink_input_push_volume (GvcMixerStream *stream)
                 return FALSE;
         }
 
-        pa_operation_unref(o);
+        if (sink_input->priv->change_volume_op != NULL)
+                pa_operation_unref (sink_input->priv->change_volume_op);
+
+        sink_input->priv->change_volume_op = o;
 
         return TRUE;
 }
@@ -106,6 +111,23 @@ gvc_mixer_sink_input_change_is_muted (GvcMixerStream *stream,
         return TRUE;
 }
 
+static gboolean
+gvc_mixer_sink_input_is_running (GvcMixerStream *stream)
+{
+        GvcMixerSinkInput *sink_input = GVC_MIXER_SINK_INPUT (stream);
+
+        if (sink_input->priv->change_volume_op == NULL)
+                return FALSE;
+
+        if ((pa_operation_get_state(sink_input->priv->change_volume_op) == PA_OPERATION_RUNNING))
+                return TRUE;
+
+        pa_operation_unref(sink_input->priv->change_volume_op);
+        sink_input->priv->change_volume_op = NULL;
+
+        return FALSE;
+}
+
 static GObject *
 gvc_mixer_sink_input_constructor (GType                  type,
                                   guint                  n_construct_properties,
@@ -128,10 +150,12 @@ gvc_mixer_sink_input_class_init (GvcMixerSinkInputClass *klass)
         GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass);
 
         object_class->constructor = gvc_mixer_sink_input_constructor;
+        object_class->dispose = gvc_mixer_sink_input_dispose;
         object_class->finalize = gvc_mixer_sink_input_finalize;
 
         stream_class->push_volume = gvc_mixer_sink_input_push_volume;
         stream_class->change_is_muted = gvc_mixer_sink_input_change_is_muted;
+        stream_class->is_running = gvc_mixer_sink_input_is_running;
 
         g_type_class_add_private (klass, sizeof (GvcMixerSinkInputPrivate));
 }
@@ -140,7 +164,24 @@ static void
 gvc_mixer_sink_input_init (GvcMixerSinkInput *sink_input)
 {
         sink_input->priv = GVC_MIXER_SINK_INPUT_GET_PRIVATE (sink_input);
+}
+
+static void
+gvc_mixer_sink_input_dispose (GObject *object)
+{
+        GvcMixerSinkInput *mixer_sink_input;
+
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GVC_IS_MIXER_SINK_INPUT (object));
+
+        mixer_sink_input = GVC_MIXER_SINK_INPUT (object);
+
+        if (mixer_sink_input->priv->change_volume_op) {
+                pa_operation_unref(mixer_sink_input->priv->change_volume_op);
+                mixer_sink_input->priv->change_volume_op = NULL;
+        }
 
+        G_OBJECT_CLASS (gvc_mixer_sink_input_parent_class)->dispose (object);
 }
 
 static void



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