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 6e118bf57859821a3e93fd225e0e64c217488bc7 Author: Sean Davis <[email protected]> Date: Sat Sep 9 07:04:39 2017 -0400 Start adding device support. Can select default audio output device, but this does not currently propogate to active streams. --- panel-plugin/pulseaudio-menu.c | 49 ++++++++++ panel-plugin/pulseaudio-volume.c | 195 +++++++++++++++++++++++++++++++++++++++ panel-plugin/pulseaudio-volume.h | 12 +++ 3 files changed, 256 insertions(+) diff --git a/panel-plugin/pulseaudio-menu.c b/panel-plugin/pulseaudio-menu.c index d988f72..395e2fd 100644 --- a/panel-plugin/pulseaudio-menu.c +++ b/panel-plugin/pulseaudio-menu.c @@ -172,6 +172,20 @@ pulseaudio_menu_mute_output_item_toggled (PulseaudioMenu *menu, static void +pulseaudio_menu_default_output_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_output (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) @@ -378,6 +392,10 @@ pulseaudio_menu_new (PulseaudioVolume *volume, GtkWidget *mi; gdouble volume_max; + GtkWidget *submenu; + GList *sources = NULL; + GSList *group = NULL; + #ifdef HAVE_MPRIS2 gchar **players; gchar *title = NULL; @@ -436,6 +454,37 @@ pulseaudio_menu_new (PulseaudioVolume *volume, 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 (); + + 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); + } + 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 (menu), mi); + } + g_list_free (sources); + /* separator */ mi = gtk_separator_menu_item_new (); gtk_widget_show (mi); diff --git a/panel-plugin/pulseaudio-volume.c b/panel-plugin/pulseaudio-volume.c index 02adb66..aae6955 100644 --- a/panel-plugin/pulseaudio-volume.c +++ b/panel-plugin/pulseaudio-volume.c @@ -64,6 +64,16 @@ struct _PulseaudioVolume gboolean muted_mic; guint reconnect_timer_id; + + /* Device management */ + GHashTable *sinks; + GHashTable *sources; + + guint sink_index; + guint source_index; + + gchar *default_sink_name; + gchar *default_source_name; }; struct _PulseaudioVolumeClass @@ -125,8 +135,14 @@ pulseaudio_volume_init (PulseaudioVolume *volume) volume->muted_mic = FALSE; volume->reconnect_timer_id = 0; + volume->default_sink_name = NULL; + volume->default_source_name = NULL; + volume->pa_mainloop = pa_glib_mainloop_new (NULL); + volume->sinks = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_free); + volume->sources = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_free); + pulseaudio_volume_connect (volume); } @@ -139,6 +155,15 @@ pulseaudio_volume_finalize (GObject *object) volume->config = NULL; + if (volume->default_sink_name) + g_free (volume->default_sink_name); + + if (volume->default_source_name) + g_free (volume->default_source_name); + + g_hash_table_destroy (volume->sinks); + g_hash_table_destroy (volume->sources); + pa_glib_mainloop_free (volume->pa_mainloop); (*G_OBJECT_CLASS (pulseaudio_volume_parent_class)->finalize) (object); @@ -161,6 +186,8 @@ pulseaudio_volume_sink_info_cb (pa_context *context, if (i == NULL) return; pulseaudio_debug ("sink info: %s, %s", i->name, i->description); + volume->sink_index = (guint)i->index; + muted = !!(i->mute); vol = pulseaudio_volume_v2d (volume, i->volume.values[0]); @@ -283,6 +310,69 @@ pulseaudio_volume_subscribe_cb (pa_context *context, + + +static void +pulseaudio_volume_get_sink_list_cb (pa_context *context, + const pa_sink_info *i, + int eol, + void *userdata) +{ + gchar *name = NULL; + gchar *description = NULL; + + PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata); + if (i == NULL) return; + + if (eol > 0) return; + + name = g_strdup (i->name); + description = g_strdup (i->description); + + g_hash_table_insert (volume->sinks, name, description); +} + + + +static void +pulseaudio_volume_get_source_list_cb (pa_context *context, + const pa_source_info *i, + int eol, + void *userdata) +{ + gchar *name = NULL; + gchar *description = NULL; + + PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata); + if (i == NULL) return; + + if (eol > 0) return; + + name = g_strdup (i->name); + description = g_strdup (i->description); + + g_hash_table_insert (volume->sources, name, description); +} + + + +static void +pulseaudio_volume_get_server_info_cb (pa_context *context, + const pa_server_info *i, + void *userdata) +{ + PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata); + if (i == NULL) return; + + g_free (volume->default_sink_name); + g_free (volume->default_source_name); + + volume->default_sink_name = g_strdup (i->default_sink_name); + volume->default_source_name = g_strdup (i->default_source_name); +} + + + static void pulseaudio_volume_context_state_cb (pa_context *context, void *userdata) @@ -299,8 +389,14 @@ pulseaudio_volume_context_state_cb (pa_context *context, volume->connected = TRUE; // Check current sink and source volume manually. PA sink events usually not emitted. pulseaudio_volume_sink_source_check (volume, context); + g_signal_emit (G_OBJECT (volume), pulseaudio_volume_signals [VOLUME_CHANGED], 0, FALSE); g_signal_emit (G_OBJECT (volume), pulseaudio_volume_signals [VOLUME_MIC_CHANGED], 0, FALSE); + + pa_context_get_sink_info_list (volume->pa_context, pulseaudio_volume_get_sink_list_cb, volume); + pa_context_get_source_info_list (volume->pa_context, pulseaudio_volume_get_source_list_cb, volume); + pa_context_get_server_info (volume->pa_context, pulseaudio_volume_get_server_info_cb, volume); + break; case PA_CONTEXT_FAILED : @@ -312,8 +408,13 @@ pulseaudio_volume_context_state_cb (pa_context *context, volume->muted = FALSE; volume->volume_mic = 0.0; volume->muted_mic = FALSE; + g_signal_emit (G_OBJECT (volume), pulseaudio_volume_signals [VOLUME_CHANGED], 0, FALSE); g_signal_emit (G_OBJECT (volume), pulseaudio_volume_signals [VOLUME_MIC_CHANGED], 0, FALSE); + + g_hash_table_remove_all (volume->sinks); + g_hash_table_remove_all (volume->sources); + if (volume->reconnect_timer_id == 0) volume->reconnect_timer_id = g_timeout_add_seconds (5, pulseaudio_volume_reconnect_timeout, volume); @@ -699,6 +800,100 @@ pulseaudio_volume_set_volume_mic (PulseaudioVolume *volume, +GList * +pulseaudio_volume_get_output_list (PulseaudioVolume *volume) +{ + g_return_if_fail (IS_PULSEAUDIO_VOLUME (volume)); + return g_hash_table_get_keys (volume->sinks); +} + + + +gchar * +pulseaudio_volume_get_output_by_name (PulseaudioVolume *volume, + gchar *name) +{ + g_return_if_fail (IS_PULSEAUDIO_VOLUME (volume)); + return (gchar *) g_hash_table_lookup (volume->sinks, name); +} + + + +GList * +pulseaudio_volume_get_input_list (PulseaudioVolume *volume) +{ + g_return_if_fail (IS_PULSEAUDIO_VOLUME (volume)); + return g_hash_table_get_keys (volume->sources); +} + + + +gchar * +pulseaudio_volume_get_input_by_name (PulseaudioVolume *volume, + gchar *name) +{ + g_return_if_fail (IS_PULSEAUDIO_VOLUME (volume)); + return (gchar *) g_hash_table_lookup (volume->sources, name); +} + + + +const gchar * +pulseaudio_volume_get_default_output (PulseaudioVolume *volume) +{ + return volume->default_sink_name; +} + + + +static void +pulseaudio_volume_default_sink_changed_info_cb (pa_context *context, + const pa_sink_info *i, + int eol, + void *userdata) +{ + PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata); + if (i == NULL) return; + + pa_context_move_sink_input_by_index (context, volume->sink_index, i->index, NULL, NULL); + volume->sink_index = (guint)i->index; +} + + + +static void +pulseaudio_volume_default_sink_changed (pa_context *context, + int success, + void *userdata) +{ + PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata); + + if (success) + pa_context_get_sink_info_by_name (volume->pa_context, volume->default_sink_name, pulseaudio_volume_default_sink_changed_info_cb, volume); +} + + + +void +pulseaudio_volume_set_default_output (PulseaudioVolume *volume, + gchar *name) +{ + g_free (volume->default_sink_name); + volume->default_sink_name = g_strdup (name); + + pa_context_set_default_sink (volume->pa_context, name, pulseaudio_volume_default_sink_changed, volume); +} + + + +const gchar * +pulseaudio_volume_get_default_input (PulseaudioVolume *volume) +{ + return volume->default_source_name; +} + + + PulseaudioVolume * pulseaudio_volume_new (PulseaudioConfig *config) { diff --git a/panel-plugin/pulseaudio-volume.h b/panel-plugin/pulseaudio-volume.h index 9ae0296..7acaa79 100644 --- a/panel-plugin/pulseaudio-volume.h +++ b/panel-plugin/pulseaudio-volume.h @@ -58,6 +58,18 @@ void pulseaudio_volume_set_muted_mic (PulseaudioVol gboolean mic_muted); void pulseaudio_volume_toggle_muted_mic (PulseaudioVolume *volume); +GList *pulseaudio_volume_get_output_list (PulseaudioVolume *volume); +gchar *pulseaudio_volume_get_output_by_name (PulseaudioVolume *volume, + gchar *name); +const gchar *pulseaudio_volume_get_default_output (PulseaudioVolume *volume); +void pulseaudio_volume_set_default_output (PulseaudioVolume *volume, + gchar *name); + +GList *pulseaudio_volume_get_input_list (PulseaudioVolume *volume); +gchar *pulseaudio_volume_get_input_by_name (PulseaudioVolume *volume, + gchar *name); +const gchar *pulseaudio_volume_get_default_input (PulseaudioVolume *volume); + G_END_DECLS #endif /* !__PULSEAUDIO_VOLUME_H__ */ -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list [email protected] https://mail.xfce.org/mailman/listinfo/xfce4-commits
