output/Thread: allow Delay() to return duration::max()

Eliminate the periodic wakeups while paused in some output plugins.
This commit is contained in:
Max Kellermann 2024-07-29 16:44:37 +02:00
parent 5b8ef9a62b
commit 12eaaef210
6 changed files with 12 additions and 5 deletions

View File

@ -136,6 +136,10 @@ public:
* instead of doing a sleep inside the plugin, because this
* allows MPD to listen to commands meanwhile.
*
* As a special case, this method is allowed to return
* std::chrono::steady_clock::duration::max() which lets MPD
* sleep forever until a command is received.
*
* @return the duration to wait
*/
virtual std::chrono::steady_clock::duration Delay() const noexcept {

View File

@ -197,7 +197,10 @@ AudioOutputControl::WaitForDelay(std::unique_lock<Mutex> &lock) noexcept
if (delay <= std::chrono::steady_clock::duration::zero())
return true;
(void)wake_cond.wait_for(lock, delay);
if (delay >= std::chrono::steady_clock::duration::max())
wake_cond.wait(lock);
else
(void)wake_cond.wait_for(lock, delay);
if (command != Command::NONE)
return false;

View File

@ -883,7 +883,7 @@ std::chrono::steady_clock::duration
AlsaOutput::Delay() const noexcept
{
if (paused)
return std::chrono::hours{1};
return std::chrono::steady_clock::duration::max();
return AudioOutput::Delay();
}

View File

@ -155,7 +155,7 @@ public:
std::chrono::steady_clock::duration Delay() const noexcept override {
return pause && !LockWasShutdown()
? std::chrono::seconds(1)
? std::chrono::steady_clock::duration::max()
: std::chrono::steady_clock::duration::zero();
}

View File

@ -762,7 +762,7 @@ PulseOutput::Delay() const noexcept
if (pa_stream_is_corked(stream) &&
pa_stream_get_state(stream) == PA_STREAM_READY)
/* idle while paused */
result = std::chrono::seconds(1);
result = std::chrono::steady_clock::duration::max();
return result;
}

View File

@ -684,7 +684,7 @@ WasapiOutput::Delay() const noexcept
{
if (paused) {
// idle while paused
return std::chrono::seconds(1);
return std::chrono::steady_clock::duration::max();
}
return std::chrono::steady_clock::duration::zero();