From c2bc3704e1fc40107cffa550bb1475655a634c06 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 15 Feb 2021 14:27:19 +0100 Subject: [PATCH] output/pulse: move code to virtual method Drain() Drain only if it was requested explicitly. --- src/output/plugins/PulseOutputPlugin.cxx | 29 +++++++++++++++--------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/output/plugins/PulseOutputPlugin.cxx b/src/output/plugins/PulseOutputPlugin.cxx index c615853d6..a76562fef 100644 --- a/src/output/plugins/PulseOutputPlugin.cxx +++ b/src/output/plugins/PulseOutputPlugin.cxx @@ -111,6 +111,7 @@ public: [[nodiscard]] std::chrono::steady_clock::duration Delay() const noexcept override; size_t Play(const void *chunk, size_t size) override; + void Drain() override; void Cancel() noexcept override; bool Pause() override; @@ -696,17 +697,6 @@ PulseOutput::Close() noexcept Pulse::LockGuard lock(mainloop); - if (pa_stream_get_state(stream) == PA_STREAM_READY) { - pa_operation *o = - pa_stream_drain(stream, - pulse_output_stream_success_cb, this); - if (o == nullptr) { - LogPulseError(context, - "pa_stream_drain() has failed"); - } else - pulse_wait_for_operation(mainloop, o); - } - DeleteStream(); if (context != nullptr && @@ -835,6 +825,23 @@ PulseOutput::Play(const void *chunk, size_t size) return size; } +void +PulseOutput::Drain() +{ + Pulse::LockGuard lock(mainloop); + + if (pa_stream_get_state(stream) != PA_STREAM_READY) + return; + + pa_operation *o = + pa_stream_drain(stream, + pulse_output_stream_success_cb, this); + if (o == nullptr) + throw MakePulseError(context, "pa_stream_drain() failed"); + + pulse_wait_for_operation(mainloop, o); +} + void PulseOutput::Cancel() noexcept {