From 77fe727e696099ca65553f5c8d49f719b8d16678 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 10 Mar 2021 20:39:54 +0100 Subject: [PATCH] output/wasapi: move the "is_started" flag to class WasapiOutputThread --- .../plugins/wasapi/WasapiOutputPlugin.cxx | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/output/plugins/wasapi/WasapiOutputPlugin.cxx b/src/output/plugins/wasapi/WasapiOutputPlugin.cxx index 5e0226930..203896c7a 100644 --- a/src/output/plugins/wasapi/WasapiOutputPlugin.cxx +++ b/src/output/plugins/wasapi/WasapiOutputPlugin.cxx @@ -167,6 +167,16 @@ class WasapiOutputThread { const UINT32 buffer_size_in_frames; const bool is_exclusive; + /** + * This flag is only used by the calling thread + * (i.e. #OutputThread), and specifies whether the + * WasapiOutputThread has been told to play via Play(). This + * variable is somewhat redundant because we already have + * "state", but using this variable saves some overhead for + * atomic operations. + */ + bool playing = false; + bool started = false; std::atomic_bool cancel = false; @@ -200,12 +210,30 @@ public: thread.Join(); } - void Play() noexcept { return SetStatus(Status::PLAY); } - void Pause() noexcept { return SetStatus(Status::PAUSE); } + void Play() noexcept { + playing = true; + SetStatus(Status::PLAY); + } + + void Pause() noexcept { + if (!playing) + return; + + playing = false; + SetStatus(Status::PAUSE); + } std::size_t Push(ConstBuffer input) noexcept { - return spsc_buffer.push(static_cast(input.data), - input.size); + std::size_t consumed = + spsc_buffer.push(static_cast(input.data), + input.size); + + if (!playing) { + playing = true; + Play(); + } + + return consumed; } /** @@ -259,11 +287,6 @@ class WasapiOutput final : public AudioOutput { const bool dop_setting; #endif - /** - * Only valid if the output is open. - */ - bool is_started; - /** * Only valid if the output is open. */ @@ -625,7 +648,6 @@ WasapiOutput::DoOpen(AudioFormat &audio_format) thread.emplace(*client, std::move(render_client), FrameSize(), buffer_size_in_frames, is_exclusive); - is_started = false; paused = false; } @@ -678,11 +700,6 @@ WasapiOutput::Play(const void *chunk, size_t size) do { const size_t consumed_size = thread->Push({chunk, size}); - if (!is_started) { - is_started = true; - thread->Play(); - } - if (consumed_size == 0) { thread->Wait(); thread->CheckException(); @@ -705,10 +722,7 @@ bool WasapiOutput::Pause() { paused = true; - if (is_started) { - thread->Pause(); - is_started = false; - } + thread->Pause(); thread->CheckException(); return true; }