aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Guibert <david.guibert@gmail.com>2009-03-07 19:49:00 +0100
committerMax Kellermann <max@duempel.org>2009-03-07 19:55:09 +0100
commit498ec26f25e11cf5eefd86dd4abebbf3722dc999 (patch)
treee06215feb49d1425dfb89049d182005b4ce89959 /src
parenta1534ba7c2691c0bb81c3b288fc76cf31c6b48c9 (diff)
downloadmpd-498ec26f25e11cf5eefd86dd4abebbf3722dc999.tar.gz
mpd-498ec26f25e11cf5eefd86dd4abebbf3722dc999.tar.xz
mpd-498ec26f25e11cf5eefd86dd4abebbf3722dc999.zip
pulse_mixer: allow mpd to reconnect to the pulse mixer
This patch follows the commit 21bb10f4b. >From Max Kellermann: > I removed the daemonization changes in main.c. Please explain why you > changed that. If you need it for some reason, make that a separate > patch with a good description of your rationale. > That's the biggest flaw of your code: it opens the mixer device in the > init() method, while the open() method is empty. When the pulse > daemon is not available (either during MPD startup or when it dies > while MPD runs), the plugin will not even attempt to reconnect to > pulse. Please move the code to the open() method, to make that work. I changed the daemonize call as the fork losts the connection to the pulse server. According to your remark, the init() method should be moved to the open() ones. With the modification, mpd is able to reconnect the pulse mixer after restarting the pulseaudio daemon. Signed-off-by: David Guibert <david.guibert@gmail.com> Signed-off-by: Max Kellermann <max@duempel.org>
Diffstat (limited to 'src')
-rw-r--r--src/mixer/pulse_mixer.c53
1 files changed, 24 insertions, 29 deletions
diff --git a/src/mixer/pulse_mixer.c b/src/mixer/pulse_mixer.c
index d0422294e..d00a36a25 100644
--- a/src/mixer/pulse_mixer.c
+++ b/src/mixer/pulse_mixer.c
@@ -175,19 +175,35 @@ pulse_mixer_init(const struct config_param *param)
pm->output_name = param != NULL
? config_dup_block_string(param, "name", NULL) : NULL;
- g_debug("init");
+ return &pm->base;
+}
+
+static void
+pulse_mixer_finish(struct mixer *data)
+{
+ struct pulse_mixer *pm = (struct pulse_mixer *) data;
+ pm->context = NULL;
+ pm->mainloop = NULL;
+ pm->volume = NULL;
+ pm->online = false;
+ g_free(pm);
+}
+
+static bool
+pulse_mixer_open(G_GNUC_UNUSED struct mixer *data)
+{
+ struct pulse_mixer *pm = (struct pulse_mixer *) data;
+ g_debug("pulse mixer open");
if(!(pm->mainloop = pa_threaded_mainloop_new())) {
g_debug("failed mainloop");
- g_free(pm);
- return NULL;
+ return false;
}
if(!(pm->context = pa_context_new(pa_threaded_mainloop_get_api(pm->mainloop),
"Mixer mpd"))) {
g_debug("failed context");
- g_free(pm);
- return NULL;
+ return false;
}
pa_context_set_state_callback(pm->context, context_state_cb, pm);
@@ -195,45 +211,24 @@ pulse_mixer_init(const struct config_param *param)
if (pa_context_connect(pm->context, pm->server,
(pa_context_flags_t)0, NULL) < 0) {
g_debug("context server fail");
- g_free(pm);
- return NULL;
+ return false;
}
pa_threaded_mainloop_lock(pm->mainloop);
if (pa_threaded_mainloop_start(pm->mainloop) < 0) {
g_debug("error start mainloop");
- g_free(pm);
- return NULL;
+ return false;
}
pa_threaded_mainloop_wait(pm->mainloop);
if (pa_context_get_state(pm->context) != PA_CONTEXT_READY) {
g_debug("error context not ready");
- g_free(pm);
- return NULL;
+ return false;
}
pa_threaded_mainloop_unlock(pm->mainloop);
- return &pm->base ;
-}
-
-static void
-pulse_mixer_finish(struct mixer *data)
-{
- struct pulse_mixer *pm = (struct pulse_mixer *) data;
- pm->context = NULL;
- pm->mainloop = NULL;
- pm->volume = NULL;
- pm->online = false;
- g_free(pm);
-}
-
-static bool
-pulse_mixer_open(G_GNUC_UNUSED struct mixer *data)
-{
- g_debug("pulse mixer open");
return true;
}