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>
This commit is contained in:
David Guibert 2009-03-07 19:49:00 +01:00 committed by Max Kellermann
parent a1534ba7c2
commit 498ec26f25

View File

@ -175,48 +175,7 @@ pulse_mixer_init(const struct config_param *param)
pm->output_name = param != NULL pm->output_name = param != NULL
? config_dup_block_string(param, "name", NULL) : NULL; ? config_dup_block_string(param, "name", NULL) : NULL;
g_debug("init"); return &pm->base;
if(!(pm->mainloop = pa_threaded_mainloop_new())) {
g_debug("failed mainloop");
g_free(pm);
return NULL;
}
if(!(pm->context = pa_context_new(pa_threaded_mainloop_get_api(pm->mainloop),
"Mixer mpd"))) {
g_debug("failed context");
g_free(pm);
return NULL;
}
pa_context_set_state_callback(pm->context, context_state_cb, pm);
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;
}
pa_threaded_mainloop_lock(pm->mainloop);
if (pa_threaded_mainloop_start(pm->mainloop) < 0) {
g_debug("error start mainloop");
g_free(pm);
return NULL;
}
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;
}
pa_threaded_mainloop_unlock(pm->mainloop);
return &pm->base ;
} }
static void static void
@ -233,7 +192,43 @@ pulse_mixer_finish(struct mixer *data)
static bool static bool
pulse_mixer_open(G_GNUC_UNUSED struct mixer *data) pulse_mixer_open(G_GNUC_UNUSED struct mixer *data)
{ {
struct pulse_mixer *pm = (struct pulse_mixer *) data;
g_debug("pulse mixer open"); g_debug("pulse mixer open");
if(!(pm->mainloop = pa_threaded_mainloop_new())) {
g_debug("failed mainloop");
return false;
}
if(!(pm->context = pa_context_new(pa_threaded_mainloop_get_api(pm->mainloop),
"Mixer mpd"))) {
g_debug("failed context");
return false;
}
pa_context_set_state_callback(pm->context, context_state_cb, pm);
if (pa_context_connect(pm->context, pm->server,
(pa_context_flags_t)0, NULL) < 0) {
g_debug("context server fail");
return false;
}
pa_threaded_mainloop_lock(pm->mainloop);
if (pa_threaded_mainloop_start(pm->mainloop) < 0) {
g_debug("error start mainloop");
return false;
}
pa_threaded_mainloop_wait(pm->mainloop);
if (pa_context_get_state(pm->context) != PA_CONTEXT_READY) {
g_debug("error context not ready");
return false;
}
pa_threaded_mainloop_unlock(pm->mainloop);
return true; return true;
} }