Commit 67831453 authored by Max Kellermann's avatar Max Kellermann

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.
parent 07bb46de
...@@ -193,12 +193,6 @@ isCurrentAudioFormat(const struct audio_format *audioFormat) ...@@ -193,12 +193,6 @@ isCurrentAudioFormat(const struct audio_format *audioFormat)
return audio_format_equals(audioFormat, &input_audio_format); 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) static void audio_output_wait_all(void)
{ {
unsigned i; unsigned i;
...@@ -230,11 +224,8 @@ static void syncAudioDeviceStates(void) ...@@ -230,11 +224,8 @@ static void syncAudioDeviceStates(void)
audioOutput = &audioOutputArray[i]; audioOutput = &audioOutputArray[i];
if (audioOutput->enabled) if (audioOutput->enabled)
audio_output_open(audioOutput, &input_audio_format); audio_output_open(audioOutput, &input_audio_format);
else if (audio_output_is_open(audioOutput)) { else if (audio_output_is_open(audioOutput))
audio_output_cancel(audioOutput);
audio_output_wait(audioOutput);
audio_output_close(audioOutput); audio_output_close(audioOutput);
}
} }
} }
......
...@@ -63,6 +63,7 @@ static void ao_play(struct audio_output *ao) ...@@ -63,6 +63,7 @@ static void ao_play(struct audio_output *ao)
ao->result = ao->plugin->play(ao->data, data, size); ao->result = ao->plugin->play(ao->data, data, size);
if (!ao->result) { if (!ao->result) {
ao->plugin->cancel(ao->data);
ao->plugin->close(ao->data); ao->plugin->close(ao->data);
ao->open = false; ao->open = false;
} }
...@@ -72,6 +73,8 @@ static void ao_play(struct audio_output *ao) ...@@ -72,6 +73,8 @@ static void ao_play(struct audio_output *ao)
static void ao_pause(struct audio_output *ao) static void ao_pause(struct audio_output *ao)
{ {
ao->plugin->cancel(ao->data);
if (ao->plugin->pause != NULL) { if (ao->plugin->pause != NULL) {
/* pause is supported */ /* pause is supported */
ao_command_finished(ao); ao_command_finished(ao);
...@@ -107,6 +110,7 @@ static void *audio_output_task(void *arg) ...@@ -107,6 +110,7 @@ static void *audio_output_task(void *arg)
case AO_COMMAND_CLOSE: case AO_COMMAND_CLOSE:
assert(ao->open); assert(ao->open);
ao->plugin->cancel(ao->data);
ao->plugin->close(ao->data); ao->plugin->close(ao->data);
ao->open = false; ao->open = false;
ao_command_finished(ao); ao_command_finished(ao);
......
...@@ -152,7 +152,6 @@ static void processDecodeInput(struct player *player) ...@@ -152,7 +152,6 @@ static void processDecodeInput(struct player *player)
case PLAYER_COMMAND_PAUSE: case PLAYER_COMMAND_PAUSE:
player->paused = !player->paused; player->paused = !player->paused;
if (player->paused) { if (player->paused) {
dropBufferedAudio();
audio_output_pause_all(); audio_output_pause_all();
pc.state = PLAYER_STATE_PAUSE; pc.state = PLAYER_STATE_PAUSE;
} else { } else {
...@@ -298,10 +297,9 @@ static void do_play(void) ...@@ -298,10 +297,9 @@ static void do_play(void)
break; break;
} }
if (player.paused) { if (player.paused)
dropBufferedAudio();
closeAudioDevice(); closeAudioDevice();
}
pc.totalTime = dc.totalTime; pc.totalTime = dc.totalTime;
pc.audio_format = dc.audioFormat; pc.audio_format = dc.audioFormat;
play_audio_format = ob.audioFormat; play_audio_format = ob.audioFormat;
......
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