diff options
-rw-r--r-- | src/pipe.h | 27 | ||||
-rw-r--r-- | src/player_thread.c | 14 |
2 files changed, 33 insertions, 8 deletions
diff --git a/src/pipe.h b/src/pipe.h index 10a3501ec..3af0bbd16 100644 --- a/src/pipe.h +++ b/src/pipe.h @@ -76,12 +76,30 @@ void music_pipe_flush(void); */ void music_pipe_set_lazy(bool lazy); +static inline unsigned +music_pipe_size(void) +{ + return ob.size; +} + /** is the buffer empty? */ static inline bool music_pipe_is_empty(void) { return ob.begin == ob.end; } +static inline bool +music_pipe_head_is(unsigned i) +{ + return !music_pipe_is_empty() && ob.begin == i; +} + +static inline unsigned +music_pipe_tail_index(void) +{ + return ob.end; +} + void music_pipe_shift(void); /** @@ -102,6 +120,15 @@ int music_pipe_absolute(const unsigned relative); struct music_chunk * music_pipe_get_chunk(const unsigned i); +static inline struct music_chunk * +music_pipe_peek(void) +{ + if (music_pipe_is_empty()) + return NULL; + + return music_pipe_get_chunk(ob.begin); +} + /** * Append a data block to the buffer. * diff --git a/src/player_thread.c b/src/player_thread.c index e1f11652e..3a378b069 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -330,7 +330,7 @@ static void do_play(void) assert(pc.next_song != NULL); player.queued = false; - player.next_song_chunk = ob.end; + player.next_song_chunk = music_pipe_tail_index(); dc_start_async(pc.next_song); } if (player.next_song_chunk >= 0 && @@ -342,7 +342,7 @@ static void do_play(void) crossFadeChunks = cross_fade_calc(pc.crossFade, dc.totalTime, &dc.out_audio_format, - ob.size - + music_pipe_size() - pc.buffered_before_play); if (crossFadeChunks > 0) { player.xfade = XFADE_ENABLED; @@ -356,9 +356,8 @@ static void do_play(void) if (player.paused) notify_wait(&pc.notify); else if (!music_pipe_is_empty() && - (int)ob.begin != player.next_song_chunk) { - struct music_chunk *beginChunk = - music_pipe_get_chunk(ob.begin); + !music_pipe_head_is(player.next_song_chunk)) { + struct music_chunk *beginChunk = music_pipe_peek(); unsigned int fadePosition; if (player.xfade == XFADE_ENABLED && player.next_song_chunk >= 0 && @@ -409,10 +408,9 @@ static void do_play(void) decoder gets woken up with each chunk; it is more efficient to make it decode a larger block at a time */ - if (music_pipe_available() <= (pc.buffered_before_play + ob.size * 3) / 4) + if (music_pipe_available() <= (pc.buffered_before_play + music_pipe_size() * 3) / 4) notify_signal(&dc.notify); - } else if (!music_pipe_is_empty() && - (int)ob.begin == player.next_song_chunk) { + } else if (music_pipe_head_is(player.next_song_chunk)) { /* at the beginning of a new song */ if (player.xfade == XFADE_ENABLED && nextChunk >= 0) { |