From 933fcf42326972c93dfa840ef06e2639e16cc43d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 25 Mar 2009 18:00:31 +0100 Subject: output_all: moved code to audio_output_all_wait() Synchronization with the output thread will be implemented in output_all.c, not in player_thread.c. Currently, that's just a simple g_usleep(1ms). --- src/output_all.c | 12 ++++++++++++ src/output_all.h | 11 +++++++++++ src/player_thread.c | 12 ++---------- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/output_all.c b/src/output_all.c index 2e7d3a720..870d8aed3 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 197a0bfd2..2a09514b2 100644 --- a/src/output_all.h +++ b/src/output_all.h @@ -104,6 +104,17 @@ audio_output_all_play(struct music_chunk *chunk); 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 59443696c..84487c7bb 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 && -- cgit v1.2.3