aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-10-29 22:17:42 +0100
committerMax Kellermann <max@duempel.org>2008-10-29 22:17:42 +0100
commit678314534a08dbcbc1c642446f1af899a2108b57 (patch)
tree494d6e0c776bb914b560f29717f19802daefff53 /src
parent07bb46de88a6af3547d40452771e687a45592404 (diff)
downloadmpd-678314534a08dbcbc1c642446f1af899a2108b57.tar.gz
mpd-678314534a08dbcbc1c642446f1af899a2108b57.tar.xz
mpd-678314534a08dbcbc1c642446f1af899a2108b57.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/audio.c11
-rw-r--r--src/output_thread.c4
-rw-r--r--src/player_thread.c6
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;