output/Thread: wake up the player thread periodically while playing

Without this, the pipe would run empty very often, which may result in
an xrun if the roundtrip to the PlayerThread and back takes too long.
By waking up the PlayerThread before the pipe runs empty, we make MPD
much more latency tolerant, which is a major optimization.
This commit is contained in:
Max Kellermann
2016-12-13 22:39:20 +01:00
parent add42e9edf
commit a9d7293818
2 changed files with 12 additions and 0 deletions

View File

@@ -493,10 +493,21 @@ AudioOutput::Play()
in_playback_loop = false;
};
unsigned n = 0;
do {
if (command != Command::NONE)
return true;
if (++n >= 64) {
/* wake up the player every now and then to
give it a chance to refill the pipe before
it runs empty */
const ScopeUnlock unlock(mutex);
player_control->LockSignal();
n = 0;
}
if (!PlayChunk(chunk))
break;