From 1191025bbfa59f8e3e66110a2b2843bcd11d19fd Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 22 Sep 2018 19:56:00 +0200 Subject: [PATCH] player/Thread: add attribute `decoder_wakeup_threshold` Calculate the value only once. --- src/player/Thread.cxx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index ab0a35141..5b00d2a57 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -78,6 +78,16 @@ class Player { */ std::unique_ptr cross_fade_tag; + /** + * If the decoder pipe gets consumed below this threshold, + * it's time to wake up the decoder. + * + * It is calculated in a way which should prevent a wakeup + * after each single consumed chunk; it is more efficient to + * make the decoder decode a larger block at a time. + */ + const unsigned decoder_wakeup_threshold; + /** * are we waiting for buffered_before_play? */ @@ -174,7 +184,11 @@ class Player { public: Player(PlayerControl &_pc, DecoderControl &_dc, MusicBuffer &_buffer) noexcept - :pc(_pc), dc(_dc), buffer(_buffer) {} + :pc(_pc), dc(_dc), buffer(_buffer), + decoder_wakeup_threshold((pc.buffered_before_play + + buffer.GetSize() * 3) / 4) + { + } private: /** @@ -886,9 +900,7 @@ Player::PlayNextChunk() noexcept /* this formula should prevent that the decoder gets woken up with each chunk; it is more efficient to make it decode a larger block at a time */ - if (!dc.IsIdle() && - dc.pipe->GetSize() <= (pc.buffered_before_play + - buffer.GetSize() * 3) / 4) { + if (!dc.IsIdle() && dc.pipe->GetSize() <= decoder_wakeup_threshold) { if (!decoder_woken) { decoder_woken = true; dc.Signal();