Browse Source

Fix stuck notes in native MIDI handling

Signed-off-by: falkTX <falktx@falktx.com>
pull/432/head
falkTX 2 years ago
parent
commit
cb630fabcb
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
3 changed files with 18 additions and 11 deletions
  1. +8
    -5
      distrho/src/jackbridge/NativeBridge.hpp
  2. +4
    -3
      distrho/src/jackbridge/RtAudioBridge.hpp
  3. +6
    -3
      distrho/src/jackbridge/WebBridge.hpp

+ 8
- 5
distrho/src/jackbridge/NativeBridge.hpp View File

@@ -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
}


+ 4
- 3
distrho/src/jackbridge/RtAudioBridge.hpp View File

@@ -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();
}


+ 6
- 3
distrho/src/jackbridge/WebBridge.hpp View File

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


Loading…
Cancel
Save