DPF

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

commit cb630fabcb059f35646ac4cacf011a25ffc3ff93
parent 1fc0c6b1b1ed488190a5a264b5d1514e02d20434
Author: falkTX <falktx@falktx.com>
Date:   Sun, 27 Aug 2023 11:32:09 +0200

Fix stuck notes in native MIDI handling

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

Diffstat:
Mdistrho/src/jackbridge/NativeBridge.hpp | 13++++++++-----
Mdistrho/src/jackbridge/RtAudioBridge.hpp | 7++++---
Mdistrho/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 @@ -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 @@ -396,17 +396,18 @@ struct RtAudioBridge : NativeBridge { } #if defined(RTMIDI_API_TYPE) && DISTRHO_PLUGIN_WANT_MIDI_INPUT - static void RtMidiCallback(double /*timeStamp*/, std::vector<uchar>* message, void* userData) + static void RtMidiCallback(double /*timestamp*/, std::vector<uchar>* const message, void* const userData) { const size_t len = message->size(); DISTRHO_SAFE_ASSERT_RETURN(len > 0 && len <= kMaxMIDIInputMessageSize,); RtAudioBridge* const self = static_cast<RtAudioBridge*>(userData); - // TODO timestamp handling self->midiInBufferPending.writeByte(static_cast<uint8_t>(len)); + // TODO timestamp + // self->midiInBufferPending.writeDouble(timestamp); self->midiInBufferPending.writeCustomData(message->data(), len); - for (uint8_t i=0; i<len; ++i) + for (uint8_t i=len; i<kMaxMIDIInputMessageSize; ++i) self->midiInBufferPending.writeByte(0); self->midiInBufferPending.commitWrite(); } diff --git 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<WebBridge*>(userData); - // TODO timestamp handling self->midiInBufferPending.writeByte(static_cast<uint8_t>(len)); - self->midiInBufferPending.writeCustomData(data, kMaxMIDIInputMessageSize); + // TODO timestamp + // self->midiInBufferPending.writeDouble(timestamp); + self->midiInBufferPending.writeCustomData(data, len); + for (uint8_t i=len; i<kMaxMIDIInputMessageSize; ++i) + self->midiInBufferPending.writeByte(0); self->midiInBufferPending.commitWrite(); } #endif