aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/output_all.c12
-rw-r--r--src/output_all.h11
-rw-r--r--src/player_thread.c12
3 files changed, 25 insertions, 10 deletions
diff --git a/src/output_all.c b/src/output_all.c
index 2e7d3a72..870d8aed 100644
--- a/src/output_all.c
+++ b/src/output_all.c
@@ -408,6 +408,18 @@ audio_output_all_check(void)
return 0;
}
+bool
+audio_output_all_wait(unsigned threshold)
+{
+ if (audio_output_all_check() < threshold)
+ return true;
+
+ /* XXX synchronize in a better way */
+ g_usleep(1000);
+
+ return audio_output_all_check() < threshold;
+}
+
void
audio_output_all_pause(void)
{
diff --git a/src/output_all.h b/src/output_all.h
index 197a0bfd..2a09514b 100644
--- a/src/output_all.h
+++ b/src/output_all.h
@@ -105,6 +105,17 @@ unsigned
audio_output_all_check(void);
/**
+ * Checks if the size of the #music_pipe is below the #threshold. If
+ * not, it attempts to synchronize with all output threads, and waits
+ * until another #music_chunk is finished.
+ *
+ * @param threshold the maximum number of chunks in the pipe
+ * @return true if there are less than #threshold chunks in the pipe
+ */
+bool
+audio_output_all_wait(unsigned threshold);
+
+/**
* Puts all audio outputs into pause mode. Most implementations will
* simply close it then.
*/
diff --git a/src/player_thread.c b/src/player_thread.c
index 59443696..84487c7b 100644
--- a/src/player_thread.c
+++ b/src/player_thread.c
@@ -192,14 +192,10 @@ player_check_decoder_startup(struct player *player)
/* the decoder is ready and ok */
if (audio_format_defined(&player->play_audio_format) &&
- audio_output_all_check() > 0) {
+ !audio_output_all_wait(1))
/* the output devices havn't finished playing
all chunks yet - wait for that */
-
- /* XXX synchronize in a better way */
- g_usleep(1000);
return true;
- }
player->decoder_starting = false;
@@ -479,14 +475,10 @@ play_next_chunk(struct player *player)
unsigned cross_fade_position;
bool success;
- if (audio_output_all_check() >= 64) {
+ if (!audio_output_all_wait(64))
/* the output pipe is still large enough, don't send
another chunk */
-
- /* XXX synchronize in a better way */
- g_usleep(1000);
return true;
- }
if (player->xfade == XFADE_ENABLED &&
dc.pipe != NULL && dc.pipe != player->pipe &&