mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-11 23:54:18 +00:00
Added a MidiDataConcatenator to the linux MIDI implementation, to help handle large and broken-up sysex messages
This commit is contained in:
parent
0708b7af87
commit
676b27ef68
1 changed files with 22 additions and 11 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue