From 678314534a08dbcbc1c642446f1af899a2108b57 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 29 Oct 2008 22:17:42 +0100 Subject: 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. --- src/audio.c | 11 +---------- src/output_thread.c | 4 ++++ src/player_thread.c | 6 ++---- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/audio.c b/src/audio.c index adc035fd8..5eebc02dd 100644 --- a/src/audio.c +++ b/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); - } } } diff --git a/src/output_thread.c b/src/output_thread.c index 825dfa5f5..28a575a1b 100644 --- a/src/output_thread.c +++ b/src/output_thread.c @@ -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); diff --git a/src/player_thread.c b/src/player_thread.c index 0275b680a..48702b6a3 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -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; -- cgit v1.2.3