diff options
author | Max Kellermann <max@musicpd.org> | 2021-03-10 20:39:54 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2021-03-10 20:43:28 +0100 |
commit | 77fe727e696099ca65553f5c8d49f719b8d16678 (patch) | |
tree | dbc2ee4fa83c5f1c6dbe020d87056b26cbb00cb6 /src/output | |
parent | 73f9824ddf7c7a917b89f0bb500985c15273530d (diff) |
output/wasapi: move the "is_started" flag to class WasapiOutputThread
Diffstat (limited to 'src/output')
-rw-r--r-- | src/output/plugins/wasapi/WasapiOutputPlugin.cxx | 52 |
1 files 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<void> input) noexcept { - return spsc_buffer.push(static_cast<const BYTE *>(input.data), - input.size); + std::size_t consumed = + spsc_buffer.push(static_cast<const BYTE *>(input.data), + input.size); + + if (!playing) { + playing = true; + Play(); + } + + return consumed; } /** @@ -262,11 +290,6 @@ class WasapiOutput final : public AudioOutput { /** * Only valid if the output is open. */ - bool is_started; - - /** - * Only valid if the output is open. - */ bool paused; std::atomic_flag not_interrupted = true; @@ -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; } |