summaryrefslogtreecommitdiff
path: root/src/output
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2021-03-10 20:39:54 +0100
committerMax Kellermann <max@musicpd.org>2021-03-10 20:43:28 +0100
commit77fe727e696099ca65553f5c8d49f719b8d16678 (patch)
treedbc2ee4fa83c5f1c6dbe020d87056b26cbb00cb6 /src/output
parent73f9824ddf7c7a917b89f0bb500985c15273530d (diff)
output/wasapi: move the "is_started" flag to class WasapiOutputThread
Diffstat (limited to 'src/output')
-rw-r--r--src/output/plugins/wasapi/WasapiOutputPlugin.cxx52
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;
}