Browse Source

Automatically retry 2nd RtAudio device when safe to do so

Signed-off-by: falkTX <falktx@falktx.com>
pull/421/head
falkTX 2 years ago
parent
commit
665cd0aa79
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
1 changed files with 16 additions and 5 deletions
  1. +16
    -5
      distrho/src/jackbridge/RtAudioBridge.hpp

+ 16
- 5
distrho/src/jackbridge/RtAudioBridge.hpp View File

@@ -283,13 +283,20 @@ struct RtAudioBridge : NativeBridge {
return ok; return ok;
} }


bool _open(const bool withInput)
bool _open(const bool withInput, RtAudio* tryingAgain = nullptr)
{ {
ScopedPointer<RtAudio> rtAudio; 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; uint rtAudioBufferFrames = nextBufferSize;


@@ -309,7 +316,7 @@ struct RtAudioBridge : NativeBridge {


#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0
RtAudio::StreamParameters outParams; RtAudio::StreamParameters outParams;
outParams.deviceId = rtAudio->getDefaultOutputDevice();
outParams.deviceId = tryingAgain != nullptr ? 1 : rtAudio->getDefaultOutputDevice();
outParams.nChannels = DISTRHO_PLUGIN_NUM_OUTPUTS_2; outParams.nChannels = DISTRHO_PLUGIN_NUM_OUTPUTS_2;
RtAudio::StreamParameters* const outParamsPtr = &outParams; RtAudio::StreamParameters* const outParamsPtr = &outParams;
#else #else
@@ -332,6 +339,10 @@ struct RtAudioBridge : NativeBridge {
rtAudio->openStream(outParamsPtr, inParamsPtr, RTAUDIO_FLOAT32, 48000, &rtAudioBufferFrames, rtAudio->openStream(outParamsPtr, inParamsPtr, RTAUDIO_FLOAT32, 48000, &rtAudioBufferFrames,
RtAudioCallback, this, &opts, nullptr); RtAudioCallback, this, &opts, nullptr);
} catch (const RtAudioError& err) { } 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__); d_safe_exception(err.getMessage().c_str(), __FILE__, __LINE__);
return false; return false;
} DISTRHO_SAFE_EXCEPTION_RETURN("rtAudio->openStream()", false); } DISTRHO_SAFE_EXCEPTION_RETURN("rtAudio->openStream()", false);


Loading…
Cancel
Save