Commit 498ec26f authored by David Guibert's avatar David Guibert Committed by Max Kellermann

pulse_mixer: allow mpd to reconnect to the pulse mixer

This patch follows the commit 21bb10f4. >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: 's avatarDavid Guibert <david.guibert@gmail.com> Signed-off-by: 's avatarMax Kellermann <max@duempel.org>
parent a1534ba7
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment