From da5be4446fafd0529458b865787c8ef035341f07 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 8 Aug 2025 18:00:47 +0200 Subject: [PATCH] Implemement MIDI output for RtAudio native audio fallback Signed-off-by: falkTX --- distrho/src/jackbridge/JackBridge.cpp | 2 +- distrho/src/jackbridge/RtAudioBridge.hpp | 24 +++++++++++++++++++++++- distrho/src/jackbridge/WebBridge.hpp | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/distrho/src/jackbridge/JackBridge.cpp b/distrho/src/jackbridge/JackBridge.cpp index ba5ecb18..5638848b 100644 --- a/distrho/src/jackbridge/JackBridge.cpp +++ b/distrho/src/jackbridge/JackBridge.cpp @@ -951,7 +951,7 @@ jack_client_t* jackbridge_client_open(const char* client_name, uint32_t options, return kValidClient; delete nativeBridge; #endif - + #if defined(HAVE_RTAUDIO) && defined(RTAUDIO_API_TYPE) nativeBridge = new RtAudioBridge; if (nativeBridge->open(client_name)) diff --git a/distrho/src/jackbridge/RtAudioBridge.hpp b/distrho/src/jackbridge/RtAudioBridge.hpp index 6f93d06a..9995ddfe 100644 --- a/distrho/src/jackbridge/RtAudioBridge.hpp +++ b/distrho/src/jackbridge/RtAudioBridge.hpp @@ -33,7 +33,7 @@ # define RTAUDIO_API_TYPE WINDOWS_WASAPI # define RTMIDI_API_TYPE WINDOWS_MM #else -# if defined(HAVE_PULSEAUDIO) +# if defined(HAVE_PULSEAUDIO) && !defined(DPF_JACK_STANDALONE_SKIP_PULSEAUDIO_FALLBACK) # define __LINUX_PULSE__ # define RTAUDIO_API_TYPE LINUX_PULSE # elif defined(HAVE_ALSA) @@ -392,6 +392,28 @@ struct RtAudioBridge : NativeBridge { const ScopedDenormalDisable sdd; self->jackProcessCallback(numFrames, self->jackProcessArg); + #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + if (self->midiOutBuffer.isDataAvailableForReading()) + { + static_assert(kMaxMIDIInputMessageSize + 1u == 4, "change code if bumping this value"); + uint8_t data[4] = {}; + + while (self->midiOutBuffer.isDataAvailableForReading() && + self->midiOutBuffer.readCustomData(data, ARRAY_SIZE(data))) + { + // offset not used in RtMidiOut + self->midiOutBuffer.readUInt(); + + for (std::vector::iterator it = self->midiOuts.begin(), end = self->midiOuts.end(); it != end; ++it) + { + static_cast(*it).sendMessage(data + 1, data[0]); + } + } + + self->midiOutBuffer.flush(); + } + #endif + return 0; } diff --git a/distrho/src/jackbridge/WebBridge.hpp b/distrho/src/jackbridge/WebBridge.hpp index afb2c4bf..94793f74 100644 --- a/distrho/src/jackbridge/WebBridge.hpp +++ b/distrho/src/jackbridge/WebBridge.hpp @@ -494,7 +494,7 @@ struct WebBridge : NativeBridge { }, offset, bytes[0], bytes[1], bytes[2], bytes[3], timestamp); } - self->midiOutBuffer.clearData(); + self->midiOutBuffer.flush(); } #endif }