Fix deadlock when stopping audio output
This commit is contained in:
parent
493b68e2a4
commit
8900c180e3
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user