41 #ifndef __AUInstrumentBase__
42 #define __AUInstrumentBase__
46 #include <AudioUnit/AudioUnit.h>
47 #include <CoreAudio/CoreAudio.h>
48 #include "MusicDeviceBase.h"
49 #include "LockFreeFIFO.h"
50 #include "SynthEvent.h"
51 #include "SynthNote.h"
52 #include "SynthElement.h"
56 typedef LockFreeFIFOWithFree<SynthEvent> SynthEventQueue;
58 class AUInstrumentBase :
public MusicDeviceBase
62 ComponentInstance inInstance,
65 UInt32 numGroups = 32,
67 virtual ~AUInstrumentBase();
69 virtual OSStatus Initialize();
71 virtual void Cleanup();
73 virtual AUElement* CreateElement( AudioUnitScope scope,
74 AudioUnitElement element);
76 virtual OSStatus Reset( AudioUnitScope inScope,
77 AudioUnitElement inElement);
79 virtual bool ValidFormat( AudioUnitScope inScope,
80 AudioUnitElement inElement,
81 const CAStreamBasicDescription & inNewFormat);
83 virtual bool StreamFormatWritable( AudioUnitScope scope,
84 AudioUnitElement element);
86 virtual OSStatus Render( AudioUnitRenderActionFlags & ioActionFlags,
87 const AudioTimeStamp & inTimeStamp,
88 UInt32 inNumberFrames);
90 virtual OSStatus StartNote( MusicDeviceInstrumentID inInstrument,
91 MusicDeviceGroupID inGroupID,
92 NoteInstanceID * outNoteInstanceID,
93 UInt32 inOffsetSampleFrame,
94 const MusicDeviceNoteParams &inParams);
96 virtual OSStatus StopNote( MusicDeviceGroupID inGroupID,
97 NoteInstanceID inNoteInstanceID,
98 UInt32 inOffsetSampleFrame);
100 virtual OSStatus RealTimeStartNote( SynthGroupElement *inGroup,
101 NoteInstanceID inNoteInstanceID,
102 UInt32 inOffsetSampleFrame,
103 const MusicDeviceNoteParams &inParams);
105 virtual OSStatus RealTimeStopNote( MusicDeviceGroupID inGroupID,
106 NoteInstanceID inNoteInstanceID,
107 UInt32 inOffsetSampleFrame);
109 virtual OSStatus HandleControlChange( UInt8 inChannel,
112 UInt32 inStartFrame);
114 virtual OSStatus HandlePitchWheel( UInt8 inChannel,
117 UInt32 inStartFrame);
119 virtual OSStatus HandleChannelPressure( UInt8 inChannel,
121 UInt32 inStartFrame);
123 virtual OSStatus HandleProgramChange( UInt8 inChannel,
126 virtual OSStatus HandlePolyPressure( UInt8 inChannel,
129 UInt32 inStartFrame);
131 virtual OSStatus HandleResetAllControllers( UInt8 inChannel);
133 virtual OSStatus HandleAllNotesOff( UInt8 inChannel);
135 virtual OSStatus HandleAllSoundOff( UInt8 inChannel);
137 SynthNote* GetNote(UInt32 inIndex)
139 if (!mNotes)
throw std::runtime_error(
"no notes");
140 return (SynthNote*)((
char*)mNotes + inIndex * mNoteSize);
143 SynthNote* GetAFreeNote(UInt32 inFrame);
144 void AddFreeNote(SynthNote* inNote);
146 MidiControls* GetControls( MusicDeviceGroupID inChannel)
148 SynthGroupElement *group = GetElForGroupID(inChannel);
149 return &(group->mMidiControls);
155 UInt32 NextNoteID() {
return IncrementAtomic(&mNoteIDCounter); }
160 void SetNotes(UInt32 inNumNotes, UInt32 inMaxActiveNotes, SynthNote* inNotes, UInt32 inNoteSize);
162 void PerformEvents(
const AudioTimeStamp & inTimeStamp);
163 OSStatus SendPedalEvent(MusicDeviceGroupID inGroupID, UInt32 inEventType, UInt32 inOffsetSampleFrame);
164 virtual SynthNote* VoiceStealing(UInt32 inFrame,
bool inKillIt);
165 UInt32 MaxActiveNotes()
const {
return mMaxActiveNotes; }
166 UInt32 NumActiveNotes()
const {
return mNumActiveNotes; }
167 void IncNumActiveNotes() { mNumActiveNotes ++; }
168 void DecNumActiveNotes() { mNumActiveNotes --; }
169 UInt32 CountActiveNotes();
171 SynthGroupElement * GetElForGroupID (MusicDeviceGroupID inGroupID);
172 SynthGroupElement * GetElForNoteID (NoteInstanceID inNoteID);
174 SInt64 mAbsoluteSampleFrame;
179 SInt32 mNoteIDCounter;
181 SynthEventQueue mEventQueue;
184 UInt32 mNumActiveNotes;
185 UInt32 mMaxActiveNotes;
187 SynthNoteList mFreeNotes;
193 class AUMonotimbralInstrumentBase :
public AUInstrumentBase
196 AUMonotimbralInstrumentBase(
197 ComponentInstance inInstance,
200 UInt32 numGroups = 32,
201 UInt32 numParts = 0);
203 virtual OSStatus RealTimeStartNote( SynthGroupElement *inGroup,
204 NoteInstanceID inNoteInstanceID,
205 UInt32 inOffsetSampleFrame,
206 const MusicDeviceNoteParams &inParams);
212 class AUMultitimbralInstrumentBase :
public AUInstrumentBase
215 AUMultitimbralInstrumentBase(
216 ComponentInstance inInstance,
222 virtual OSStatus GetPropertyInfo( AudioUnitPropertyID inID,
223 AudioUnitScope inScope,
224 AudioUnitElement inElement,
225 UInt32 & outDataSize,
226 Boolean & outWritable);
228 virtual OSStatus GetProperty( AudioUnitPropertyID inID,
229 AudioUnitScope inScope,
230 AudioUnitElement inElement,
233 virtual OSStatus SetProperty( AudioUnitPropertyID inID,
234 AudioUnitScope inScope,
235 AudioUnitElement inElement,