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