From 77e1080b4db37ea0081d8608c867dcc6f009aa9d Mon Sep 17 00:00:00 2001 From: Sean Davis <smd.seandavis@gmail.com> Date: Sat, 24 Feb 2018 08:44:44 -0500 Subject: [PATCH] Wait for the pulseaudio volume sink to be connected to get the current volume state at startup (Bugs #14071, #13677) --- panel-plugin/pulseaudio-button.c | 23 +++++++++++++++++++++++ panel-plugin/pulseaudio-volume.c | 28 ++++++++++++++++++++++++---- panel-plugin/pulseaudio-volume.h | 2 ++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/panel-plugin/pulseaudio-button.c b/panel-plugin/pulseaudio-button.c index 92d8f3a..5657107 100644 --- a/panel-plugin/pulseaudio-button.c +++ b/panel-plugin/pulseaudio-button.c @@ -280,12 +280,30 @@ pulseaudio_button_update_icons (PulseaudioButton *button) +static gboolean +pulseaudio_button_sink_connection_timeout (gpointer userdata) +{ + PulseaudioButton *button = PULSEAUDIO_BUTTON (userdata); + gboolean sink_connected = pulseaudio_volume_get_sink_connected (button->volume); + + if (sink_connected) + { + pulseaudio_button_update (button, TRUE); + return FALSE; + } + + return TRUE; +} + + + static void pulseaudio_button_update (PulseaudioButton *button, gboolean force_update) { gdouble volume; gboolean connected; + gboolean sink_connected; gboolean muted; gchar *tip_text; const gchar *icon_name; @@ -296,6 +314,8 @@ pulseaudio_button_update (PulseaudioButton *button, volume = pulseaudio_volume_get_volume (button->volume); muted = pulseaudio_volume_get_muted (button->volume); connected = pulseaudio_volume_get_connected (button->volume); + sink_connected = pulseaudio_volume_get_sink_connected (button->volume); + if (!connected) icon_name = icons[V_MUTED]; else if (muted) @@ -324,6 +344,9 @@ pulseaudio_button_update (PulseaudioButton *button, gtk_image_set_from_icon_name (GTK_IMAGE (button->image), icon_name, GTK_ICON_SIZE_BUTTON); gtk_image_set_pixel_size (GTK_IMAGE (button->image), button->icon_size); } + + if (!sink_connected) + g_timeout_add (250, pulseaudio_button_sink_connection_timeout, button); } diff --git a/panel-plugin/pulseaudio-volume.c b/panel-plugin/pulseaudio-volume.c index c181ae5..55c8070 100644 --- a/panel-plugin/pulseaudio-volume.c +++ b/panel-plugin/pulseaudio-volume.c @@ -536,6 +536,26 @@ pulseaudio_volume_get_connected (PulseaudioVolume *volume) +gboolean +pulseaudio_volume_get_sink_connected (PulseaudioVolume *volume) +{ + g_return_val_if_fail (IS_PULSEAUDIO_VOLUME (volume), FALSE); + + return volume->sink_connected; +} + + + +gboolean +pulseaudio_volume_get_source_connected (PulseaudioVolume *volume) +{ + g_return_val_if_fail (IS_PULSEAUDIO_VOLUME (volume), FALSE); + + return volume->source_connected; +} + + + static gdouble pulseaudio_volume_v2d (PulseaudioVolume *volume, pa_volume_t pa_volume) @@ -737,10 +757,10 @@ pulseaudio_volume_set_volume (PulseaudioVolume *volume, vol_trim = MIN (MAX (vol, 0.0), vol_max); if (volume->volume != vol_trim) - { - volume->volume = vol_trim; - pa_context_get_server_info (volume->pa_context, pulseaudio_volume_set_volume_cb1, volume); - } + { + volume->volume = vol_trim; + pa_context_get_server_info (volume->pa_context, pulseaudio_volume_set_volume_cb1, volume); + } } diff --git a/panel-plugin/pulseaudio-volume.h b/panel-plugin/pulseaudio-volume.h index 33cff96..8eebc35 100644 --- a/panel-plugin/pulseaudio-volume.h +++ b/panel-plugin/pulseaudio-volume.h @@ -39,6 +39,8 @@ GType pulseaudio_volume_get_type (void) G_GNUC_ PulseaudioVolume *pulseaudio_volume_new (PulseaudioConfig *config); gboolean pulseaudio_volume_get_connected (PulseaudioVolume *volume); +gboolean pulseaudio_volume_get_sink_connected (PulseaudioVolume *volume); +gboolean pulseaudio_volume_get_source_connected (PulseaudioVolume *volume); gdouble pulseaudio_volume_get_volume (PulseaudioVolume *volume); void pulseaudio_volume_set_volume (PulseaudioVolume *volume, -- GitLab