From 676b27ef6871db4e993e5038dffdde2724789773 Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 26 Apr 2016 11:27:57 +0100 Subject: [PATCH] Added a MidiDataConcatenator to the linux MIDI implementation, to help handle large and broken-up sysex messages --- .../native/juce_linux_Midi.cpp | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/modules/juce_audio_devices/native/juce_linux_Midi.cpp b/modules/juce_audio_devices/native/juce_linux_Midi.cpp index f042c8559a..9ec37a64ed 100644 --- a/modules/juce_audio_devices/native/juce_linux_Midi.cpp +++ b/modules/juce_audio_devices/native/juce_linux_Midi.cpp @@ -103,7 +103,8 @@ public: inputThread->signalThreadShouldExit(); } - void handleIncomingMidiMessage (const MidiMessage& message, int port); + void handleIncomingMidiMessage (snd_seq_event*, const MidiMessage&); + void handlePartialSysexMessage (snd_seq_event*, const uint8*, int, double); snd_seq_t* get() const noexcept { return handle; } @@ -119,7 +120,7 @@ private: { public: MidiInputThread (AlsaClient& c) - : Thread ("Juce MIDI Input"), client (c) + : Thread ("Juce MIDI Input"), client (c), concatenator (2048) { jassert (client.input && client.get() != nullptr); } @@ -159,13 +160,9 @@ private: snd_midi_event_reset_decode (midiParser); - if (numBytes > 0) - { - const MidiMessage message ((const uint8*) buffer, (int) numBytes, - Time::getMillisecondCounter() * 0.001); - - client.handleIncomingMidiMessage (message, inputEvent->dest.port); - } + concatenator.pushMidiData (buffer, (int) numBytes, + Time::getMillisecondCounter() * 0.001, + inputEvent, client); snd_seq_free_event (inputEvent); } @@ -180,6 +177,7 @@ private: private: AlsaClient& client; + MidiDataConcatenator concatenator; }; ScopedPointer inputThread; @@ -282,6 +280,11 @@ public: callback->handleIncomingMidiMessage (midiInput, message); } + void handlePartialSysexMessage (const uint8* messageData, int numBytesSoFar, double timeStamp) + { + callback->handlePartialSysexMessage (midiInput, messageData, numBytesSoFar, timeStamp); + } + private: AlsaPort port; MidiInput* midiInput; @@ -291,14 +294,22 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AlsaPortAndCallback) }; -void AlsaClient::handleIncomingMidiMessage (const MidiMessage& message, int port) +void AlsaClient::handleIncomingMidiMessage (snd_seq_event_t* event, const MidiMessage& message) { const ScopedLock sl (callbackLock); - if (AlsaPortAndCallback* const cb = activeCallbacks[port]) + if (AlsaPortAndCallback* const cb = activeCallbacks[event->dest.port]) cb->handleIncomingMidiMessage (message); } +void AlsaClient::handlePartialSysexMessage (snd_seq_event* event, const uint8* messageData, int numBytesSoFar, double timeStamp) +{ + const ScopedLock sl (callbackLock); + + if (AlsaPortAndCallback* const cb = activeCallbacks[event->dest.port]) + cb->handlePartialSysexMessage (messageData, numBytesSoFar, timeStamp); +} + //============================================================================== static AlsaPort iterateMidiClient (const AlsaClient::Ptr& seq, snd_seq_client_info_t* clientInfo,