diff options
author | Max Kellermann <max@duempel.org> | 2009-07-06 10:01:02 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-07-06 10:01:02 +0200 |
commit | 78fa3f06f9fadcc274c0a0042d28d59c88bff152 (patch) | |
tree | 75a02c2926fb72fff0b5832dbdfd4430d8a25e87 /src/output_thread.c | |
parent | 1350cd0e42d1860af1149db3e3b4eb3b944779fe (diff) | |
download | mpd-78fa3f06f9fadcc274c0a0042d28d59c88bff152.tar.gz mpd-78fa3f06f9fadcc274c0a0042d28d59c88bff152.tar.xz mpd-78fa3f06f9fadcc274c0a0042d28d59c88bff152.zip |
output: added command REOPEN
REOPEN is called when the input audio format changes. The output
thread may be reconfigure the PCM converter.
Diffstat (limited to 'src/output_thread.c')
-rw-r--r-- | src/output_thread.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/output_thread.c b/src/output_thread.c index 6f9e9586a..b3c134413 100644 --- a/src/output_thread.c +++ b/src/output_thread.c @@ -105,6 +105,26 @@ ao_close(struct audio_output *ao) g_debug("closed plugin=%s name=\"%s\"", ao->plugin->name, ao->name); } +static void +ao_reopen(struct audio_output *ao) +{ + if (!ao->config_audio_format) { + if (ao->open) { + const struct music_pipe *mp = ao->pipe; + ao_close(ao); + ao->pipe = mp; + } + + /* no audio format is configured: copy in->out, let + the output's open() method determine the effective + out_audio_format */ + ao->out_audio_format = ao->in_audio_format; + } + + if (!ao->open) + ao_open(ao); +} + static bool ao_play_chunk(struct audio_output *ao, const struct music_chunk *chunk) { @@ -237,6 +257,11 @@ static gpointer audio_output_task(gpointer arg) ao_command_finished(ao); break; + case AO_COMMAND_REOPEN: + ao_reopen(ao); + ao_command_finished(ao); + break; + case AO_COMMAND_CLOSE: assert(ao->open); assert(ao->pipe != NULL); |