diff --git a/src/output/Control.hxx b/src/output/Control.hxx index dda67ca84..938abf41e 100644 --- a/src/output/Control.hxx +++ b/src/output/Control.hxx @@ -167,6 +167,13 @@ class AudioOutputControl { */ bool woken_for_play = false; + /** + * If this flag is set, then the next WaitForDelay() call is + * skipped. This is used to avoid delays after resuming + * playback. + */ + bool skip_delay; + public: Mutex &mutex; diff --git a/src/output/Thread.cxx b/src/output/Thread.cxx index fab41f563..f2809d99b 100644 --- a/src/output/Thread.cxx +++ b/src/output/Thread.cxx @@ -209,6 +209,7 @@ AudioOutputControl::InternalOpen(const AudioFormat audio_format, { last_error = nullptr; fail_timer.Reset(); + skip_delay = true; try { output->Open(audio_format, pipe); @@ -304,7 +305,9 @@ AudioOutputControl::PlayChunk() noexcept if (data.IsEmpty()) break; - if (!WaitForDelay()) + if (skip_delay) + skip_delay = false; + else if (!WaitForDelay()) break; size_t nbytes; @@ -425,6 +428,8 @@ AudioOutputControl::InternalPause() noexcept } while (command == Command::NONE); output->EndPause(); + + skip_delay = true; } void diff --git a/src/output/plugins/JackOutputPlugin.cxx b/src/output/plugins/JackOutputPlugin.cxx index 8ef88963f..4abc4b057 100644 --- a/src/output/plugins/JackOutputPlugin.cxx +++ b/src/output/plugins/JackOutputPlugin.cxx @@ -129,7 +129,7 @@ struct JackOutput { size_t WriteSamples(const float *src, size_t n_frames); std::chrono::steady_clock::duration Delay() const noexcept { - return base.pause && pause && !shutdown + return pause && !shutdown ? std::chrono::seconds(1) : std::chrono::steady_clock::duration::zero(); }