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