Re: Process and Render
Re: Process and Render
- Subject: Re: Process and Render
- From: Doug Wyatt <email@hidden>
- Date: Wed, 23 Jun 2004 04:56:06 -0700
On Jun 22, 2004, at 6:49, Aristotel Digenis wrote:
Thank you for that.
I have had sucess using ProcessBufferList(). This is the first time I
am
using bufferlists so I have one question about that.
In inBufferList.mBuffers[0].mData mData is an array correct?
It's declared void * -- AudioBufferList is defined in
CoreAudio/AudioHardware and is used for many different formats.
So I
should be able to do the following
inBufferList.mBuffers[0].mData[number] = something;
But this does not seem to work. However I can copy mData to a new array
as I have done bellow. For the time being I am working around this by
doing the following:
OSStatus BProc::ProcessBufferLists(AudioUnitRenderActionFlags& iFlags,
const AudioBufferList& inBufferList, AudioBufferList& outBufferList,
UInt32 iFrames)
{
float *W = new float[iFrames];
float *X = new float[iFrames];
float *Y = new float[iFrames];
float *Z = new float[iFrames];
Simpler and much more efficient is:
Float32 *inputPtr = (Float32 *)inBufferList.mBuffers[0].mData
Somewhere in AUEffectBase (ValidateStreamFormat I believe) there is
code that makes your unit refuse stream formats other than
deinterleaved Float32.
You really don't want to be allocating memory in ProcessBufferLists; if
another thread has the malloc lock, rendering will block and most
likely glitch.
Doug
W = (float*) inBufferList.mBuffers[0].mData;
X = (float*) inBufferList.mBuffers[1].mData;
Y = (float*) inBufferList.mBuffers[2].mData;
Z = (float*) inBufferList.mBuffers[3].mData;
for(UInt32 i = 0; i < iFrames; i++)
{
W[i] = W[i] * fValue_Rotate;
X[i] = X[i] * fValue_Rotate;
Y[i] = Y[i] * fValue_Rotate;
Z[i] = Z[i] * fValue_Rotate;
}
outBufferList.mBuffers[0].mData = W;
outBufferList.mBuffers[1].mData = X;
outBufferList.mBuffers[2].mData = Y;
outBufferList.mBuffers[3].mData = Z;
return noErr;
}
Is there a way avoid the extra code and read a specific array slot of a
specific buffer array of a bufferlist? Such as:
inBufferList.mBuffers[0].mData[number] = something;
Thank you...
William Stewart wrote:
AudioUnitRender is the API
In AUBase (from AUDispatch) the API calls Render, which then drills
down some levels... Ultimately everything below here is implementation
detail
In AUEffectBase we specialise this some more because most effects
process N-N channels = so we introduced the Kernel classes... If you
don't want to use Kernels, then you can overide ProcessBufferList (the
method in AUEffectBase that calls through to the kernels)
Bill
On 21/06/2004, at 2:45 AM, Aristotel Digenis wrote:
Goodmorning,
Over the weekend I have gone over the documentation of the SDK and
have some more questions.
It appears that when processing N to N number of channels where
there is no interaction between the channels for the processing,
then we implement a new AUKernelBase and the processing for each
of the N channels happens inside the Kernel. An example of this
would be a gain plug-in where we have one slider for
amplitude...we can put in 10 channels and we will output 10
channels out, all amplified by the same ratio set by the slider.
If the processing of N to N channels requires that the data from
one channel can affect the other channel, then we implement
ProcessBufferLists()? This function internally calls
AUKernelBases? I have not managed to find enough information on
this or how it is implemented.
Then there is AudioUnitRender() which doesn't seem to be intended
for plugins (AUEffectBase type of Audio Units). To add to the
confusion i have also come accross Render(), DoRender(),
DoRenderBus(), DoRenderSlice()
Could somebody who does understand the differences and uses help
me out please?
Thank you in advance!!!
Aristotel Digenis wrote:
Hello again,
As I have been using the SDK's SampleEffectUnit example to
learn AUs and adapt it to my needs, I have notices that the
Process() function is declared within a class inside the
SampleEffectUnit class as shown below.
class SampleEffectUnit : public AUEffectBase
{
public:
SampleEffectUnit(AudioUnit component);
virtual AUKernelBase * NewKernel() { return new
SampleEffectKernel(this); }
virtual ComponentResult GetParameterValueStrings();
virtual ComponentResult GetParameterInfo();
virtual ComponentResult GetPropertyInfo();
virtual ComponentResult GetProperty();
virtual ComponentResult GetPresets() const;
virtual OSStatus NewFactoryPresetSet ();
virtual ComponentResult Version() { return
kSampleEffectUnitVersion; }
protected:
class SampleEffectKernel : public AUKernelBase
{
public:
SampleEffectKernel(AUEffectBase *inAudioUnit ):
AUKernelBase(inAudioUnit){}
virtual void Process();
virtual void Reset();
}; };
I understand the purpose of the AUKernelBase but then I saw
the source code of AirSynth where the Process() function is
not declared inside a seperate AUKernel class. Instead the
Process function is declared inside the AirySynth class. I
tried to move the Process() function of my plug in out of the
SampleEffectKernel class and inside the SampleEffectUnit
class, but this results in no processing taking place. Does
the fact that AirySynth is a MusicDevice make a difference? Do
MusicDevices have different processing structure to Effect
Units?
Also, use SetParameter() functions in my constructor to set
the initial values of my sliders. This works fine and the
sliders do have an effect on the processing. Having read the
API documentation I thought it would be better to use
Initialize() to set these parameters, and so I declared the
Initialize() function after the SampleEffectUnit constructor
and moved the SetParameter() functions inside the Initialze()
function. This compiles and the sliders/parameters are set
just fine. However when the sliders are changed, the
processing this does is not affected. Did I misunderstand what
the Initialize() function is for?
Thank you in advance...
--
Aristotel Digenis
email@hidden
http://www.digenis.ws
_______________________________________________
coreaudio-api mailing list | email@hidden
Help/Unsubscribe/Archives:
http://www.lists.apple.com/mailman/listinfo/coreaudio-api
Do not post admin requests to the list. They will be ignored.
-- mailto:email@hidden
tel: +1 408 974 4056
______________________________________________________________________
____
Culture Ship Names:
Ravished By The Sheer Implausibility Of That Last Statement [GSV]
I said, I've Got A Big Stick [OU]
Inappropiate Response [OU]
Far Over The Borders Of Insanity And Still Accelerating [Eccentric]
______________________________________________________________________
____
_______________________________________________
coreaudio-api mailing list | email@hidden
Help/Unsubscribe/Archives:
http://www.lists.apple.com/mailman/listinfo/coreaudio-api
Do not post admin requests to the list. They will be ignored.
_______________________________________________
coreaudio-api mailing list | email@hidden
Help/Unsubscribe/Archives:
http://www.lists.apple.com/mailman/listinfo/coreaudio-api
Do not post admin requests to the list. They will be ignored.