From c2bc3704e1fc40107cffa550bb1475655a634c06 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
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
 {