output: added command REOPEN

REOPEN is called when the input audio format changes.  The output
thread may be reconfigure the PCM converter.
This commit is contained in:
Max Kellermann 2009-07-06 10:01:02 +02:00
parent 1350cd0e42
commit 78fa3f06f9
3 changed files with 33 additions and 14 deletions

View File

@ -82,26 +82,13 @@ audio_output_open(struct audio_output *ao,
ao->in_audio_format = *audio_format;
ao->chunk = NULL;
if (!ao->config_audio_format) {
if (ao->open)
audio_output_close(ao);
/* 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;
}
ao->pipe = mp;
if (ao->thread == NULL)
audio_output_thread_start(ao);
ao_command(ao, ao->open ? AO_COMMAND_REOPEN : AO_COMMAND_OPEN);
open = ao->open;
if (!open) {
ao_command(ao, AO_COMMAND_OPEN);
open = ao->open;
}
if (open && ao->mixer != NULL)
mixer_open(ao->mixer);

View File

@ -29,6 +29,13 @@
enum audio_output_command {
AO_COMMAND_NONE = 0,
AO_COMMAND_OPEN,
/**
* This command is invoked when the input audio format
* changes.
*/
AO_COMMAND_REOPEN,
AO_COMMAND_CLOSE,
AO_COMMAND_PAUSE,
AO_COMMAND_CANCEL,

View File

@ -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);