41 #ifndef __AUScopeElement_h__
42 #define __AUScopeElement_h__
47 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
48 #include <AudioUnit/AudioUnit.h>
50 #include <AudioUnit.h>
52 #include "ComponentBase.h"
62 class ParameterMapEvent
67 : mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(0.0), mValue2(0.0), mSliceDurationFrames(0)
71 ParameterMapEvent(AudioUnitParameterValue inValue)
72 : mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(inValue), mValue2(inValue), mSliceDurationFrames(0)
77 ParameterMapEvent(
const AudioUnitParameterEvent &inEvent,
78 UInt32 inSliceOffsetInBuffer,
79 UInt32 inSliceDurationFrames )
81 SetScheduledEvent(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames );
85 void SetScheduledEvent(
const AudioUnitParameterEvent &inEvent,
86 UInt32 inSliceOffsetInBuffer,
87 UInt32 inSliceDurationFrames )
89 mEventType = inEvent.eventType;
90 mSliceDurationFrames = inSliceDurationFrames;
92 if(mEventType == kParameterEvent_Immediate )
95 mValue1 = inEvent.eventValues.immediate.value;
97 mDurationInFrames = inSliceDurationFrames;
102 mDurationInFrames = inEvent.eventValues.ramp.durationInFrames;
103 mBufferOffset = inEvent.eventValues.ramp.startBufferOffset - inSliceOffsetInBuffer;
104 mValue1 = inEvent.eventValues.ramp.startValue;
105 mValue2 = inEvent.eventValues.ramp.endValue;
112 AUParameterEventType GetEventType()
const {
return mEventType;};
115 AudioUnitParameterValue GetValue()
const {
return mValue1;};
117 AudioUnitParameterValue GetEndValue()
const {
return mValue2;};
119 void SetValue(AudioUnitParameterValue inValue)
121 mEventType = kParameterEvent_Immediate;
131 void GetRampSliceStartEnd( AudioUnitParameterValue & outStartValue,
132 AudioUnitParameterValue & outEndValue,
133 AudioUnitParameterValue & outValuePerFrameDelta )
135 if (mEventType == kParameterEvent_Ramped) {
136 outValuePerFrameDelta = (mValue2 - mValue1) / mDurationInFrames;
138 outStartValue = mValue1 + outValuePerFrameDelta * (-mBufferOffset);
139 outEndValue = outStartValue + outValuePerFrameDelta * mSliceDurationFrames;
141 outValuePerFrameDelta = 0;
142 outStartValue = outEndValue = mValue1;
151 void GetRampInfo( SInt32 & outBufferOffset,
152 UInt32 & outDurationInFrames,
153 AudioUnitParameterValue & outStartValue,
154 AudioUnitParameterValue & outEndValue )
156 outBufferOffset = mBufferOffset;
157 outDurationInFrames = mDurationInFrames;
158 outStartValue = mValue1;
159 outEndValue = mValue2;
165 printf(
"ParameterEvent @ %p\n",
this);
166 printf(
" mEventType = %d\n", (
int)mEventType);
167 printf(
" mBufferOffset = %d\n", (
int)mBufferOffset);
168 printf(
" mDurationInFrames = %d\n", (
int)mDurationInFrames);
169 printf(
" mSliceDurationFrames = %d\n", (
int)mSliceDurationFrames);
170 printf(
" mValue1 = %.5f\n", mValue1);
171 printf(
" mValue2 = %.5f\n", mValue2);
176 AUParameterEventType mEventType;
178 SInt32 mBufferOffset;
179 UInt32 mDurationInFrames;
180 AudioUnitParameterValue mValue1;
181 AudioUnitParameterValue mValue2;
183 UInt32 mSliceDurationFrames;
195 AUElement(AUBase *audioUnit) : mAudioUnit(audioUnit),
196 mUseIndexedParameters(false), mElementName(0) { }
199 virtual ~AUElement() {
if (mElementName) CFRelease (mElementName); }
202 UInt32 GetNumberOfParameters()
204 if(mUseIndexedParameters)
return mIndexedParameters.size();
else return mParameters.size();
207 void GetParameterList(AudioUnitParameterID *outList);
210 AudioUnitParameterValue GetParameter(AudioUnitParameterID paramID);
212 void SetParameter(AudioUnitParameterID paramID, AudioUnitParameterValue value,
bool okWhenInitialized =
false);
218 void GetRampSliceStartEnd( AudioUnitParameterID paramID,
219 AudioUnitParameterValue & outStartValue,
220 AudioUnitParameterValue & outEndValue,
221 AudioUnitParameterValue & outValuePerFrameDelta );
224 AudioUnitParameterValue GetEndValue( AudioUnitParameterID paramID);
227 void SetScheduledEvent( AudioUnitParameterID paramID,
228 const AudioUnitParameterEvent &inEvent,
229 UInt32 inSliceOffsetInBuffer,
230 UInt32 inSliceDurationFrames,
231 bool okWhenInitialized =
false );
236 AUBase * GetAudioUnit()
const {
return mAudioUnit; };
239 void SaveState(CFMutableDataRef data);
241 const UInt8 * RestoreState(
const UInt8 *state);
243 CFStringRef GetName ()
const {
return mElementName; }
245 void SetName (CFStringRef inName);
247 bool HasName ()
const {
return mElementName != 0; }
249 virtual void UseIndexedParameters(
int inNumberOfParameters);
252 inline ParameterMapEvent& GetParamEvent(AudioUnitParameterID paramID);
255 typedef std::map<AudioUnitParameterID, ParameterMapEvent, std::less<AudioUnitParameterID> > ParameterMap;
260 ParameterMap mParameters;
263 bool mUseIndexedParameters;
265 std::vector<ParameterMapEvent> mIndexedParameters;
268 CFStringRef mElementName;
276 class AUIOElement :
public AUElement {
279 AUIOElement(AUBase *audioUnit);
282 const CAStreamBasicDescription &GetStreamFormat()
const {
return mStreamFormat; }
285 virtual OSStatus SetStreamFormat(
const CAStreamBasicDescription &desc);
288 virtual void AllocateBuffer(UInt32 inFramesToAllocate = 0);
290 void DeallocateBuffer();
292 virtual bool NeedsBufferSpace()
const = 0;
295 void SetWillAllocateBuffer(
bool inFlag) {
296 mWillAllocate = inFlag;
299 bool WillAllocateBuffer()
const {
300 return mWillAllocate;
304 void UseExternalBuffer(
const AudioUnitExternalBuffer &buf) {
305 mIOBuffer.UseExternalBuffer(mStreamFormat, buf);
308 AudioBufferList & PrepareBuffer(UInt32 nFrames) {
310 return mIOBuffer.PrepareBuffer(mStreamFormat, nFrames);
311 throw OSStatus(kAudioUnitErr_InvalidPropertyValue);
314 AudioBufferList & PrepareNullBuffer(UInt32 nFrames) {
315 return mIOBuffer.PrepareNullBuffer(mStreamFormat, nFrames);
318 AudioBufferList & SetBufferList(AudioBufferList &abl) {
return mIOBuffer.SetBufferList(abl); }
320 void SetBuffer(UInt32 index, AudioBuffer &ab) { mIOBuffer.SetBuffer(index, ab); }
322 void InvalidateBufferList() { mIOBuffer.InvalidateBufferList(); }
325 AudioBufferList & GetBufferList()
const {
return mIOBuffer.GetBufferList(); }
328 AudioUnitSampleType * GetChannelData(
int ch)
const {
329 if (mStreamFormat.IsInterleaved())
330 return static_cast<AudioUnitSampleType *>(mIOBuffer.GetBufferList().mBuffers[0].mData) + ch;
332 return static_cast<AudioUnitSampleType *
>(mIOBuffer.GetBufferList().mBuffers[ch].mData);
334 SInt16 * GetInt16ChannelData(
int ch)
const {
335 if (mStreamFormat.IsInterleaved())
336 return static_cast<SInt16 *>(mIOBuffer.GetBufferList().mBuffers[0].mData) + ch;
338 return static_cast<SInt16 *
>(mIOBuffer.GetBufferList().mBuffers[ch].mData);
342 void CopyBufferListTo(AudioBufferList &abl)
const {
343 mIOBuffer.CopyBufferListTo(abl);
346 void CopyBufferContentsTo(AudioBufferList &abl)
const {
347 mIOBuffer.CopyBufferContentsTo(abl);
357 bool IsInterleaved()
const {
return mStreamFormat.IsInterleaved(); }
359 UInt32 NumberChannels()
const {
return mStreamFormat.NumberChannels(); }
361 UInt32 NumberInterleavedChannels()
const {
return mStreamFormat.NumberInterleavedChannels(); }
364 virtual UInt32 GetChannelLayoutTags (AudioChannelLayoutTag *outLayoutTagsPtr);
367 virtual UInt32 GetAudioChannelLayout (AudioChannelLayout *outMapPtr, Boolean &outWritable);
370 virtual OSStatus SetAudioChannelLayout (
const AudioChannelLayout &inData);
373 virtual OSStatus RemoveAudioChannelLayout ();
377 CAStreamBasicDescription mStreamFormat;
379 AUBufferList mIOBuffer;
388 class AUElementCreator {
391 virtual AUElement * CreateElement(AudioUnitScope scope, AudioUnitElement element) = 0;
392 virtual ~AUElementCreator() { }
399 class AUScopeDelegate {
402 AUScopeDelegate() : mCreator(NULL), mScope(0) { }
404 virtual ~AUScopeDelegate() {}
407 virtual void Initialize( AUElementCreator *creator,
408 AudioUnitScope scope,
413 SetNumberOfElements(numElements);
417 virtual void SetNumberOfElements(UInt32 numElements) = 0;
420 virtual UInt32 GetNumberOfElements() = 0;
423 virtual AUElement * GetElement(UInt32 elementIndex) = 0;
425 AUElementCreator * GetCreator()
const {
return mCreator; }
426 AudioUnitScope GetScope()
const {
return mScope; }
431 AUElementCreator * mCreator;
433 AudioUnitScope mScope;
444 AUScope() : mCreator(NULL), mScope(0), mDelegate(0) { }
449 void Initialize(AUElementCreator *creator,
450 AudioUnitScope scope,
454 return mDelegate->Initialize(creator, scope, numElements);
458 SetNumberOfElements(numElements);
462 void SetNumberOfElements(UInt32 numElements);
465 UInt32 GetNumberOfElements()
const
468 return mDelegate->GetNumberOfElements();
470 return mElements.size();
474 AUElement * GetElement(UInt32 elementIndex)
const
477 return mDelegate->GetElement(elementIndex);
479 ElementVector::const_iterator i = mElements.begin() + elementIndex;
481 return (i >= mElements.end() || i < mElements.begin()) ? NULL : *i;
485 AUElement * SafeGetElement(UInt32 elementIndex)
487 AUElement *element = GetElement(elementIndex);
489 COMPONENT_THROW(kAudioUnitErr_InvalidElement);
494 AUIOElement * GetIOElement(UInt32 elementIndex)
const
496 AUElement *element = GetElement(elementIndex);
499 if (element == NULL || (ioel = dynamic_cast<AUIOElement *>(element)) == NULL)
500 COMPONENT_THROW (kAudioUnitErr_InvalidElement);
502 if (element == NULL || (ioel = static_cast<AUIOElement *>(element)) == NULL)
503 COMPONENT_THROW (kAudioUnitErr_InvalidElement);
509 bool HasElementWithName ()
const;
512 void AddElementNamesToDict (CFMutableDictionaryRef & inNameDict);
514 bool RestoreElementNames (CFDictionaryRef& inNameDict);
516 AUElementCreator * GetCreator()
const {
return mCreator; }
517 AudioUnitScope GetScope()
const {
return mScope; }
519 void SetDelegate(AUScopeDelegate* inDelegate) { mDelegate = inDelegate; }
522 typedef std::vector<AUElement *> ElementVector;
524 AUElementCreator * mCreator;
526 AudioUnitScope mScope;
528 ElementVector mElements;
530 AUScopeDelegate * mDelegate;
535 #endif // __AUScopeElement_h__