1 #include "PlugtasticAUEffect.h"
4 COMPONENT_ENTRY(PlugtasticAUEffect)
7 PlugtasticAUEffect::PlugtasticAUEffect(AudioUnit component) :
8 AUEffectBase::AUEffectBase(component, false)
11 Globals()->UseIndexedParameters(kNumberOfParameters);
13 #ifdef PlugtasticAUEffect_HasSidechainInput
15 OSStatus status = SetBusCount(kAudioUnitScope_Input, 2);
16 TT_ASSERT(setBusCount, status == noErr);
19 #if AU_DEBUG_DISPATCHER
20 mDebugDispatcher =
new AUDebugDispatcher (
this);
23 mGraph =
new PlugtasticAUEffectGraph;
24 mParameters =
new PlugtasticAUParameters;
25 mParameters->setDefaults(
this);
29 OSStatus PlugtasticAUEffect::GetParameterValueStrings(AudioUnitScope inScope,
30 AudioUnitParameterID inParameterID,
31 CFArrayRef* outStrings)
33 return kAudioUnitErr_InvalidProperty;
37 OSStatus PlugtasticAUEffect::GetParameterInfo(AudioUnitScope inScope,
38 AudioUnitParameterID inParameterID,
39 AudioUnitParameterInfo &outParameterInfo )
41 return mParameters->getInfo(inScope, inParameterID, outParameterInfo);
45 OSStatus PlugtasticAUEffect::GetPropertyInfo(AudioUnitPropertyID inID,
46 AudioUnitScope inScope,
47 AudioUnitElement inElement,
51 return AUEffectBase::GetPropertyInfo(inID, inScope, inElement, outDataSize, outWritable);
55 OSStatus PlugtasticAUEffect::GetProperty(AudioUnitPropertyID inID,
56 AudioUnitScope inScope,
57 AudioUnitElement inElement,
60 return AUEffectBase::GetProperty(inID, inScope, inElement, outData);
64 ComponentResult PlugtasticAUEffect::SetParameter(AudioUnitParameterID inID,
65 AudioUnitScope inScope,
66 AudioUnitElement inElement,
68 UInt32 inBufferOffsetInFrames)
70 mParameters->setParameter(mGraph, inID,inValue);
71 return AUBase::SetParameter(inID, inScope, inElement, inValue, inBufferOffsetInFrames);
75 void PlugtasticAUEffect::SetParameter(AudioUnitParameterID inID, Float32 inValue)
77 mParameters->setParameter(mGraph, inID, inValue);
78 AUEffectBase::SetParameter(inID, inValue);
84 OSStatus PlugtasticAUEffect::ProcessBufferLists(AudioUnitRenderActionFlags& ioActionFlags,
85 const AudioBufferList& inBufferList,
86 AudioBufferList& outBufferList,
88 const AudioBufferList* inSidechainBufferList,
89 AudioBufferList* outSidechainBufferList)
91 mGraph->mVectorSize = nFrames;
92 mGraph->process(&inBufferList, &outBufferList, inSidechainBufferList, outSidechainBufferList);
97 ioActionFlags &= ~kAudioUnitRenderAction_OutputIsSilence;
103 OSStatus PlugtasticAUEffect::ProcessBufferLists(AudioUnitRenderActionFlags& ioActionFlags,
104 const AudioBufferList& inBufferList,
105 AudioBufferList& outBufferList,
108 return ProcessBufferLists(ioActionFlags, inBufferList, outBufferList, nFrames, NULL, NULL);
119 OSStatus PlugtasticAUEffect::ProcessScheduledSlice(
void *inUserData,
120 UInt32 inStartFrameInBuffer,
121 UInt32 inSliceFramesToProcess,
122 UInt32 inTotalBufferFrames )
124 PlugtasticScheduledProcessParams& sliceParams = *((PlugtasticScheduledProcessParams*)inUserData);
125 AudioUnitRenderActionFlags& actionFlags = *sliceParams.au.actionFlags;
126 AudioBufferList& inputBufferList = *sliceParams.au.inputBufferList;
127 AudioBufferList& outputBufferList = *sliceParams.au.outputBufferList;
128 AudioBufferList* sidechainInputBufferList = sliceParams.sidechainInputBufferList;
129 AudioBufferList* sidechainOutputBufferList = sliceParams.sidechainOutputBufferList;
132 for (
unsigned int i=0; i < inputBufferList.mNumberBuffers; i++) {
133 inputBufferList.mBuffers[i].mDataByteSize = (inputBufferList.mBuffers[i].mNumberChannels * inSliceFramesToProcess *
sizeof(AudioUnitSampleType));
136 for (
unsigned int i = 0; i < outputBufferList.mNumberBuffers; i++) {
137 outputBufferList.mBuffers[i].mDataByteSize = (outputBufferList.mBuffers[i].mNumberChannels * inSliceFramesToProcess *
sizeof(AudioUnitSampleType));
141 OSStatus result = ProcessBufferLists(actionFlags, inputBufferList, outputBufferList, inSliceFramesToProcess, sidechainInputBufferList, sidechainOutputBufferList);
144 for (
unsigned int i = 0; i < inputBufferList.mNumberBuffers; i++) {
145 inputBufferList.mBuffers[i].mData = (AudioUnitSampleType *)inputBufferList.mBuffers[i].mData + inputBufferList.mBuffers[i].mNumberChannels * inSliceFramesToProcess;
148 for (
unsigned int i = 0; i < outputBufferList.mNumberBuffers; i++) {
149 outputBufferList.mBuffers[i].mData = (AudioUnitSampleType *)outputBufferList.mBuffers[i].mData + outputBufferList.mBuffers[i].mNumberChannels * inSliceFramesToProcess;
156 OSStatus PlugtasticAUEffect::Render(AudioUnitRenderActionFlags& ioActionFlags,
157 const AudioTimeStamp& inTimeStamp,
161 return kAudioUnitErr_NoConnection;
163 OSStatus result = noErr;
164 AUOutputElement* theOutput = GetOutput(0);
165 AUInputElement* theInput = GetInput(0);
166 AUOutputElement* theSidechainOutput = NULL;
167 AUInputElement* theSidechainInput = NULL;
169 #ifdef PlugtasticAUEffect_HasSidechainOutput
170 theSidechainOutput = GetOutput(1);
172 #ifdef PlugtasticAUEffect_HasSidechainInput
173 theSidechainInput = GetInput(1);
176 result = theInput->PullInput(ioActionFlags, inTimeStamp, 0 , nFrames);
177 if (theSidechainInput && result == noErr)
178 result = theSidechainInput->PullInput(ioActionFlags, inTimeStamp, 0 , nFrames);
180 if (result == noErr) {
181 if (ProcessesInPlace() && theOutput->WillAllocateBuffer()) {
182 theOutput->SetBufferList(theInput->GetBufferList() );
185 if (ShouldBypassEffect()) {
188 if (!ProcessesInPlace()) {
189 theInput->CopyBufferContentsTo (theOutput->GetBufferList());
193 if (mParamList.size() == 0 ) {
195 #ifdef PlugtasticAUEffect_HasSidechainInput
196 result = ProcessBufferLists(ioActionFlags, theInput->GetBufferList(), theOutput->GetBufferList(), nFrames, &theSidechainInput->GetBufferList(), NULL);
198 result = ProcessBufferLists(ioActionFlags, theInput->GetBufferList(), theOutput->GetBufferList(), nFrames);
204 AudioBufferList& inputBufferList = theInput->GetBufferList();
205 AudioBufferList& outputBufferList = theOutput->GetBufferList();
206 AudioBufferList* sidechainInputBufferList = NULL;
207 AudioBufferList* sidechainOutputBufferList = NULL;
209 #ifdef PlugtasticAUEffect_HasSidechainOutput
210 sidechainOutputBufferList = &theSidechainOutput->GetBufferList();
212 #ifdef PlugtasticAUEffect_HasSidechainInput
213 sidechainInputBufferList = &theSidechainInput->GetBufferList();
216 PlugtasticScheduledProcessParams processParams;
217 processParams.au.actionFlags = &ioActionFlags;
218 processParams.au.inputBufferList = &inputBufferList;
219 processParams.au.outputBufferList = &outputBufferList;
220 processParams.sidechainInputBufferList = sidechainInputBufferList;
221 processParams.sidechainOutputBufferList = sidechainOutputBufferList;
225 result = ProcessForScheduledParams(mParamList, nFrames, &processParams);
228 for (
unsigned int i=0; i < inputBufferList.mNumberBuffers; i++ ) {
229 inputBufferList.mBuffers[i].mData = (AudioUnitSampleType *)inputBufferList.mBuffers[i].mData - inputBufferList.mBuffers[i].mNumberChannels * nFrames;
230 inputBufferList.mBuffers[i].mDataByteSize = (inputBufferList.mBuffers[i].mNumberChannels * nFrames *
sizeof(AudioUnitSampleType));
233 for (
unsigned int i=0; i < outputBufferList.mNumberBuffers; i++ ) {
234 outputBufferList.mBuffers[i].mData = (AudioUnitSampleType *)outputBufferList.mBuffers[i].mData - outputBufferList.mBuffers[i].mNumberChannels * nFrames;
235 outputBufferList.mBuffers[i].mDataByteSize = (outputBufferList.mBuffers[i].mNumberChannels * nFrames *
sizeof(AudioUnitSampleType));
240 if ((ioActionFlags & kAudioUnitRenderAction_OutputIsSilence) && !ProcessesInPlace()) {
241 AUBufferList::ZeroBuffer(theOutput->GetBufferList() );