From 5cd3a8de103ca75184ad4f40f1ddd947ccca87c5 Mon Sep 17 00:00:00 2001 From: casey langen Date: Fri, 23 Dec 2016 12:53:57 -0800 Subject: [PATCH] Properly implemented play/pause semantics in output plugins (only WaveOut was doing it properly!) --- src/contrib/alsaout/AlsaOut.cpp | 7 +++++++ src/contrib/alsaout/AlsaOut.h | 2 +- src/contrib/coreaudioout/CoreAudioOut.cpp | 7 +++++++ src/contrib/coreaudioout/CoreAudioOut.h | 1 + src/contrib/directsoundout/DirectSoundOut.cpp | 4 ++++ src/contrib/pulseout/PulseOut.cpp | 4 ++++ src/contrib/wasapiout/WasapiOut.cpp | 4 ++++ 7 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/contrib/alsaout/AlsaOut.cpp b/src/contrib/alsaout/AlsaOut.cpp index ce8c2d04a..c5151f309 100755 --- a/src/contrib/alsaout/AlsaOut.cpp +++ b/src/contrib/alsaout/AlsaOut.cpp @@ -79,6 +79,7 @@ AlsaOut::AlsaOut() , rate(44100) , volume(1.0) , quit(false) +, paused(false) , initialized(false) { std::cerr << "AlsaOut::AlsaOut() called" << std::endl; this->writeThread.reset(new boost::thread(boost::bind(&AlsaOut::WriteLoop, this))); @@ -198,6 +199,7 @@ void AlsaOut::Pause() { if (this->pcmHandle) { snd_pcm_pause(this->pcmHandle, 1); + this->paused = true; } } @@ -206,6 +208,7 @@ void AlsaOut::Resume() { if (this->pcmHandle) { snd_pcm_pause(this->pcmHandle, 0); + this->paused = false; NOTIFY(); } } @@ -282,6 +285,10 @@ bool AlsaOut::Play(IBuffer *buffer, IBufferProvider* provider) { { LOCK("play"); + if (this->paused) { + return false; + } + if (this->CountBuffersWithProvider(provider) >= BUFFER_COUNT) { return false; } diff --git a/src/contrib/alsaout/AlsaOut.h b/src/contrib/alsaout/AlsaOut.h index 447648412..55757d945 100755 --- a/src/contrib/alsaout/AlsaOut.h +++ b/src/contrib/alsaout/AlsaOut.h @@ -87,7 +87,7 @@ class AlsaOut : public musik::core::sdk::IOutput { size_t channels; size_t rate; double volume; - volatile bool quit, initialized; + volatile bool quit, paused, initialized; std::unique_ptr writeThread; boost::recursive_mutex stateMutex; diff --git a/src/contrib/coreaudioout/CoreAudioOut.cpp b/src/contrib/coreaudioout/CoreAudioOut.cpp index aad92293f..2b6bd2425 100644 --- a/src/contrib/coreaudioout/CoreAudioOut.cpp +++ b/src/contrib/coreaudioout/CoreAudioOut.cpp @@ -91,6 +91,7 @@ void CoreAudioOut::NotifyBufferCompleted(BufferContext *context) { CoreAudioOut::CoreAudioOut() { this->quit = false; + this->paused = false; this->volume = 1.0f; this->audioFormat = (AudioStreamBasicDescription) { 0 }; @@ -113,6 +114,10 @@ CoreAudioOut::CoreAudioOut() { bool CoreAudioOut::Play(IBuffer *buffer, IBufferProvider *provider) { boost::recursive_mutex::scoped_lock lock(this->mutex); + if (this->paused) { + return false; + } + if (countBuffersWithProvider(this->buffers, provider) >= BUFFER_COUNT) { /* enough buffers are already in the queue. bail, we'll notify the caller when there's more data available */ @@ -206,6 +211,7 @@ void CoreAudioOut::Pause() { if (this->audioQueue) { AudioQueuePause(this->audioQueue); + this->paused = true; } } @@ -214,6 +220,7 @@ void CoreAudioOut::Resume() { if (this->audioQueue) { AudioQueueStart(this->audioQueue, NULL); + this->paused = false; } } diff --git a/src/contrib/coreaudioout/CoreAudioOut.h b/src/contrib/coreaudioout/CoreAudioOut.h index c13652797..756aa390f 100644 --- a/src/contrib/coreaudioout/CoreAudioOut.h +++ b/src/contrib/coreaudioout/CoreAudioOut.h @@ -81,4 +81,5 @@ class CoreAudioOut : public musik::core::sdk::IOutput { boost::thread thread; boost::recursive_mutex mutex; bool quit; + bool paused; }; diff --git a/src/contrib/directsoundout/DirectSoundOut.cpp b/src/contrib/directsoundout/DirectSoundOut.cpp index ff523d05f..15e823134 100644 --- a/src/contrib/directsoundout/DirectSoundOut.cpp +++ b/src/contrib/directsoundout/DirectSoundOut.cpp @@ -155,6 +155,10 @@ bool DirectSoundOut::Play(IBuffer *buffer, IBufferProvider *provider) { { Lock lock(this->stateMutex); + if (this->state == StatePaused) { + return false; + } + if (!this->Configure(buffer)) { this->Reset(); return false; diff --git a/src/contrib/pulseout/PulseOut.cpp b/src/contrib/pulseout/PulseOut.cpp index 0a0b13fbd..716ecb8a7 100755 --- a/src/contrib/pulseout/PulseOut.cpp +++ b/src/contrib/pulseout/PulseOut.cpp @@ -144,6 +144,10 @@ bool PulseOut::Play(IBuffer *buffer, IBufferProvider* provider) { { Lock lock(this->stateMutex); + if (this->state == StatePaused) { + return false; + } + this->OpenDevice(buffer); if (!this->audioConnection || this->state != StatePlaying) { diff --git a/src/contrib/wasapiout/WasapiOut.cpp b/src/contrib/wasapiout/WasapiOut.cpp index 534c57b88..c693904a1 100644 --- a/src/contrib/wasapiout/WasapiOut.cpp +++ b/src/contrib/wasapiout/WasapiOut.cpp @@ -122,6 +122,10 @@ bool WasapiOut::Play(IBuffer *buffer, IBufferProvider *provider) { { Lock lock(this->stateMutex); + if (this->state == StatePaused) { + return false; + } + if (!this->Configure(buffer)) { this->Reset(); return false;