diff --git a/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/modules/juce_audio_devices/native/juce_ios_Audio.cpp index 46b175153e..23d8d4ffb0 100644 --- a/modules/juce_audio_devices/native/juce_ios_Audio.cpp +++ b/modules/juce_audio_devices/native/juce_ios_Audio.cpp @@ -969,6 +969,18 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, dispatchAudioUnitPropertyChange, this); jassert (err == noErr); + + AudioOutputUnitMIDICallbacks midiCallbacks; + midiCallbacks.userData = this; + midiCallbacks.MIDIEventProc = midiEventCallback; + midiCallbacks.MIDISysExProc = midiSysExCallback; + err = AudioUnitSetProperty (audioUnit, + kAudioOutputUnitProperty_MIDICallbacks, + kAudioUnitScope_Global, + 0, + &midiCallbacks, + sizeof (midiCallbacks)); + jassert (err == noErr); #endif if (channelData.areInputChannelsAvailable()) @@ -1125,10 +1137,9 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, static_cast (data)->handleAudioUnitPropertyChange (unit, propertyID, scope, element); } - void handleMidiMessage (MidiMessage msg) + static double getTimestampForMIDI() { - if (messageCollector != nullptr) - messageCollector->addMessageToQueue (msg); + return Time::getMillisecondCounter() / 1000.0; } static void midiEventCallback (void *client, UInt32 status, UInt32 data1, UInt32 data2, UInt32) @@ -1136,7 +1147,18 @@ struct iOSAudioIODevice::Pimpl : public AudioPlayHead, return static_cast (client)->handleMidiMessage (MidiMessage ((int) status, (int) data1, (int) data2, - Time::getMillisecondCounter() / 1000.0)); + getTimestampForMIDI())); + } + + static void midiSysExCallback (void *client, const UInt8 *data, UInt32 length) + { + return static_cast (client)->handleMidiMessage (MidiMessage (data, (int) length, getTimestampForMIDI())); + } + + void handleMidiMessage (MidiMessage msg) + { + if (messageCollector != nullptr) + messageCollector->addMessageToQueue (msg); } struct IOChannelData