aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/output/shout_plugin.c13
-rw-r--r--src/output_api.c7
-rw-r--r--src/output_api.h10
-rw-r--r--src/output_thread.c12
4 files changed, 18 insertions, 24 deletions
diff --git a/src/output/shout_plugin.c b/src/output/shout_plugin.c
index 3fc37225..d2a8db59 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 204fa2de..48f68bb7 100644
--- a/src/output_api.c
+++ b/src/output_api.c
@@ -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;
-}
diff --git a/src/output_api.h b/src/output_api.h
index a5d7e200..c3be48a2 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 66f66e88..883dddca 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);