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:
parent
add42e9edf
commit
a9d7293818
1
NEWS
1
NEWS
|
@ -52,6 +52,7 @@ ver 0.20 (not yet released)
|
||||||
- soxr: allow multi-threaded resampling
|
- soxr: allow multi-threaded resampling
|
||||||
* player
|
* player
|
||||||
- reset song priority on playback
|
- reset song priority on playback
|
||||||
|
- reduce xruns
|
||||||
* write database and state file atomically
|
* write database and state file atomically
|
||||||
* always write UTF-8 to the log file.
|
* always write UTF-8 to the log file.
|
||||||
* remove dependency on GLib
|
* remove dependency on GLib
|
||||||
|
|
|
@ -493,10 +493,21 @@ AudioOutput::Play()
|
||||||
in_playback_loop = false;
|
in_playback_loop = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
unsigned n = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (command != Command::NONE)
|
if (command != Command::NONE)
|
||||||
return true;
|
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))
|
if (!PlayChunk(chunk))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue