From cb630fabcb059f35646ac4cacf011a25ffc3ff93 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 27 Aug 2023 11:32:36 +0200 Subject: [PATCH] Fix stuck notes in native MIDI handling Signed-off-by: falkTX --- distrho/src/jackbridge/NativeBridge.hpp | 13 ++++++++----- distrho/src/jackbridge/RtAudioBridge.hpp | 7 ++++--- distrho/src/jackbridge/WebBridge.hpp | 9 ++++++--- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/distrho/src/jackbridge/NativeBridge.hpp b/distrho/src/jackbridge/NativeBridge.hpp index 1f80c913..ac969544 100644 --- a/distrho/src/jackbridge/NativeBridge.hpp +++ b/distrho/src/jackbridge/NativeBridge.hpp @@ -73,6 +73,7 @@ struct NativeBridge { #endif #if DISTRHO_PLUGIN_WANT_MIDI_INPUT static constexpr const uint32_t kMaxMIDIInputMessageSize = 3; + static constexpr const uint32_t kRingBufferMessageSize = 1u /*+ sizeof(double)*/ + kMaxMIDIInputMessageSize; uint8_t midiDataStorage[kMaxMIDIInputMessageSize]; HeapRingBuffer midiInBufferCurrent; HeapRingBuffer midiInBufferPending; @@ -158,7 +159,7 @@ struct NativeBridge { { // NOTE: this function is only called once per run midiInBufferCurrent.copyFromAndClearOther(midiInBufferPending); - return midiInBufferCurrent.getReadableDataSize() / (kMaxMIDIInputMessageSize + 1u); + return midiInBufferCurrent.getReadableDataSize() / kRingBufferMessageSize; } #endif @@ -169,10 +170,12 @@ struct NativeBridge { { #if DISTRHO_PLUGIN_WANT_MIDI_INPUT // NOTE: this function is called for all events in index succession - if (midiAvailable && midiInBufferCurrent.getReadableDataSize() >= (kMaxMIDIInputMessageSize + 1u)) + if (midiAvailable && midiInBufferCurrent.getReadableDataSize() >= kRingBufferMessageSize) { - event->time = 0; // TODO - event->size = midiInBufferCurrent.readByte(); + event->size = midiInBufferCurrent.readByte(); + // TODO timestamp + // const double timestamp = midiInBufferCurrent.readDouble(); + event->time = 0; event->buffer = midiDataStorage; return midiInBufferCurrent.readCustomData(midiDataStorage, kMaxMIDIInputMessageSize); } @@ -186,7 +189,7 @@ struct NativeBridge { { #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT if (midiAvailable) - midiOutBuffer.clearData(); + midiOutBuffer.flush(); #endif } diff --git a/distrho/src/jackbridge/RtAudioBridge.hpp b/distrho/src/jackbridge/RtAudioBridge.hpp index 49673fd1..6f93d06a 100644 --- a/distrho/src/jackbridge/RtAudioBridge.hpp +++ b/distrho/src/jackbridge/RtAudioBridge.hpp @@ -396,17 +396,18 @@ struct RtAudioBridge : NativeBridge { } #if defined(RTMIDI_API_TYPE) && DISTRHO_PLUGIN_WANT_MIDI_INPUT - static void RtMidiCallback(double /*timeStamp*/, std::vector* message, void* userData) + static void RtMidiCallback(double /*timestamp*/, std::vector* const message, void* const userData) { const size_t len = message->size(); DISTRHO_SAFE_ASSERT_RETURN(len > 0 && len <= kMaxMIDIInputMessageSize,); RtAudioBridge* const self = static_cast(userData); - // TODO timestamp handling self->midiInBufferPending.writeByte(static_cast(len)); + // TODO timestamp + // self->midiInBufferPending.writeDouble(timestamp); self->midiInBufferPending.writeCustomData(message->data(), len); - for (uint8_t i=0; imidiInBufferPending.writeByte(0); self->midiInBufferPending.commitWrite(); } diff --git a/distrho/src/jackbridge/WebBridge.hpp b/distrho/src/jackbridge/WebBridge.hpp index 8173101d..afb2c4bf 100644 --- a/distrho/src/jackbridge/WebBridge.hpp +++ b/distrho/src/jackbridge/WebBridge.hpp @@ -506,15 +506,18 @@ struct WebBridge : NativeBridge { } #if DISTRHO_PLUGIN_WANT_MIDI_INPUT - static void WebMIDICallback(void* const userData, uint8_t* const data, const int len, const double timestamp) + static void WebMIDICallback(void* const userData, uint8_t* const data, const int len, double /*timestamp*/) { DISTRHO_SAFE_ASSERT_RETURN(len > 0 && len <= (int)kMaxMIDIInputMessageSize,); WebBridge* const self = static_cast(userData); - // TODO timestamp handling self->midiInBufferPending.writeByte(static_cast(len)); - self->midiInBufferPending.writeCustomData(data, kMaxMIDIInputMessageSize); + // TODO timestamp + // self->midiInBufferPending.writeDouble(timestamp); + self->midiInBufferPending.writeCustomData(data, len); + for (uint8_t i=len; imidiInBufferPending.writeByte(0); self->midiInBufferPending.commitWrite(); } #endif