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:
Max Kellermann 2008-10-29 22:17:42 +01:00
parent 07bb46de88
commit 678314534a
3 changed files with 7 additions and 14 deletions

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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;