Commit 77c63511 authored by Max Kellermann's avatar Max Kellermann

PlayerThread: reduce the number of DecoderThread wakeups

After the number of decoded chunks has fallen below the threshold, the PlayerThread woke up the DecoderThread over and over. This commit adds a boolean flag that avoids these duplicate wakeups, and thus reduces the number of system calls.
parent 0be5a6ab
...@@ -69,6 +69,12 @@ class Player { ...@@ -69,6 +69,12 @@ class Player {
bool decoder_starting; bool decoder_starting;
/** /**
* Did we wake up the DecoderThread recently? This avoids
* duplicate wakeup calls.
*/
bool decoder_woken;
/**
* is the player paused? * is the player paused?
*/ */
bool paused; bool paused;
...@@ -133,6 +139,7 @@ public: ...@@ -133,6 +139,7 @@ public:
:pc(_pc), dc(_dc), buffer(_buffer), :pc(_pc), dc(_dc), buffer(_buffer),
buffering(true), buffering(true),
decoder_starting(false), decoder_starting(false),
decoder_woken(false),
paused(false), paused(false),
queued(true), queued(true),
output_open(false), output_open(false),
...@@ -861,8 +868,13 @@ Player::PlayNextChunk() ...@@ -861,8 +868,13 @@ Player::PlayNextChunk()
pc.Lock(); pc.Lock();
if (!dc.IsIdle() && if (!dc.IsIdle() &&
dc.pipe->GetSize() <= (pc.buffered_before_play + dc.pipe->GetSize() <= (pc.buffered_before_play +
buffer.GetSize() * 3) / 4) buffer.GetSize() * 3) / 4) {
dc.Signal(); if (!decoder_woken) {
decoder_woken = true;
dc.Signal();
}
} else
decoder_woken = false;
pc.Unlock(); pc.Unlock();
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment