output: always call cancel() before stop()
Stopping an audio output device without cancelling its buffer doesn't make sense. Combine the two operations, which saves several cancel calls.
This commit is contained in:
parent
07bb46de88
commit
678314534a
11
src/audio.c
11
src/audio.c
@ -193,12 +193,6 @@ isCurrentAudioFormat(const struct audio_format *audioFormat)
|
||||
return audio_format_equals(audioFormat, &input_audio_format);
|
||||
}
|
||||
|
||||
static void audio_output_wait(struct audio_output *ao)
|
||||
{
|
||||
while (!audio_output_command_is_finished(ao))
|
||||
notify_wait(&audio_output_client_notify);
|
||||
}
|
||||
|
||||
static void audio_output_wait_all(void)
|
||||
{
|
||||
unsigned i;
|
||||
@ -230,11 +224,8 @@ static void syncAudioDeviceStates(void)
|
||||
audioOutput = &audioOutputArray[i];
|
||||
if (audioOutput->enabled)
|
||||
audio_output_open(audioOutput, &input_audio_format);
|
||||
else if (audio_output_is_open(audioOutput)) {
|
||||
audio_output_cancel(audioOutput);
|
||||
audio_output_wait(audioOutput);
|
||||
else if (audio_output_is_open(audioOutput))
|
||||
audio_output_close(audioOutput);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,6 +63,7 @@ static void ao_play(struct audio_output *ao)
|
||||
|
||||
ao->result = ao->plugin->play(ao->data, data, size);
|
||||
if (!ao->result) {
|
||||
ao->plugin->cancel(ao->data);
|
||||
ao->plugin->close(ao->data);
|
||||
ao->open = false;
|
||||
}
|
||||
@ -72,6 +73,8 @@ static void ao_play(struct audio_output *ao)
|
||||
|
||||
static void ao_pause(struct audio_output *ao)
|
||||
{
|
||||
ao->plugin->cancel(ao->data);
|
||||
|
||||
if (ao->plugin->pause != NULL) {
|
||||
/* pause is supported */
|
||||
ao_command_finished(ao);
|
||||
@ -107,6 +110,7 @@ static void *audio_output_task(void *arg)
|
||||
|
||||
case AO_COMMAND_CLOSE:
|
||||
assert(ao->open);
|
||||
ao->plugin->cancel(ao->data);
|
||||
ao->plugin->close(ao->data);
|
||||
ao->open = false;
|
||||
ao_command_finished(ao);
|
||||
|
@ -152,7 +152,6 @@ static void processDecodeInput(struct player *player)
|
||||
case PLAYER_COMMAND_PAUSE:
|
||||
player->paused = !player->paused;
|
||||
if (player->paused) {
|
||||
dropBufferedAudio();
|
||||
audio_output_pause_all();
|
||||
pc.state = PLAYER_STATE_PAUSE;
|
||||
} else {
|
||||
@ -298,10 +297,9 @@ static void do_play(void)
|
||||
break;
|
||||
}
|
||||
|
||||
if (player.paused) {
|
||||
dropBufferedAudio();
|
||||
if (player.paused)
|
||||
closeAudioDevice();
|
||||
}
|
||||
|
||||
pc.totalTime = dc.totalTime;
|
||||
pc.audio_format = dc.audioFormat;
|
||||
play_audio_format = ob.audioFormat;
|
||||
|
Loading…
Reference in New Issue
Block a user