[Xfce4-commits] [panel-plugins/xfce4-pulseaudio-plugin] 02/02: Reconnect to the PA server if the connection is lost

noreply at xfce.org noreply at xfce.org
Sun Jun 7 00:01:53 CEST 2015


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

andrzejr pushed a commit to branch master
in repository panel-plugins/xfce4-pulseaudio-plugin.

commit ad8d8200a481e798f63b236d874d9b9d6a68f5da
Author: Andrzej <ndrwrdck at gmail.com>
Date:   Sat Jun 6 23:01:39 2015 +0100

    Reconnect to the PA server if the connection is lost
---
 panel-plugin/pulseaudio-button.c |   10 ++++--
 panel-plugin/pulseaudio-notify.c |   13 ++++++--
 panel-plugin/pulseaudio-volume.c |   66 ++++++++++++++++++++++++++++++--------
 panel-plugin/pulseaudio-volume.h |    2 ++
 4 files changed, 73 insertions(+), 18 deletions(-)

diff --git a/panel-plugin/pulseaudio-button.c b/panel-plugin/pulseaudio-button.c
index 032b128..a8dc676 100644
--- a/panel-plugin/pulseaudio-button.c
+++ b/panel-plugin/pulseaudio-button.c
@@ -280,6 +280,7 @@ pulseaudio_button_update (PulseaudioButton *button,
                           gboolean          force_update)
 {
   gdouble      volume;
+  gboolean     connected;
   gboolean     muted;
   gchar       *tip_text;
   const gchar *icon_name;
@@ -289,7 +290,10 @@ pulseaudio_button_update (PulseaudioButton *button,
 
   volume = pulseaudio_volume_get_volume (button->volume);
   muted = pulseaudio_volume_get_muted (button->volume);
-  if (muted)
+  connected = pulseaudio_volume_get_connected (button->volume);
+  if (!connected)
+    icon_name = icons[V_MUTED];
+  else if (muted)
     icon_name = icons[V_MUTED];
   else if (volume <= 0.0)
     icon_name = icons[V_MUTED];
@@ -300,7 +304,9 @@ pulseaudio_button_update (PulseaudioButton *button,
   else
     icon_name = icons[V_HIGH];
 
-  if (muted)
+  if (!connected)
+    tip_text = g_strdup_printf (_("Not connected to the PulseAudio server"));
+  else if (muted)
     tip_text = g_strdup_printf (_("Volume %d%% (muted)"), (gint) round (volume * 100));
   else
     tip_text = g_strdup_printf (_("Volume %d%%"), (gint) round (volume * 100));
diff --git a/panel-plugin/pulseaudio-notify.c b/panel-plugin/pulseaudio-notify.c
index a6caa23..09da849 100644
--- a/panel-plugin/pulseaudio-notify.c
+++ b/panel-plugin/pulseaudio-notify.c
@@ -150,6 +150,7 @@ pulseaudio_notify_notify (PulseaudioNotify *notify)
   gdouble      volume;
   gint         volume_i;
   gboolean     muted;
+  gboolean     connected;
   gchar       *title = NULL;
   const gchar *icon = NULL;
 
@@ -158,14 +159,22 @@ pulseaudio_notify_notify (PulseaudioNotify *notify)
 
   volume = pulseaudio_volume_get_volume (notify->volume);
   muted = pulseaudio_volume_get_muted (notify->volume);
+  connected = pulseaudio_volume_get_connected (notify->volume);
   volume_i = (gint) round (volume * 100);
 
-  if (muted)
+  if (!connected)
+    volume_i = 0;
+
+  if (!connected)
+    title = g_strdup_printf ( _("Not connected to the PulseAudio server"));
+  else if (muted)
     title = g_strdup_printf ( _("Volume %d%c (muted)"), volume_i, '%');
   else
     title = g_strdup_printf ( _("Volume %d%c"), volume_i, '%');
 
-  if (muted)
+  if (!connected)
+    icon = icons[V_MUTED];
+  else if (muted)
     icon = icons[V_MUTED];
   else if (volume <= 0.0)
     icon = icons[V_MUTED];
diff --git a/panel-plugin/pulseaudio-volume.c b/panel-plugin/pulseaudio-volume.c
index 72f3cfc..7c38093 100644
--- a/panel-plugin/pulseaudio-volume.c
+++ b/panel-plugin/pulseaudio-volume.c
@@ -37,12 +37,13 @@
 #include "pulseaudio-volume.h"
 
 
-static void                 pulseaudio_volume_finalize        (GObject            *object);
-static void                 pulseaudio_volume_connect         (PulseaudioVolume   *volume);
-static gdouble              pulseaudio_volume_v2d             (PulseaudioVolume   *volume,
-                                                               pa_volume_t         vol);
-static pa_volume_t          pulseaudio_volume_d2v             (PulseaudioVolume   *volume,
-                                                               gdouble             vol);
+static void                 pulseaudio_volume_finalize           (GObject            *object);
+static void                 pulseaudio_volume_connect            (PulseaudioVolume   *volume);
+static gdouble              pulseaudio_volume_v2d                (PulseaudioVolume   *volume,
+                                                                  pa_volume_t         vol);
+static pa_volume_t          pulseaudio_volume_d2v                (PulseaudioVolume   *volume,
+                                                                  gdouble             vol);
+static gboolean             pulseaudio_volume_reconnect_timeout  (gpointer            userdata);
 
 
 struct _PulseaudioVolume
@@ -61,7 +62,7 @@ struct _PulseaudioVolume
   gdouble               volume_mic;
   gboolean              muted_mic;
 
-
+  guint                 reconnect_timer_id;
 };
 
 struct _PulseaudioVolumeClass
@@ -111,6 +112,7 @@ pulseaudio_volume_init (PulseaudioVolume *volume)
   volume->connected = FALSE;
   volume->volume = 0.0;
   volume->muted = FALSE;
+  volume->reconnect_timer_id = 0;
 
   volume->pa_mainloop = pa_glib_mainloop_new (NULL);
 
@@ -146,8 +148,9 @@ pulseaudio_volume_sink_info_cb (pa_context         *context,
 
   PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata);
   if (i == NULL) return;
+  pulseaudio_debug ("sink info: %s, %s", i->name, i->description);
 
-  muted = (gboolean) i->mute;
+  muted = !!(i->mute);
   vol = pulseaudio_volume_v2d (volume, i->volume.values[0]);
 
   if (volume->muted != muted)
@@ -163,6 +166,7 @@ pulseaudio_volume_sink_info_cb (pa_context         *context,
       volume->volume = vol;
       g_signal_emit (G_OBJECT (volume), pulseaudio_volume_signals [VOLUME_CHANGED], 0);
     }
+  pulseaudio_debug ("volume: %f, muted: %d", vol, muted);
 }
 
 
@@ -175,7 +179,7 @@ pulseaudio_volume_server_info_cb (pa_context           *context,
   PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata);
   if (i == NULL) return;
 
-  pulseaudio_debug ("default sink name = %s\n", i->default_sink_name);
+  pulseaudio_debug ("server: %s@%s, v.%s", i->user_name, i->server_name, i->server_version);
   pa_context_get_sink_info_by_name (context, i->default_sink_name, pulseaudio_volume_sink_info_cb, volume);
 }
 
@@ -206,19 +210,19 @@ pulseaudio_volume_subscribe_cb (pa_context                   *context,
     {
     case PA_SUBSCRIPTION_EVENT_SINK          :
       pulseaudio_volume_sink_check (volume, context);
-      pulseaudio_debug ("PulseAudio sink event");
+      pulseaudio_debug ("received sink event");
       break;
 
     case PA_SUBSCRIPTION_EVENT_SOURCE        :
-      pulseaudio_debug ("PulseAudio source event");
+      pulseaudio_debug ("received source event");
       break;
 
     case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT :
-      pulseaudio_debug ("PulseAudio source output event");
+      pulseaudio_debug ("received source output event");
       break;
 
     default                                  :
-      pulseaudio_debug ("Unknown PulseAudio event");
+      pulseaudio_debug ("received unknown pulseaudio event");
       break;
     }
 }
@@ -240,13 +244,22 @@ pulseaudio_volume_context_state_cb (pa_context *context,
 
       pulseaudio_debug ("PulseAudio connection established");
       volume->connected = TRUE;
+      // Check current sink volume manually. PA sink events usually not emitted.
       pulseaudio_volume_sink_check (volume, context);
+      g_signal_emit (G_OBJECT (volume), pulseaudio_volume_signals [VOLUME_CHANGED], 0);
       break;
 
     case PA_CONTEXT_FAILED       :
     case PA_CONTEXT_TERMINATED   :
-      g_warning ("Disconected from PulseAudio server.");
+      g_warning ("Disconected from the PulseAudio server. Attempting to reconnect in 5 seconds.");
       volume->pa_context = NULL;
+      volume->connected = FALSE;
+      volume->volume = 0.0;
+      volume->muted = FALSE;
+      g_signal_emit (G_OBJECT (volume), pulseaudio_volume_signals [VOLUME_CHANGED], 0);
+      if (volume->reconnect_timer_id == 0)
+        volume->reconnect_timer_id = g_timeout_add_seconds
+          (5, pulseaudio_volume_reconnect_timeout, volume);
       break;
 
     case PA_CONTEXT_CONNECTING   :
@@ -302,6 +315,31 @@ pulseaudio_volume_connect (PulseaudioVolume *volume)
 
 
 
+static gboolean
+pulseaudio_volume_reconnect_timeout  (gpointer userdata)
+{
+  PulseaudioVolume *volume = PULSEAUDIO_VOLUME (userdata);
+
+  volume->reconnect_timer_id = 0;
+  pulseaudio_volume_connect (volume);
+
+  return FALSE; // stop the timer
+}
+
+
+
+
+
+gboolean
+pulseaudio_volume_get_connected (PulseaudioVolume *volume)
+{
+  g_return_val_if_fail (IS_PULSEAUDIO_VOLUME (volume), FALSE);
+
+  return volume->connected;
+}
+
+
+
 static gdouble
 pulseaudio_volume_v2d (PulseaudioVolume *volume,
                        pa_volume_t       pa_volume)
diff --git a/panel-plugin/pulseaudio-volume.h b/panel-plugin/pulseaudio-volume.h
index 92c4da1..3c6397e 100644
--- a/panel-plugin/pulseaudio-volume.h
+++ b/panel-plugin/pulseaudio-volume.h
@@ -37,6 +37,8 @@ GType                   pulseaudio_volume_get_type        (void) G_GNUC_CONST;
 
 PulseaudioVolume       *pulseaudio_volume_new             (PulseaudioConfig *config);
 
+gboolean                pulseaudio_volume_get_connected   (PulseaudioVolume *volume);
+
 gdouble                 pulseaudio_volume_get_volume      (PulseaudioVolume *volume);
 void                    pulseaudio_volume_set_volume      (PulseaudioVolume *volume,
                                                            gdouble           vol);

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


More information about the Xfce4-commits mailing list