41 #include "MusicDeviceBase.h"
45 (*TEMP_MusicDeviceMIDIEventProc)(
void * inComponentStorage,
49 UInt32 inOffsetSampleFrame);
52 (*TEMP_MusicDeviceStartNoteProc)(
void * inComponentStorage,
53 MusicDeviceInstrumentID inInstrument,
54 MusicDeviceGroupID inGroupID,
55 NoteInstanceID * outNoteInstanceID,
56 UInt32 inOffsetSampleFrame,
57 const MusicDeviceNoteParams * inParams);
60 (*TEMP_MusicDeviceStopNoteProc)(
void * inComponentStorage,
61 MusicDeviceGroupID inGroupID,
62 NoteInstanceID inNoteInstanceID,
63 UInt32 inOffsetSampleFrame);
66 static OSStatus MusicDeviceBaseMIDIEvent(
void * inComponentStorage,
70 UInt32 inOffsetSampleFrame);
72 static OSStatus MusicDeviceBaseStartNote(
void * inComponentStorage,
73 MusicDeviceInstrumentID inInstrument,
74 MusicDeviceGroupID inGroupID,
75 NoteInstanceID * outNoteInstanceID,
76 UInt32 inOffsetSampleFrame,
77 const MusicDeviceNoteParams * inParams);
79 static OSStatus MusicDeviceBaseStopNote(
void * inComponentStorage,
80 MusicDeviceGroupID inGroupID,
81 NoteInstanceID inNoteInstanceID,
82 UInt32 inOffsetSampleFrame);
86 MusicDeviceBase::MusicDeviceBase(AudioComponentInstance inInstance,
91 : AUBase(inInstance, numInputs, numOutputs, numGroups, numParts),
96 OSStatus MusicDeviceBase::GetPropertyInfo(AudioUnitPropertyID inID,
97 AudioUnitScope inScope,
98 AudioUnitElement inElement,
100 Boolean & outWritable)
106 case kMusicDeviceProperty_InstrumentCount:
107 if (inScope != kAudioUnitScope_Global)
return kAudioUnitErr_InvalidScope;
108 outDataSize =
sizeof(UInt32);
114 result = AUBase::GetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
116 if (result == kAudioUnitErr_InvalidProperty)
117 result = AUMIDIBase::DelegateGetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
123 OSStatus MusicDeviceBase::GetProperty( AudioUnitPropertyID inID,
124 AudioUnitScope inScope,
125 AudioUnitElement inElement,
132 #if !CA_AU_IS_ONLY_PLUGIN
133 case kAudioUnitProperty_FastDispatch:
134 if (inElement == kMusicDeviceMIDIEventSelect) {
135 *(TEMP_MusicDeviceMIDIEventProc *)outData = MusicDeviceBaseMIDIEvent;
138 else if (inElement == kMusicDeviceStartNoteSelect) {
139 *(TEMP_MusicDeviceStartNoteProc *)outData = MusicDeviceBaseStartNote;
142 else if (inElement == kMusicDeviceStopNoteSelect) {
143 *(TEMP_MusicDeviceStopNoteProc *)outData = MusicDeviceBaseStopNote;
146 return kAudioUnitErr_InvalidElement;
149 case kMusicDeviceProperty_InstrumentCount:
150 if (inScope != kAudioUnitScope_Global)
return kAudioUnitErr_InvalidScope;
151 return GetInstrumentCount (*(UInt32*)outData);
154 result = AUBase::GetProperty (inID, inScope, inElement, outData);
156 if (result == kAudioUnitErr_InvalidProperty)
157 result = AUMIDIBase::DelegateGetProperty (inID, inScope, inElement, outData);
164 OSStatus MusicDeviceBase::SetProperty( AudioUnitPropertyID inID,
165 AudioUnitScope inScope,
166 AudioUnitElement inElement,
172 OSStatus result = AUBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
174 if (result == kAudioUnitErr_InvalidProperty)
175 result = AUMIDIBase::DelegateSetProperty (inID, inScope, inElement, inData, inDataSize);
182 OSStatus MusicDeviceBase::GetInstrumentCount (UInt32 &outInstCount)
const
188 OSStatus MusicDeviceBase::HandleNoteOn( UInt8 inChannel,
193 MusicDeviceNoteParams params;
195 params.mPitch = inNoteNumber;
196 params.mVelocity = inVelocity;
197 return StartNote (kMusicNoteEvent_UseGroupInstrument, inChannel, NULL, inStartFrame, params);
200 OSStatus MusicDeviceBase::HandleNoteOff( UInt8 inChannel,
205 return StopNote (inChannel, inNoteNumber, inStartFrame);
209 MusicDeviceBase::HandleStartNoteMessage (MusicDeviceInstrumentID inInstrument,
210 MusicDeviceGroupID inGroupID,
211 NoteInstanceID * outNoteInstanceID,
212 UInt32 inOffsetSampleFrame,
213 const MusicDeviceNoteParams * inParams)
215 if (inParams == NULL || outNoteInstanceID == NULL)
return paramErr;
217 if (!IsInitialized())
return kAudioUnitErr_Uninitialized;
219 return StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, *inParams);
225 #define PARAM(_typ, _name, _index, _nparams) \
226 _typ _name = *(_typ *)¶ms->params[_index + 1];
229 #define PARAM(_typ, _name, _index, _nparams) \
230 _typ _name = *(_typ *)¶ms->params[_nparams - 1 - _index];
232 #elif TARGET_OS_WIN32
234 #define PARAM(_typ, _name, _index, _nparams) \
235 _typ _name = *(_typ *)¶ms->params[_index];
238 #if !TARGET_OS_IPHONE
239 OSStatus MusicDeviceBase::ComponentEntryDispatch( ComponentParameters * params,
240 MusicDeviceBase * This)
242 if (This == NULL)
return paramErr;
246 switch (params->what) {
247 case kMusicDeviceMIDIEventSelect:
248 case kMusicDeviceSysExSelect:
250 result = AUMIDIBase::ComponentEntryDispatch (params, This);
253 case kMusicDevicePrepareInstrumentSelect:
255 PARAM(MusicDeviceInstrumentID, inInstrument, 0, 1);
256 result = This->PrepareInstrument(inInstrument);
259 case kMusicDeviceReleaseInstrumentSelect:
261 PARAM(MusicDeviceInstrumentID, inInstrument, 0, 1);
262 result = This->ReleaseInstrument(inInstrument);
265 case kMusicDeviceStartNoteSelect:
267 PARAM(MusicDeviceInstrumentID, pbinInstrument, 0, 5);
268 PARAM(MusicDeviceGroupID, pbinGroupID, 1, 5);
269 PARAM(NoteInstanceID *, pboutNoteInstanceID, 2, 5);
270 PARAM(UInt32, pbinOffsetSampleFrame, 3, 5);
271 PARAM(
const MusicDeviceNoteParams *, pbinParams, 4, 5);
272 result = This->HandleStartNoteMessage(pbinInstrument, pbinGroupID, pboutNoteInstanceID, pbinOffsetSampleFrame, pbinParams);
275 case kMusicDeviceStopNoteSelect:
277 PARAM(MusicDeviceGroupID, pbinGroupID, 0, 3);
278 PARAM(NoteInstanceID, pbinNoteInstanceID, 1, 3);
279 PARAM(UInt32, pbinOffsetSampleFrame, 2, 3);
280 result = This->StopNote(pbinGroupID, pbinNoteInstanceID, pbinOffsetSampleFrame);
285 result = AUBase::ComponentEntryDispatch(params, This);
295 static OSStatus MusicDeviceBaseMIDIEvent(
void * inComponentStorage,
299 UInt32 inOffsetSampleFrame)
301 OSStatus result = noErr;
303 MusicDeviceBase *This =
static_cast<MusicDeviceBase *
>(inComponentStorage);
304 if (This == NULL)
return paramErr;
305 result = This->MIDIEvent(inStatus, inData1, inData2, inOffsetSampleFrame);
311 OSStatus MusicDeviceBaseStartNote(
void * inComponentStorage,
312 MusicDeviceInstrumentID inInstrument,
313 MusicDeviceGroupID inGroupID,
314 NoteInstanceID * outNoteInstanceID,
315 UInt32 inOffsetSampleFrame,
316 const MusicDeviceNoteParams * inParams)
318 OSStatus result = noErr;
320 if (inParams == NULL || outNoteInstanceID == NULL)
return paramErr;
321 MusicDeviceBase *This =
static_cast<MusicDeviceBase *
>(inComponentStorage);
322 if (This == NULL)
return paramErr;
323 result = This->StartNote(inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, *inParams);
329 OSStatus MusicDeviceBaseStopNote(
void * inComponentStorage,
330 MusicDeviceGroupID inGroupID,
331 NoteInstanceID inNoteInstanceID,
332 UInt32 inOffsetSampleFrame)
334 OSStatus result = noErr;
336 MusicDeviceBase *This =
static_cast<MusicDeviceBase *
>(inComponentStorage);
337 if (This == NULL)
return paramErr;
338 result = This->StopNote(inGroupID, inNoteInstanceID, inOffsetSampleFrame);