/*! @file AudioUnitSDK/AUMIDIBase.h @copyright © 2000-2021 Apple Inc. All rights reserved. */ #ifndef AudioUnitSDK_AUMIDIBase_h #define AudioUnitSDK_AUMIDIBase_h #include #ifndef AUSDK_HAVE_XML_NAMES #define AUSDK_HAVE_XML_NAMES TARGET_OS_OSX // NOLINT(cppcoreguidelines-macro-usage) #endif #ifndef AUSDK_HAVE_MIDI_MAPPING #define AUSDK_HAVE_MIDI_MAPPING TARGET_OS_OSX // NOLINT(cppcoreguidelines-macro-usage) #endif namespace ausdk { #if AUSDK_HAVE_MIDI_MAPPING /// Abstract interface for parameter MIDI mapping class AUMIDIMapper { public: AUMIDIMapper() = default; virtual ~AUMIDIMapper() = default; AUMIDIMapper(const AUMIDIMapper&) = delete; AUMIDIMapper(AUMIDIMapper&&) = delete; AUMIDIMapper& operator=(const AUMIDIMapper&) = delete; AUMIDIMapper& operator=(AUMIDIMapper&&) = delete; [[nodiscard]] virtual UInt32 GetNumberMaps() const = 0; virtual void GetMaps(AUParameterMIDIMapping* outMapping) = 0; virtual void GetHotParameterMap(AUParameterMIDIMapping& outMapping) = 0; virtual void AddParameterMapping( const AUParameterMIDIMapping* maps, UInt32 count, AUBase& auBase) = 0; virtual void RemoveParameterMapping( const AUParameterMIDIMapping* maps, UInt32 count, bool& outDidChange) = 0; virtual void SetHotMapping(const AUParameterMIDIMapping& mapping) = 0; virtual void ReplaceAllMaps( const AUParameterMIDIMapping* maps, UInt32 count, AUBase& auBase) = 0; virtual bool HandleHotMapping(UInt8 status, UInt8 channel, UInt8 data1, AUBase& auBase) = 0; virtual bool FindParameterMapEventMatch(UInt8 status, UInt8 channel, UInt8 data1, UInt8 data2, UInt32 inStartFrame, AUBase& auBase) = 0; }; #endif // ________________________________________________________________________ // AUMIDIBase // /*! @class AUMIDIBase @brief Auxiliary class supporting MIDI events. */ class AUMIDIBase { public: explicit AUMIDIBase(AUBase& inBase) : mAUBaseInstance(inBase) {} virtual ~AUMIDIBase() = default; AUMIDIBase(const AUMIDIBase&) = delete; AUMIDIBase(AUMIDIBase&&) = delete; AUMIDIBase& operator=(const AUMIDIBase&) = delete; AUMIDIBase& operator=(AUMIDIBase&&) = delete; virtual OSStatus MIDIEvent( UInt32 inStatus, UInt32 inData1, UInt32 inData2, UInt32 inOffsetSampleFrame) { const UInt32 strippedStatus = inStatus & 0xf0U; // NOLINT const UInt32 channel = inStatus & 0x0fU; // NOLINT return HandleMIDIEvent(strippedStatus, channel, inData1, inData2, inOffsetSampleFrame); } #if AUSDK_MIDI2_AVAILABLE virtual OSStatus MIDIEventList( UInt32 /*inOffsetSampleFrame*/, const MIDIEventList* /*eventList*/) { return kAudio_UnimplementedError; } #endif virtual OSStatus SysEx(const UInt8* inData, UInt32 inLength); virtual OSStatus DelegateGetPropertyInfo(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, UInt32& outDataSize, bool& outWritable); virtual OSStatus DelegateGetProperty(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, void* outData); virtual OSStatus DelegateSetProperty(AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, const void* inData, UInt32 inDataSize); protected: // MIDI dispatch virtual OSStatus HandleMIDIEvent( UInt8 inStatus, UInt8 inChannel, UInt8 inData1, UInt8 inData2, UInt32 inStartFrame); virtual OSStatus HandleNonNoteEvent( UInt8 status, UInt8 channel, UInt8 data1, UInt8 data2, UInt32 inStartFrame); // Old name AUSDK_DEPRECATED("HandleMIDIEvent") OSStatus HandleMidiEvent( UInt8 inStatus, UInt8 inChannel, UInt8 inData1, UInt8 inData2, UInt32 inStartFrame) { return HandleMIDIEvent(inStatus, inChannel, inData1, inData2, inStartFrame); } #if AUSDK_HAVE_XML_NAMES virtual OSStatus GetXMLNames(CFURLRef* /*outNameDocument*/) { return kAudioUnitErr_InvalidProperty; } // if not overridden, it's unsupported #endif // channel messages virtual OSStatus HandleNoteOn( UInt8 /*inChannel*/, UInt8 /*inNoteNumber*/, UInt8 /*inVelocity*/, UInt32 /*inStartFrame*/) { return noErr; } virtual OSStatus HandleNoteOff( UInt8 /*inChannel*/, UInt8 /*inNoteNumber*/, UInt8 /*inVelocity*/, UInt32 /*inStartFrame*/) { return noErr; } virtual OSStatus HandleControlChange( UInt8 /*inChannel*/, UInt8 /*inController*/, UInt8 /*inValue*/, UInt32 /*inStartFrame*/) { return noErr; } virtual OSStatus HandlePitchWheel( UInt8 /*inChannel*/, UInt8 /*inPitch1*/, UInt8 /*inPitch2*/, UInt32 /*inStartFrame*/) { return noErr; } virtual OSStatus HandleChannelPressure( UInt8 /*inChannel*/, UInt8 /*inValue*/, UInt32 /*inStartFrame*/) { return noErr; } virtual OSStatus HandleProgramChange(UInt8 /*inChannel*/, UInt8 /*inValue*/) { return noErr; } virtual OSStatus HandlePolyPressure( UInt8 /*inChannel*/, UInt8 /*inKey*/, UInt8 /*inValue*/, UInt32 /*inStartFrame*/) { return noErr; } virtual OSStatus HandleResetAllControllers(UInt8 /*inChannel*/) { return noErr; } virtual OSStatus HandleAllNotesOff(UInt8 /*inChannel*/) { return noErr; } virtual OSStatus HandleAllSoundOff(UInt8 /*inChannel*/) { return noErr; } // System messages virtual OSStatus HandleSysEx(const UInt8* /*inData*/, UInt32 /*inLength*/) { return noErr; } #if AUSDK_HAVE_MIDI_MAPPING void SetMIDIMapper(const std::shared_ptr& mapper) { mMIDIMapper = mapper; } #endif private: AUBase& mAUBaseInstance; #if AUSDK_HAVE_MIDI_MAPPING std::shared_ptr mMIDIMapper; #endif }; } // namespace ausdk #endif // AudioUnitSDK_AUMIDIBase_h