[gnome-media] Actually stop the source monitor when switching defaults



commit 6de46af913bd019cef6e3eb228f98633a1ab9e9d
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Feb 2 17:09:20 2010 +0000

    Actually stop the source monitor when switching defaults
    
    So we don't consume resources reading from all the sources, and
    we don't update the level bar with multiple overlapping
    level readings.

 gnome-volume-control/src/gvc-mixer-dialog.c |   33 +++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)
---
diff --git a/gnome-volume-control/src/gvc-mixer-dialog.c b/gnome-volume-control/src/gvc-mixer-dialog.c
index f415d32..6b8b0b3 100644
--- a/gnome-volume-control/src/gvc-mixer-dialog.c
+++ b/gnome-volume-control/src/gvc-mixer-dialog.c
@@ -536,10 +536,41 @@ create_monitor_stream_for_source (GvcMixerDialog *dialog,
                 pa_stream_unref (s);
         } else {
                 g_object_set_data (G_OBJECT (stream), "has-monitor", GINT_TO_POINTER (TRUE));
+                g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream", s);
+                g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "stream", stream);
         }
 }
 
 static void
+stop_monitor_stream_for_source (GvcMixerDialog *dialog)
+{
+        pa_stream      *s;
+        pa_context     *context;
+        int             res;
+        GvcMixerStream *stream;
+
+        s = g_object_get_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream");
+        if (s == NULL)
+                return;
+        stream = g_object_get_data (G_OBJECT (dialog->priv->input_level_bar), "stream");
+        g_assert (stream != NULL);
+
+        g_debug ("Stopping monitor for %u", pa_stream_get_index (s));
+
+        context = gvc_mixer_control_get_pa_context (dialog->priv->mixer_control);
+
+        if (pa_context_get_server_protocol_version (context) < 13) {
+                return;
+        }
+
+        res = pa_stream_disconnect (s);
+        if (res == 0)
+                g_object_set_data (G_OBJECT (stream), "has-monitor", GINT_TO_POINTER (FALSE));
+        g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "pa_stream", NULL);
+        g_object_set_data (G_OBJECT (dialog->priv->input_level_bar), "stream", NULL);
+}
+
+static void
 update_input_settings (GvcMixerDialog *dialog)
 {
         const GList *ports;
@@ -547,6 +578,8 @@ update_input_settings (GvcMixerDialog *dialog)
 
         g_debug ("Updating input settings");
 
+        stop_monitor_stream_for_source (dialog);
+
         if (dialog->priv->input_port_combo != NULL) {
                 gtk_container_remove (GTK_CONTAINER (dialog->priv->input_settings_box),
                                       dialog->priv->input_port_combo);



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