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().
This commit is contained in:
Max Kellermann 2009-01-30 20:12:38 +01:00
parent 6aa734dc35
commit 231636b9eb
4 changed files with 18 additions and 24 deletions

View File

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

View File

@ -19,14 +19,7 @@
#include "output_api.h"
#include "output_internal.h"
#include <assert.h>
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;
}

View File

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

View File

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