[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