diff options
-rw-r--r-- | src/player_thread.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/player_thread.c b/src/player_thread.c index 9b9787261..2a3580da6 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -459,6 +459,24 @@ play_next_chunk(struct player *player) return true; } +/** + * This is called at the border between two songs: the audio output + * has consumed all chunks of the current song, and we should start + * sending chunks from the next one. + * + * @return true on success, false on error (playback will be stopped) + */ +static bool +player_song_border(struct player *player) +{ + player->xfade = XFADE_UNKNOWN; + + music_pipe_free(player->pipe); + player->pipe = dc.pipe; + + return player_wait_for_decoder(player); +} + static void do_play(void) { struct player player = { @@ -572,12 +590,7 @@ static void do_play(void) } else if (dc.pipe != NULL && dc.pipe != player.pipe) { /* at the beginning of a new song */ - player.xfade = XFADE_UNKNOWN; - - music_pipe_free(player.pipe); - player.pipe = dc.pipe; - - if (!player_wait_for_decoder(&player)) + if (!player_song_border(&player)) break; } else if (decoder_is_idle()) { break; |