DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 665cd0aa793570d087dceab8d1837404e731a8f3
parent ede02ba4bc1b7aada8956c9d98b112bfe1505209
Author: falkTX <falktx@falktx.com>
Date:   Sat,  1 Apr 2023 01:55:47 +0200

Automatically retry 2nd RtAudio device when safe to do so

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdistrho/src/jackbridge/RtAudioBridge.hpp | 21++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/distrho/src/jackbridge/RtAudioBridge.hpp b/distrho/src/jackbridge/RtAudioBridge.hpp @@ -283,13 +283,20 @@ struct RtAudioBridge : NativeBridge { return ok; } - bool _open(const bool withInput) + bool _open(const bool withInput, RtAudio* tryingAgain = nullptr) { ScopedPointer<RtAudio> rtAudio; - try { - rtAudio = new RtAudio(RtAudio::RTAUDIO_API_TYPE); - } DISTRHO_SAFE_EXCEPTION_RETURN("new RtAudio()", false); + if (tryingAgain == nullptr) + { + try { + rtAudio = new RtAudio(RtAudio::RTAUDIO_API_TYPE); + } DISTRHO_SAFE_EXCEPTION_RETURN("new RtAudio()", false); + } + else + { + rtAudio = tryingAgain; + } uint rtAudioBufferFrames = nextBufferSize; @@ -309,7 +316,7 @@ struct RtAudioBridge : NativeBridge { #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 RtAudio::StreamParameters outParams; - outParams.deviceId = rtAudio->getDefaultOutputDevice(); + outParams.deviceId = tryingAgain != nullptr ? 1 : rtAudio->getDefaultOutputDevice(); outParams.nChannels = DISTRHO_PLUGIN_NUM_OUTPUTS_2; RtAudio::StreamParameters* const outParamsPtr = &outParams; #else @@ -332,6 +339,10 @@ struct RtAudioBridge : NativeBridge { rtAudio->openStream(outParamsPtr, inParamsPtr, RTAUDIO_FLOAT32, 48000, &rtAudioBufferFrames, RtAudioCallback, this, &opts, nullptr); } catch (const RtAudioError& err) { + #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + if (outParams.deviceId == 0 && rtAudio->getDeviceCount() > 1) + return _open(withInput, rtAudio.release()); + #endif d_safe_exception(err.getMessage().c_str(), __FILE__, __LINE__); return false; } DISTRHO_SAFE_EXCEPTION_RETURN("rtAudio->openStream()", false);