From 231636b9eb2ecd7d8669d309a74c3a51cd5ddfae Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 30 Jan 2009 20:12:38 +0100 Subject: output_api: moved the command check out of method pause() Move the "while" loop which checks for commands to the caller ao_pause(). This simplifies the pause() method, and lets us remove audio_output_is_pending(). --- src/output/shout_plugin.c | 13 +++---------- src/output_api.c | 7 ------- src/output_api.h | 10 ++++------ src/output_thread.c | 12 +++++++++++- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/output/shout_plugin.c b/src/output/shout_plugin.c index 3fc372250..d2a8db597 100644 --- a/src/output/shout_plugin.c +++ b/src/output/shout_plugin.c @@ -506,19 +506,12 @@ my_shout_play(void *data, const char *chunk, size_t size) return true; } -static void my_shout_pause(void *data) +static bool +my_shout_pause(void *data) { - struct shout_data *sd = (struct shout_data *)data; static const char silence[1020]; - int ret; - /* play silence until the player thread sends us a command */ - - while (sd->opened && !audio_output_is_pending(sd->audio_output)) { - ret = my_shout_play(data, silence, sizeof(silence)); - if (ret != 0) - break; - } + return my_shout_play(data, silence, sizeof(silence)); } static void my_shout_set_tag(void *data, diff --git a/src/output_api.c b/src/output_api.c index 204fa2dec..48f68bb7f 100644 --- a/src/output_api.c +++ b/src/output_api.c @@ -19,14 +19,7 @@ #include "output_api.h" #include "output_internal.h" -#include - const char *audio_output_get_name(const struct audio_output *ao) { return ao->name; } - -bool audio_output_is_pending(const struct audio_output *ao) -{ - return ao->command != AO_COMMAND_NONE; -} diff --git a/src/output_api.h b/src/output_api.h index a5d7e2006..c3be48a27 100644 --- a/src/output_api.h +++ b/src/output_api.h @@ -84,8 +84,11 @@ struct audio_output_plugin { * silence during pause, so their clients won't be * disconnected. Plugins which do not support pausing will * simply be closed, and have to be reopened when unpaused. + * + * @return false on error (output will be closed then), true + * for continue to pause */ - void (*pause)(void *data); + bool (*pause)(void *data); /** * Try to cancel data which may still be in the device's @@ -131,9 +134,4 @@ struct audio_output; const char *audio_output_get_name(const struct audio_output *ao); -/** - * Returns true if there is a command pending. - */ -bool audio_output_is_pending(const struct audio_output *ao); - #endif diff --git a/src/output_thread.c b/src/output_thread.c index 66f66e88c..883dddcaf 100644 --- a/src/output_thread.c +++ b/src/output_thread.c @@ -77,7 +77,17 @@ static void ao_pause(struct audio_output *ao) if (ao->plugin->pause != NULL) { /* pause is supported */ ao_command_finished(ao); - ao->plugin->pause(ao->data); + + do { + bool ret; + + ret = ao->plugin->pause(ao->data); + if (!ret) { + ao->plugin->close(ao->data); + pcm_convert_deinit(&ao->convState); + ao->open = false; + } + } while (ao->command == AO_COMMAND_NONE); } else { /* pause is not supported - simply close the device */ ao->plugin->close(ao->data); -- cgit v1.2.3