Fix deadlock when stopping audio output

This commit is contained in:
michal.szwaj 2018-03-24 11:40:28 +01:00
parent 493b68e2a4
commit 8900c180e3
2 changed files with 18 additions and 13 deletions

View File

@ -45,6 +45,7 @@ public:
uint32_t getSampleRate() const override; uint32_t getSampleRate() const override;
private: private:
void doSuspend();
static int audioBufferReadHandler(void* outputBuffer, void* inputBuffer, unsigned int nBufferFrames, static int audioBufferReadHandler(void* outputBuffer, void* inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void* userData); double streamTime, RtAudioStreamStatus status, void* userData);

View File

@ -101,7 +101,7 @@ void RtAudioOutput::stop()
{ {
std::lock_guard<decltype(mutex_)> lock(mutex_); std::lock_guard<decltype(mutex_)> lock(mutex_);
this->suspend(); this->doSuspend();
if(dac_->isStreamOpen()) if(dac_->isStreamOpen())
{ {
@ -112,18 +112,7 @@ void RtAudioOutput::stop()
void RtAudioOutput::suspend() void RtAudioOutput::suspend()
{ {
std::lock_guard<decltype(mutex_)> lock(mutex_); std::lock_guard<decltype(mutex_)> lock(mutex_);
this->doSuspend();
if(!dac_->isStreamOpen() && !dac_->isStreamRunning())
{
try
{
dac_->stopStream();
}
catch(const RtAudioError& e)
{
OPENAUTO_LOG(error) << "[RtAudioOutput] Failed to suspend audio output, what: " << e.what();
}
}
} }
uint32_t RtAudioOutput::getSampleSize() const uint32_t RtAudioOutput::getSampleSize() const
@ -141,6 +130,21 @@ uint32_t RtAudioOutput::getSampleRate() const
return sampleRate_; return sampleRate_;
} }
void RtAudioOutput::doSuspend()
{
if(!dac_->isStreamOpen() && !dac_->isStreamRunning())
{
try
{
dac_->stopStream();
}
catch(const RtAudioError& e)
{
OPENAUTO_LOG(error) << "[RtAudioOutput] Failed to suspend audio output, what: " << e.what();
}
}
}
int RtAudioOutput::audioBufferReadHandler(void* outputBuffer, void* inputBuffer, unsigned int nBufferFrames, int RtAudioOutput::audioBufferReadHandler(void* outputBuffer, void* inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void* userData) double streamTime, RtAudioStreamStatus status, void* userData)
{ {