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:
parent
1350cd0e42
commit
78fa3f06f9
|
@ -82,26 +82,13 @@ audio_output_open(struct audio_output *ao,
|
||||||
ao->in_audio_format = *audio_format;
|
ao->in_audio_format = *audio_format;
|
||||||
ao->chunk = NULL;
|
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;
|
ao->pipe = mp;
|
||||||
|
|
||||||
if (ao->thread == NULL)
|
if (ao->thread == NULL)
|
||||||
audio_output_thread_start(ao);
|
audio_output_thread_start(ao);
|
||||||
|
|
||||||
|
ao_command(ao, ao->open ? AO_COMMAND_REOPEN : AO_COMMAND_OPEN);
|
||||||
open = ao->open;
|
open = ao->open;
|
||||||
if (!open) {
|
|
||||||
ao_command(ao, AO_COMMAND_OPEN);
|
|
||||||
open = ao->open;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (open && ao->mixer != NULL)
|
if (open && ao->mixer != NULL)
|
||||||
mixer_open(ao->mixer);
|
mixer_open(ao->mixer);
|
||||||
|
|
|
@ -29,6 +29,13 @@
|
||||||
enum audio_output_command {
|
enum audio_output_command {
|
||||||
AO_COMMAND_NONE = 0,
|
AO_COMMAND_NONE = 0,
|
||||||
AO_COMMAND_OPEN,
|
AO_COMMAND_OPEN,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This command is invoked when the input audio format
|
||||||
|
* changes.
|
||||||
|
*/
|
||||||
|
AO_COMMAND_REOPEN,
|
||||||
|
|
||||||
AO_COMMAND_CLOSE,
|
AO_COMMAND_CLOSE,
|
||||||
AO_COMMAND_PAUSE,
|
AO_COMMAND_PAUSE,
|
||||||
AO_COMMAND_CANCEL,
|
AO_COMMAND_CANCEL,
|
||||||
|
|
|
@ -105,6 +105,26 @@ ao_close(struct audio_output *ao)
|
||||||
g_debug("closed plugin=%s name=\"%s\"", ao->plugin->name, ao->name);
|
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
|
static bool
|
||||||
ao_play_chunk(struct audio_output *ao, const struct music_chunk *chunk)
|
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);
|
ao_command_finished(ao);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AO_COMMAND_REOPEN:
|
||||||
|
ao_reopen(ao);
|
||||||
|
ao_command_finished(ao);
|
||||||
|
break;
|
||||||
|
|
||||||
case AO_COMMAND_CLOSE:
|
case AO_COMMAND_CLOSE:
|
||||||
assert(ao->open);
|
assert(ao->open);
|
||||||
assert(ao->pipe != NULL);
|
assert(ao->pipe != NULL);
|
||||||
|
|
Loading…
Reference in New Issue