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:
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