1 /*
2 Copyright (C) 2016 Apple Inc. All Rights Reserved.
3 See LICENSE.txt for this sample’s licensing information
4 
5 Abstract:
6 Part of Core Audio AUBase Classes
7 */
8 
9 #ifndef __AUMIDIBase_h__
10 #define __AUMIDIBase_h__
11 
12 #include "AUBase.h"
13 
14 #if CA_AUTO_MIDI_MAP
15 	#include "CAAUMIDIMapManager.h"
16 #endif
17 
18 struct MIDIPacketList;
19 
20 // ________________________________________________________________________
21 //	MusicDeviceBase
22 //
23 	/*! @class AUMIDIBase */
24 class AUMIDIBase {
25 public:
26 									// this is NOT a copy constructor!
27 	/*! @ctor AUMIDIBase */
28 								AUMIDIBase(AUBase* inBase);
29 	/*! @dtor ~AUMIDIBase */
30 	virtual						~AUMIDIBase();
31 
32 	/*! @method MIDIEvent */
MIDIEvent(UInt32 inStatus,UInt32 inData1,UInt32 inData2,UInt32 inOffsetSampleFrame)33 	virtual OSStatus	MIDIEvent(		UInt32 						inStatus,
34 										UInt32 						inData1,
35 										UInt32 						inData2,
36 										UInt32 						inOffsetSampleFrame)
37 	{
38 		UInt32 strippedStatus = inStatus & 0xf0;
39 		UInt32 channel = inStatus & 0x0f;
40 
41 		return HandleMidiEvent(strippedStatus, channel, inData1, inData2, inOffsetSampleFrame);
42 	}
43 
44 	/*! @method HandleMIDIPacketList */
45 	OSStatus			HandleMIDIPacketList(const MIDIPacketList *pktlist);
46 
47 	/*! @method SysEx */
48 	virtual OSStatus	SysEx(			const UInt8 *				inData,
49 										UInt32 						inLength);
50 
51 #if TARGET_API_MAC_OSX
52 	/*! @method DelegateGetPropertyInfo */
53 	virtual OSStatus			DelegateGetPropertyInfo(AudioUnitPropertyID			inID,
54 														AudioUnitScope				inScope,
55 														AudioUnitElement			inElement,
56 														UInt32 &					outDataSize,
57 														Boolean &					outWritable);
58 
59 	/*! @method DelegateGetProperty */
60 	virtual OSStatus			DelegateGetProperty(	AudioUnitPropertyID 		inID,
61 														AudioUnitScope 				inScope,
62 														AudioUnitElement		 	inElement,
63 														void *						outData);
64 
65 	/*! @method DelegateSetProperty */
66 	virtual OSStatus			DelegateSetProperty(	AudioUnitPropertyID 		inID,
67 														AudioUnitScope 				inScope,
68 														AudioUnitElement		 	inElement,
69 														const void *				inData,
70 														UInt32						inDataSize);
71 #endif
72 
73 protected:
74 	// MIDI dispatch
75 	/*! @method HandleMidiEvent */
76 	virtual OSStatus	HandleMidiEvent(		UInt8 	inStatus,
77 												UInt8 	inChannel,
78 												UInt8 	inData1,
79 												UInt8 	inData2,
80 												UInt32 	inStartFrame);
81 
82 	/*! @method HandleNonNoteEvent */
83 	virtual OSStatus	HandleNonNoteEvent (	UInt8	status,
84 												UInt8	channel,
85 												UInt8	data1,
86 												UInt8	data2,
87 												UInt32	inStartFrame);
88 
89 #if TARGET_API_MAC_OSX
90 	/*! @method GetXMLNames */
GetXMLNames(CFURLRef * outNameDocument)91 	virtual OSStatus			GetXMLNames(CFURLRef *outNameDocument)
92 	{ return kAudioUnitErr_InvalidProperty; }	// if not overridden, it's unsupported
93 #endif
94 
95 // channel messages
96 	/*! @method HandleNoteOn */
HandleNoteOn(UInt8 inChannel,UInt8 inNoteNumber,UInt8 inVelocity,UInt32 inStartFrame)97 	virtual OSStatus	HandleNoteOn(			UInt8 	inChannel,
98 												UInt8 	inNoteNumber,
99 												UInt8 	inVelocity,
100 												UInt32 	inStartFrame) { return noErr; }
101 
102 	/*! @method HandleNoteOff */
HandleNoteOff(UInt8 inChannel,UInt8 inNoteNumber,UInt8 inVelocity,UInt32 inStartFrame)103 	virtual OSStatus	HandleNoteOff(			UInt8 	inChannel,
104 												UInt8 	inNoteNumber,
105 												UInt8 	inVelocity,
106 												UInt32 	inStartFrame) { return noErr; }
107 
108 	/*! @method HandleControlChange */
HandleControlChange(UInt8 inChannel,UInt8 inController,UInt8 inValue,UInt32 inStartFrame)109 	virtual OSStatus	HandleControlChange(	UInt8 	inChannel,
110 												UInt8 	inController,
111 												UInt8 	inValue,
112 												UInt32	inStartFrame) { return noErr; }
113 
114 	/*! @method HandlePitchWheel */
HandlePitchWheel(UInt8 inChannel,UInt8 inPitch1,UInt8 inPitch2,UInt32 inStartFrame)115 	virtual OSStatus	HandlePitchWheel(		UInt8 	inChannel,
116 												UInt8 	inPitch1,
117 												UInt8 	inPitch2,
118 												UInt32	inStartFrame) { return noErr; }
119 
120 	/*! @method HandleChannelPressure */
HandleChannelPressure(UInt8 inChannel,UInt8 inValue,UInt32 inStartFrame)121 	virtual OSStatus	HandleChannelPressure(	UInt8 	inChannel,
122 												UInt8 	inValue,
123 												UInt32	inStartFrame) { return noErr; }
124 
125 	/*! @method HandleProgramChange */
HandleProgramChange(UInt8 inChannel,UInt8 inValue)126 	virtual OSStatus	HandleProgramChange(	UInt8 	inChannel,
127 												UInt8 	inValue) { return noErr; }
128 
129 	/*! @method HandlePolyPressure */
HandlePolyPressure(UInt8 inChannel,UInt8 inKey,UInt8 inValue,UInt32 inStartFrame)130 	virtual OSStatus	HandlePolyPressure(		UInt8 	inChannel,
131 												UInt8 	inKey,
132 												UInt8	inValue,
133 												UInt32	inStartFrame) { return noErr; }
134 
135 	/*! @method HandleResetAllControllers */
HandleResetAllControllers(UInt8 inChannel)136 	virtual OSStatus	HandleResetAllControllers(UInt8 inChannel) { return noErr; }
137 
138 	/*! @method HandleAllNotesOff */
HandleAllNotesOff(UInt8 inChannel)139 	virtual OSStatus	HandleAllNotesOff(		UInt8	inChannel) { return noErr; }
140 
141 	/*! @method HandleAllSoundOff */
HandleAllSoundOff(UInt8 inChannel)142 	virtual OSStatus	HandleAllSoundOff(		UInt8	inChannel) { return noErr; }
143 
144 
145 //System messages
146 	/*! @method HandleSysEx */
HandleSysEx(const UInt8 * inData,UInt32 inLength)147 	virtual OSStatus	HandleSysEx(			const UInt8 *	inData,
148                                         		UInt32			inLength ) { return noErr; }
149 
150 #if CA_AUTO_MIDI_MAP
151 	/* map manager */
GetMIDIMapManager()152 	CAAUMIDIMapManager			*GetMIDIMapManager() {return mMapManager;};
153 
154 #endif
155 
156 
157 private:
158 	/*! @var mAUBaseInstance */
159 	AUBase						& mAUBaseInstance;
160 
161 #if CA_AUTO_MIDI_MAP
162 	/* map manager */
163 	CAAUMIDIMapManager			* mMapManager;
164 #endif
165 
166 public:
167 #if !CA_USE_AUDIO_PLUGIN_ONLY
168 	// component dispatcher
169 	/*! @method ComponentEntryDispatch */
170 	static OSStatus			ComponentEntryDispatch(	ComponentParameters 		*params,
171 														AUMIDIBase 					*This);
172 #endif
173 };
174 
175 #endif // __AUMIDIBase_h__
176