1 /*
2      File: AUMIDIBase.h
3  Abstract: Part of CoreAudio Utility Classes
4   Version: 1.1
5 
6  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
7  Inc. ("Apple") in consideration of your agreement to the following
8  terms, and your use, installation, modification or redistribution of
9  this Apple software constitutes acceptance of these terms.  If you do
10  not agree with these terms, please do not use, install, modify or
11  redistribute this Apple software.
12 
13  In consideration of your agreement to abide by the following terms, and
14  subject to these terms, Apple grants you a personal, non-exclusive
15  license, under Apple's copyrights in this original Apple software (the
16  "Apple Software"), to use, reproduce, modify and redistribute the Apple
17  Software, with or without modifications, in source and/or binary forms;
18  provided that if you redistribute the Apple Software in its entirety and
19  without modifications, you must retain this notice and the following
20  text and disclaimers in all such redistributions of the Apple Software.
21  Neither the name, trademarks, service marks or logos of Apple Inc. may
22  be used to endorse or promote products derived from the Apple Software
23  without specific prior written permission from Apple.  Except as
24  expressly stated in this notice, no other rights or licenses, express or
25  implied, are granted by Apple herein, including but not limited to any
26  patent rights that may be infringed by your derivative works or by other
27  works in which the Apple Software may be incorporated.
28 
29  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
30  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
31  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
32  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
33  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
34 
35  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
36  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
37  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
38  INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
39  MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
40  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
41  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
42  POSSIBILITY OF SUCH DAMAGE.
43 
44  Copyright (C) 2014 Apple Inc. All Rights Reserved.
45 
46 */
47 #ifndef __AUMIDIBase_h__
48 #define __AUMIDIBase_h__
49 
50 #include "AUBase.h"
51 
52 #if CA_AUTO_MIDI_MAP
53 	#include "CAAUMIDIMapManager.h"
54 #endif
55 
56 struct MIDIPacketList;
57 
58 // ________________________________________________________________________
59 //	MusicDeviceBase
60 //
61 	/*! @class AUMIDIBase */
62 class AUMIDIBase {
63 public:
64 									// this is NOT a copy constructor!
65 	/*! @ctor AUMIDIBase */
66 								AUMIDIBase(AUBase* inBase);
67 	/*! @dtor ~AUMIDIBase */
68 	virtual						~AUMIDIBase();
69 
70 	/*! @method MIDIEvent */
MIDIEvent(UInt32 inStatus,UInt32 inData1,UInt32 inData2,UInt32 inOffsetSampleFrame)71 	virtual OSStatus	MIDIEvent(		UInt32 						inStatus,
72 										UInt32 						inData1,
73 										UInt32 						inData2,
74 										UInt32 						inOffsetSampleFrame)
75 	{
76 		UInt32 strippedStatus = inStatus & 0xf0;
77 		UInt32 channel = inStatus & 0x0f;
78 
79 		return HandleMidiEvent(strippedStatus, channel, inData1, inData2, inOffsetSampleFrame);
80 	}
81 
82 	/*! @method HandleMIDIPacketList */
83 	OSStatus			HandleMIDIPacketList(const MIDIPacketList *pktlist);
84 
85 	/*! @method SysEx */
86 	virtual OSStatus	SysEx(			const UInt8 *				inData,
87 										UInt32 						inLength);
88 
89 #if TARGET_API_MAC_OSX
90 	/*! @method DelegateGetPropertyInfo */
91 	virtual OSStatus			DelegateGetPropertyInfo(AudioUnitPropertyID			inID,
92 														AudioUnitScope				inScope,
93 														AudioUnitElement			inElement,
94 														UInt32 &					outDataSize,
95 														Boolean &					outWritable);
96 
97 	/*! @method DelegateGetProperty */
98 	virtual OSStatus			DelegateGetProperty(	AudioUnitPropertyID 		inID,
99 														AudioUnitScope 				inScope,
100 														AudioUnitElement		 	inElement,
101 														void *						outData);
102 
103 	/*! @method DelegateSetProperty */
104 	virtual OSStatus			DelegateSetProperty(	AudioUnitPropertyID 		inID,
105 														AudioUnitScope 				inScope,
106 														AudioUnitElement		 	inElement,
107 														const void *				inData,
108 														UInt32						inDataSize);
109 #endif
110 
111 protected:
112 	// MIDI dispatch
113 	/*! @method HandleMidiEvent */
114 	virtual OSStatus	HandleMidiEvent(		UInt8 	inStatus,
115 												UInt8 	inChannel,
116 												UInt8 	inData1,
117 												UInt8 	inData2,
118 												UInt32 	inStartFrame);
119 
120 	/*! @method HandleNonNoteEvent */
121 	virtual OSStatus	HandleNonNoteEvent (	UInt8	status,
122 												UInt8	channel,
123 												UInt8	data1,
124 												UInt8	data2,
125 												UInt32	inStartFrame);
126 
127 #if TARGET_API_MAC_OSX
128 	/*! @method GetXMLNames */
GetXMLNames(CFURLRef * outNameDocument)129 	virtual OSStatus			GetXMLNames(CFURLRef *outNameDocument)
130 	{ return kAudioUnitErr_InvalidProperty; }	// if not overridden, it's unsupported
131 #endif
132 
133 // channel messages
134 	/*! @method HandleNoteOn */
HandleNoteOn(UInt8 inChannel,UInt8 inNoteNumber,UInt8 inVelocity,UInt32 inStartFrame)135 	virtual OSStatus	HandleNoteOn(			UInt8 	inChannel,
136 												UInt8 	inNoteNumber,
137 												UInt8 	inVelocity,
138 												UInt32 	inStartFrame) { return noErr; }
139 
140 	/*! @method HandleNoteOff */
HandleNoteOff(UInt8 inChannel,UInt8 inNoteNumber,UInt8 inVelocity,UInt32 inStartFrame)141 	virtual OSStatus	HandleNoteOff(			UInt8 	inChannel,
142 												UInt8 	inNoteNumber,
143 												UInt8 	inVelocity,
144 												UInt32 	inStartFrame) { return noErr; }
145 
146 	/*! @method HandleControlChange */
HandleControlChange(UInt8 inChannel,UInt8 inController,UInt8 inValue,UInt32 inStartFrame)147 	virtual OSStatus	HandleControlChange(	UInt8 	inChannel,
148 												UInt8 	inController,
149 												UInt8 	inValue,
150 												UInt32	inStartFrame) { return noErr; }
151 
152 	/*! @method HandlePitchWheel */
HandlePitchWheel(UInt8 inChannel,UInt8 inPitch1,UInt8 inPitch2,UInt32 inStartFrame)153 	virtual OSStatus	HandlePitchWheel(		UInt8 	inChannel,
154 												UInt8 	inPitch1,
155 												UInt8 	inPitch2,
156 												UInt32	inStartFrame) { return noErr; }
157 
158 	/*! @method HandleChannelPressure */
HandleChannelPressure(UInt8 inChannel,UInt8 inValue,UInt32 inStartFrame)159 	virtual OSStatus	HandleChannelPressure(	UInt8 	inChannel,
160 												UInt8 	inValue,
161 												UInt32	inStartFrame) { return noErr; }
162 
163 	/*! @method HandleProgramChange */
HandleProgramChange(UInt8 inChannel,UInt8 inValue)164 	virtual OSStatus	HandleProgramChange(	UInt8 	inChannel,
165 												UInt8 	inValue) { return noErr; }
166 
167 	/*! @method HandlePolyPressure */
HandlePolyPressure(UInt8 inChannel,UInt8 inKey,UInt8 inValue,UInt32 inStartFrame)168 	virtual OSStatus	HandlePolyPressure(		UInt8 	inChannel,
169 												UInt8 	inKey,
170 												UInt8	inValue,
171 												UInt32	inStartFrame) { return noErr; }
172 
173 	/*! @method HandleResetAllControllers */
HandleResetAllControllers(UInt8 inChannel)174 	virtual OSStatus	HandleResetAllControllers(UInt8 inChannel) { return noErr; }
175 
176 	/*! @method HandleAllNotesOff */
HandleAllNotesOff(UInt8 inChannel)177 	virtual OSStatus	HandleAllNotesOff(		UInt8	inChannel) { return noErr; }
178 
179 	/*! @method HandleAllSoundOff */
HandleAllSoundOff(UInt8 inChannel)180 	virtual OSStatus	HandleAllSoundOff(		UInt8	inChannel) { return noErr; }
181 
182 
183 //System messages
184 	/*! @method HandleSysEx */
HandleSysEx(const UInt8 * inData,UInt32 inLength)185 	virtual OSStatus	HandleSysEx(			const UInt8 *	inData,
186                                         		UInt32			inLength ) { return noErr; }
187 
188 #if CA_AUTO_MIDI_MAP
189 	/* map manager */
GetMIDIMapManager()190 	CAAUMIDIMapManager			*GetMIDIMapManager() {return mMapManager;};
191 
192 #endif
193 
194 
195 private:
196 	/*! @var mAUBaseInstance */
197 	AUBase						& mAUBaseInstance;
198 
199 #if CA_AUTO_MIDI_MAP
200 	/* map manager */
201 	CAAUMIDIMapManager			* mMapManager;
202 #endif
203 
204 public:
205 #if !CA_USE_AUDIO_PLUGIN_ONLY
206 	// component dispatcher
207 	/*! @method ComponentEntryDispatch */
208 	static OSStatus			ComponentEntryDispatch(	ComponentParameters 		*params,
209 														AUMIDIBase 					*This);
210 #endif
211 };
212 
213 #endif // __AUMIDIBase_h__
214