[Xfce4-commits] [panel-plugins/xfce4-pulseaudio-plugin] 02/21: Add support for input devices, ignoring sink monitors

noreply at xfce.org noreply at xfce.org
Sat Sep 23 21:27:28 CEST 2017


This is an automated email from the git hooks/post-receive script.

b   l   u   e   s   a   b   r   e       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository panel-plugins/xfce4-pulseaudio-plugin.

commit d3f05f2058993d7b3b715c2e32952ab45d5cd336
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Sat Sep 9 07:56:03 2017 -0400

    Add support for input devices, ignoring sink monitors
---
 panel-plugin/pulseaudio-menu.c   | 160 +++++++++++++++++++++++++--------------
 panel-plugin/pulseaudio-volume.c |  51 ++++++++++++-
 panel-plugin/pulseaudio-volume.h |   2 +
 3 files changed, 155 insertions(+), 58 deletions(-)

diff --git a/panel-plugin/pulseaudio-menu.c b/panel-plugin/pulseaudio-menu.c
index 395e2fd..f10650b 100644
--- a/panel-plugin/pulseaudio-menu.c
+++ b/panel-plugin/pulseaudio-menu.c
@@ -186,6 +186,20 @@ pulseaudio_menu_default_output_item_toggled (PulseaudioMenu   *menu,
 
 
 static void
+pulseaudio_menu_default_input_item_toggled (PulseaudioMenu   *menu,
+                                            GtkCheckMenuItem *menu_item)
+{
+  g_return_if_fail (IS_PULSEAUDIO_MENU (menu));
+
+  if (gtk_check_menu_item_get_active (menu_item))
+    {
+      pulseaudio_volume_set_default_input (menu->volume, (gchar *)g_object_get_data (G_OBJECT(menu_item), "name"));
+    }
+}
+
+
+
+static void
 pulseaudio_menu_input_range_scroll (GtkWidget        *widget,
                                     GdkEvent         *event,
                                     PulseaudioMenu   *menu)
@@ -435,84 +449,120 @@ pulseaudio_menu_new (PulseaudioVolume *volume,
 
   volume_max = pulseaudio_config_get_volume_max (menu->config);
 
-  /* output volume slider */
-  mi = scale_menu_item_new_with_range (0.0, volume_max, 1.0);
-  scale_menu_item_set_image_from_icon_name (SCALE_MENU_ITEM (mi), "audio-volume-high-symbolic");
-  scale_menu_item_set_description_label (SCALE_MENU_ITEM (mi), _("<b>Audio output volume</b>"));
+  /* Output Devices */
+  sources = pulseaudio_volume_get_output_list (menu->volume);
+  if (g_list_length (sources) > 0) {
+    /* output volume slider */
+    mi = scale_menu_item_new_with_range (0.0, volume_max, 1.0);
+    scale_menu_item_set_image_from_icon_name (SCALE_MENU_ITEM (mi), "audio-volume-high-symbolic");
+    scale_menu_item_set_description_label (SCALE_MENU_ITEM (mi), _("<b>Audio output volume</b>"));
 
-  /* range slider */
-  menu->range_output = scale_menu_item_get_scale (SCALE_MENU_ITEM (mi));
+    /* range slider */
+    menu->range_output = scale_menu_item_get_scale (SCALE_MENU_ITEM (mi));
 
-  g_signal_connect_swapped (mi, "value-changed", G_CALLBACK (pulseaudio_menu_output_range_value_changed), menu);
-  g_signal_connect (mi, "scroll-event", G_CALLBACK (pulseaudio_menu_output_range_scroll), menu);
+    g_signal_connect_swapped (mi, "value-changed", G_CALLBACK (pulseaudio_menu_output_range_value_changed), menu);
+    g_signal_connect (mi, "scroll-event", G_CALLBACK (pulseaudio_menu_output_range_scroll), menu);
 
-  gtk_widget_show_all (mi);
-  gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+    gtk_widget_show_all (mi);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
 
-  menu->mute_output_item = gtk_check_menu_item_new_with_mnemonic (_("_Mute audio output"));
-  gtk_widget_show_all (menu->mute_output_item);
-  gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu->mute_output_item);
-  g_signal_connect_swapped (G_OBJECT (menu->mute_output_item), "toggled", G_CALLBACK (pulseaudio_menu_mute_output_item_toggled), menu);
+    menu->mute_output_item = gtk_check_menu_item_new_with_mnemonic (_("_Mute audio output"));
+    gtk_widget_show_all (menu->mute_output_item);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu->mute_output_item);
+    g_signal_connect_swapped (G_OBJECT (menu->mute_output_item), "toggled", G_CALLBACK (pulseaudio_menu_mute_output_item_toggled), menu);
 
-  sources = pulseaudio_volume_get_output_list (menu->volume);
-  if (g_list_length (sources) > 1) {
-    submenu = gtk_menu_new ();
+    if (g_list_length (sources) > 1) {
+      submenu = gtk_menu_new ();
 
-    for (GList *list = sources; list != NULL; list = g_list_next (list)) {
-      mi = gtk_radio_menu_item_new_with_label (group, pulseaudio_volume_get_output_by_name (menu->volume, list->data));
-      g_object_set_data (G_OBJECT (mi), "name", g_strdup ((gchar *)list->data));
+      for (GList *list = sources; list != NULL; list = g_list_next (list)) {
+        mi = gtk_radio_menu_item_new_with_label (group, pulseaudio_volume_get_output_by_name (menu->volume, list->data));
+        g_object_set_data (G_OBJECT (mi), "name", g_strdup ((gchar *)list->data));
 
-      group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mi));
-      if (g_strcmp0 (list->data, pulseaudio_volume_get_default_output (menu->volume)) == 0)
-      {
-        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), TRUE);
-      }
-      else
-      {
-        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), FALSE);
+        group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mi));
+        if (g_strcmp0 (list->data, pulseaudio_volume_get_default_output (menu->volume)) == 0)
+        {
+          gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), TRUE);
+        }
+        else
+        {
+          gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), FALSE);
+        }
+        gtk_widget_show (mi);
+        gtk_menu_shell_append (GTK_MENU_SHELL (submenu), mi);
+
+        g_signal_connect_swapped (G_OBJECT (mi), "toggled", G_CALLBACK (pulseaudio_menu_default_output_item_toggled), menu);
       }
+
+      mi = gtk_menu_item_new_with_label ("Output Device");
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), submenu);
       gtk_widget_show (mi);
-      gtk_menu_shell_append (GTK_MENU_SHELL (submenu), mi);
 
-      g_signal_connect_swapped (G_OBJECT (mi), "toggled", G_CALLBACK (pulseaudio_menu_default_output_item_toggled), menu);
+      gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
     }
 
-    mi = gtk_menu_item_new_with_label ("Output Device");
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), submenu);
+    /* separator */
+    mi = gtk_separator_menu_item_new ();
     gtk_widget_show (mi);
-
     gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
   }
   g_list_free (sources);
 
-  /* separator */
-  mi = gtk_separator_menu_item_new ();
-  gtk_widget_show (mi);
-  gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+  /* Input Devices */
+  sources = pulseaudio_volume_get_input_list (menu->volume);
+  if (g_list_length (sources) > 0) {
+    /* input volume slider */
+    mi = scale_menu_item_new_with_range (0.0, volume_max, 1.0);
+    scale_menu_item_set_image_from_icon_name (SCALE_MENU_ITEM (mi), "microphone-sensitivity-high-symbolic");
+    scale_menu_item_set_description_label (SCALE_MENU_ITEM (mi), _("<b>Audio input volume</b>"));
 
-  /* input volume slider */
-  mi = scale_menu_item_new_with_range (0.0, volume_max, 1.0);
-  scale_menu_item_set_image_from_icon_name (SCALE_MENU_ITEM (mi), "microphone-sensitivity-high-symbolic");
-  scale_menu_item_set_description_label (SCALE_MENU_ITEM (mi), _("<b>Audio input volume</b>"));
+    /* range slider */
+    menu->range_input = scale_menu_item_get_scale (SCALE_MENU_ITEM (mi));
 
-  /* range slider */
-  menu->range_input = scale_menu_item_get_scale (SCALE_MENU_ITEM (mi));
+    g_signal_connect_swapped (mi, "value-changed", G_CALLBACK (pulseaudio_menu_input_range_value_changed), menu);
+    g_signal_connect (mi, "scroll-event", G_CALLBACK (pulseaudio_menu_input_range_scroll), menu);
 
-  g_signal_connect_swapped (mi, "value-changed", G_CALLBACK (pulseaudio_menu_input_range_value_changed), menu);
-  g_signal_connect (mi, "scroll-event", G_CALLBACK (pulseaudio_menu_input_range_scroll), menu);
+    gtk_widget_show_all (mi);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
 
-  gtk_widget_show_all (mi);
-  gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+    menu->mute_input_item = gtk_check_menu_item_new_with_mnemonic (_("_Mute audio input"));
+    gtk_widget_show_all (menu->mute_input_item);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu->mute_input_item);
+    g_signal_connect_swapped (G_OBJECT (menu->mute_input_item), "toggled", G_CALLBACK (pulseaudio_menu_mute_input_item_toggled), menu);
 
-  menu->mute_input_item = gtk_check_menu_item_new_with_mnemonic (_("_Mute audio input"));
-  gtk_widget_show_all (menu->mute_input_item);
-  gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu->mute_input_item);
-  g_signal_connect_swapped (G_OBJECT (menu->mute_input_item), "toggled", G_CALLBACK (pulseaudio_menu_mute_input_item_toggled), menu);
+    if (g_list_length (sources) > 1) {
+      submenu = gtk_menu_new ();
 
-  /* separator */
-  mi = gtk_separator_menu_item_new ();
-  gtk_widget_show (mi);
-  gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+      for (GList *list = sources; list != NULL; list = g_list_next (list)) {
+        mi = gtk_radio_menu_item_new_with_label (group, pulseaudio_volume_get_input_by_name (menu->volume, list->data));
+        g_object_set_data (G_OBJECT (mi), "name", g_strdup ((gchar *)list->data));
+
+        group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mi));
+        if (g_strcmp0 (list->data, pulseaudio_volume_get_default_input (menu->volume)) == 0)
+        {
+          gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), TRUE);
+        }
+        else
+        {
+          gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), FALSE);
+        }
+        gtk_widget_show (mi);
+        gtk_menu_shell_append (GTK_MENU_SHELL (submenu), mi);
+
+        g_signal_connect_swapped (G_OBJECT (mi), "toggled", G_CALLBACK (pulseaudio_menu_default_input_item_toggled), menu);
+      }
+
+      mi = gtk_menu_item_new_with_label ("Input Device");
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), submenu);
+      gtk_widget_show (mi);
+
+      gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+    }
+
+    /* separator */
+    mi = gtk_separator_menu_item_new ();
+    gtk_widget_show (mi);
+    gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
+  }
 
   /* MPRIS2 */
 #ifdef HAVE_MPRIS2
diff --git a/panel-plugin/pulseaudio-volume.c b/panel-plugin/pulseaudio-volume.c
index aae6955..ce73b0c 100644
--- a/panel-plugin/pulseaudio-volume.c
+++ b/panel-plugin/pulseaudio-volume.c
@@ -223,6 +223,8 @@ pulseaudio_volume_source_info_cb (pa_context           *context,
   if (i == NULL) return;
   pulseaudio_debug ("source info: %s, %s", i->name, i->description);
 
+  volume->source_index = (guint)i->index;
+
   muted_mic = !!(i->mute);
   vol_mic = pulseaudio_volume_v2d (volume, i->volume.values[0]);
 
@@ -348,6 +350,9 @@ pulseaudio_volume_get_source_list_cb (pa_context           *context,
 
   if (eol > 0) return;
 
+  /* Ignore sink monitors, not relevant for users */
+  if (i->monitor_of_sink != PA_INVALID_INDEX) return;
+
   name = g_strdup (i->name);
   description = g_strdup (i->description);
 
@@ -846,6 +851,14 @@ pulseaudio_volume_get_default_output (PulseaudioVolume *volume)
 
 
 
+const gchar *
+pulseaudio_volume_get_default_input (PulseaudioVolume *volume)
+{
+  return volume->default_source_name;
+}
+
+
+
 static void
 pulseaudio_volume_default_sink_changed_info_cb (pa_context         *context,
                                                 const pa_sink_info *i,
@@ -886,10 +899,42 @@ pulseaudio_volume_set_default_output (PulseaudioVolume *volume,
 
 
 
-const gchar *
-pulseaudio_volume_get_default_input (PulseaudioVolume *volume)
+static void
+pulseaudio_volume_default_source_changed_info_cb (pa_context         *context,
+                                                  const pa_source_info *i,
+                                                  int                 eol,
+                                                  void               *userdata)
 {
-  return volume->default_source_name;
+  PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata);
+  if (i == NULL) return;
+
+  pa_context_move_source_output_by_index (context, volume->source_index, i->index, NULL, NULL);
+  volume->source_index = (guint)i->index;
+}
+
+
+
+static void
+pulseaudio_volume_default_source_changed (pa_context *context,
+                                          int         success,
+                                          void       *userdata)
+{
+  PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata);
+
+  if (success)
+    pa_context_get_source_info_by_name (volume->pa_context, volume->default_source_name, pulseaudio_volume_default_source_changed_info_cb, volume);
+}
+
+
+
+void
+pulseaudio_volume_set_default_input (PulseaudioVolume *volume,
+                                     gchar            *name)
+{
+  g_free (volume->default_source_name);
+  volume->default_source_name = g_strdup (name);
+
+  pa_context_set_default_source (volume->pa_context, name, pulseaudio_volume_default_source_changed, volume);
 }
 
 
diff --git a/panel-plugin/pulseaudio-volume.h b/panel-plugin/pulseaudio-volume.h
index 7acaa79..2bef77f 100644
--- a/panel-plugin/pulseaudio-volume.h
+++ b/panel-plugin/pulseaudio-volume.h
@@ -69,6 +69,8 @@ GList                  *pulseaudio_volume_get_input_list          (PulseaudioVol
 gchar                  *pulseaudio_volume_get_input_by_name       (PulseaudioVolume *volume,
                                                                    gchar            *name);
 const gchar            *pulseaudio_volume_get_default_input       (PulseaudioVolume *volume);
+void                    pulseaudio_volume_set_default_input       (PulseaudioVolume *volume,
+                                                                   gchar            *name);
 
 G_END_DECLS
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list