OSStatus AUMIDIBase::HandleMIDIEvent()

in Source/AUMIDIBase.cpp [279:322]


OSStatus AUMIDIBase::HandleMIDIEvent(
	UInt8 status, UInt8 channel, UInt8 data1, UInt8 data2, UInt32 inStartFrame)
{
	if (!mAUBaseInstance.IsInitialized()) {
		return kAudioUnitErr_Uninitialized;
	}

#if AUSDK_HAVE_MIDI_MAPPING
	// you potentially have a choice to make here - if a param mapping matches, do you still want to
	// process the MIDI event or not. The default behaviour is to continue on with the MIDI event.
	if (mMIDIMapper) {
		if (mMIDIMapper->HandleHotMapping(status, channel, data1, mAUBaseInstance)) {
			mAUBaseInstance.PropertyChanged(
				kAudioUnitProperty_HotMapParameterMIDIMapping, kAudioUnitScope_Global, 0);
		} else {
			mMIDIMapper->FindParameterMapEventMatch(
				status, channel, data1, data2, inStartFrame, mAUBaseInstance);
		}
	}
#endif

	OSStatus result = noErr;

	switch (status) {
	case kMIDIStatus_NoteOn:
		if (data2 != 0u) {
			result = HandleNoteOn(channel, data1, data2, inStartFrame);
		} else {
			// zero velocity translates to note off
			result = HandleNoteOff(channel, data1, data2, inStartFrame);
		}
		break;

	case kMIDIStatus_NoteOff:
		result = HandleNoteOff(channel, data1, data2, inStartFrame);
		break;

	default:
		result = HandleNonNoteEvent(status, channel, data1, data2, inStartFrame);
		break;
	}

	return result;
}