[gnome-media] break feedback loop for sink input volume control
- From: Lennart Poettering <lpoetter src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-media] break feedback loop for sink input volume control
- Date: Fri, 15 May 2009 08:26:29 -0400 (EDT)
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]