From c1600bcf3d5af915a2c4d999d92d9418c5058f65 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 23 Sep 2018 15:23:42 +0200 Subject: [PATCH] player/Thread: copy `buffered_before_play` --- src/player/Thread.cxx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index 13477fe0a..017e4c5be 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -78,6 +78,12 @@ class Player { */ std::unique_ptr cross_fade_tag; + /** + * Start playback as soon as this number of chunks has been + * pushed to the decoder pipe. + */ + const unsigned buffer_before_play; + /** * If the decoder pipe gets consumed below this threshold, * it's time to wake up the decoder. @@ -89,7 +95,7 @@ class Player { const unsigned decoder_wakeup_threshold; /** - * are we waiting for buffered_before_play? + * Are we waiting for #buffer_before_play? */ bool buffering = true; @@ -185,6 +191,7 @@ public: Player(PlayerControl &_pc, DecoderControl &_dc, MusicBuffer &_buffer) noexcept :pc(_pc), dc(_dc), buffer(_buffer), + buffer_before_play(pc.buffered_before_play), decoder_wakeup_threshold(buffer.GetSize() * 3 / 4) { } @@ -954,7 +961,7 @@ Player::Run() noexcept until the buffer is large enough, to prevent stuttering on slow machines */ - if (pipe->GetSize() < pc.buffered_before_play && + if (pipe->GetSize() < buffer_before_play && !dc.IsIdle() && !buffer.IsFull()) { /* not enough decoded buffer space yet */ @@ -1002,7 +1009,7 @@ Player::Run() noexcept dc.out_audio_format, play_audio_format, buffer.GetSize() - - pc.buffered_before_play); + buffer_before_play); if (cross_fade_chunks > 0) xfade_state = CrossFadeState::ENABLED; else