Re: Stereo Processing
Re: Stereo Processing
- Subject: Re: Stereo Processing
- From: paul Fultz <email@hidden>
- Date: Thu, 22 Mar 2007 12:48:32 -0700 (PDT)
thanks for the help, i got it to work, except now i
cant get the bypass to work, i copied the code from
AUEffectBase, to try and make sure it was right, i
copied GetProperty(), GetPropertyInfo(),
SetProperty(), and i copied the bypass funcions, and
mBypassEffect varaible and initialize it to false like
in the AUEffectBase, but still auval says it is not
supported, i dont know why, also i delete the
ProcessInPlace() stuff, i dont know what that is
exactly, do i need ProcessInPlace to implement bypass?
also, auval gives me a warning saying it can
initialize unit to un-supported num channels to input
channel:1 output channels:2, and input channel:1, and
output channel:4, etc . . ., but the thing is in
Render() it supports 1-2, and 2-2, so how do i setup
my audio unit to only allow initializing to these
combinations of channels? thanks in advance for all
the help. im new to this. and really appreciate it.
Paul
--- William Stewart <email@hidden> wrote:
> Here's a modification of some code we use internally
> - the DSP
> decision can be done more optimally based on what
> your code ends up
> doing...
>
>
> ComponentResult AUMatrixReverb::Render (
> AudioUnitRenderActionFlags
> &ioActionFlags,
> const AudioTimeStamp & inTimeStamp,
> UInt32 framesToProcess)
> {
> AUOutputElement *theOutput = GetOutput(0);
> AUInputElement *theInput = GetInput(0);
>
> // get input source audio
> AudioUnitRenderActionFlags xflags = 0;
> ComponentResult result = PullInput(0, xflags,
> inTimeStamp,
> framesToProcess);
>
> if (result) return result;
>
> /*
> this part uses an internal object to keep a track of
> any silent
> input, adjust for our
> decay/tail time and determine if it will actually
> produce data. If it
> doesn't then we just return
> a silent output buffer.
>
> This is a nice optimisation, but can be bypassed
> initially
>
> bool silence = xflags &
> kAudioUnitRenderAction_OutputIsSilence;
>
> mSilentTimeout.Process(framesToProcess,
> (SInt32)(GetTailTime() *
> GetSampleRate() ), silence );
>
> if(silence)
> {
> ioActionFlags |=
> kAudioUnitRenderAction_OutputIsSilence;
>
> // clear out the destination buffer to match
> silent bit
>
>
AUBufferList::ZeroBuffer(theOutput->GetBufferList());
>
> return noErr; // silent output so tail should have
> died down by
> now; no need to process this time
> }
> else
> {
> // not silent output this time
> ioActionFlags &=
> ~kAudioUnitRenderAction_OutputIsSilence;
> }
> */
>
> int nOutChannels =
> theOutput->GetStreamFormat().mChannelsPerFrame;
> int nInChannels =
> theInput->GetStreamFormat().mChannelsPerFrame;
>
> // call the DSP code - special case stereo->stereo
> if (nInChannels == 2 && nOutChannels == 2)
> {
> mDSP->Process( theInput->GetChannelData(0),
> theInput->GetChannelData(1),
> theOutput->GetChannelData(0),
> theOutput->GetChannelData(1),
> framesToProcess );
> }
> else if (nInChannels != nOutChannels)
> { // if you want to do mono-stereo (or any N-M
> channel processing
> you need to take care of this
> result = unimperr;
> }
> else
> {
> // N-N channel processing
> for (unsigned int i = 0; i < nInChannels; ++i) {
> float* inputChannel =
> theInput->GetChannelData(i);
> float* outputChannel =
> theOutput->GetChannelData(i)
> mDSP->Process( inputChannel, outputChannel,
> framesToProcess );
> }
>
> return result;
> }
>
> Bill
>
> On 18/03/2007, at 6:39 PM, paul Fultz wrote:
>
> > ok thanks for the information, so if i overide
> AUBase
> > instead all I would need to do is overide Render()
> and
> > Reset(), right? and how would i go about coding
> the
> > Render() so that i can call Process()? i was
> working
> > on some of the code here i dont know if this is
> > correct, i kind of just compiled it together from
> > looking at other code:
> > ComponentResult AUStereoBase::Render(
> > AudioUnitRenderActionFlags & ioActionFlags,
> > const AudioTimeStamp & inTimeStamp,
> > UInt32 inNumberFrames)
> > {
> > bool ioSilence = IsInputSilent (ioActionFlags,
> > inFramesToProcess);
> > ioActionFlags |=
> > kAudioUnitRenderAction_OutputIsSilence;
> > AUInputElement *input = GetInput(0);
> > AUOutputElement *output = GetOutput(0);
> >
> > AudioUnitRenderActionFlags xflags = 0;
> > ComponentResult result = PullInput(0, xflags,
> > inTimeStamp, inFramesToProcess);
> > if (result) return result;
> >
> > Float32 *sourceLeftP = input->GetChannelData(0);
> > Float32 *sourceRightP = input->GetChannelData(1);
> > Float32 *destLeftP = output->GetChannelData(0);
> > Float32 *destRightP = output->GetChannelData(1);
> > Process(sourceLeftP,
> > sourceRightP,destLeftP,destRightP,
> > inNumberFrames,ioSilence);
> > return noErr;
> > }
> > also Process() is a virtual funcion in the class
> > AUStereroBase, which i will overide in my AU
> class.
> > also how can read number of channels in? i want do
> > something different if the input is mono, like
> call
> > Process() in this way:
> > Process(sourceLeftP,
> sourceLeftP,destLeftP,destRightP,
> > inNumberFrames,ioSilence);
> >
> > thanks,
> > Paul
> >
> > --- William Stewart <email@hidden> wrote:
> >
> >> We generally overide AUBase and just implement
> the
> >> Render method -
> >> then instead of working around all this stuff,
> you
> >> just implement
> >> what you need. I think its clearer and easier
> (but
> >> many have ignored
> >> me in the past!)
> >>
> >> Bill
> >>
> >> On 16/03/2007, at 6:47 AM, Christian Luther
> wrote:
> >>
> >>> Hi Paul!
> >>>
> >>> Unfortunately there is more work to do. You also
> >> have to modify the
> >>> function that creates the kernels
> >> (MaintainKernels()) so that you
> >>> have your stereo kernel set up correctly (it
> >> usually creates one
> >>> kernel per I/O which is not what you want). If
> you
> >> want to support
> >>> stereo processing only you can just create one
> >> instance of your
> >>> Stereokernel. If you want to support both mono
> and
> >> stereo
> >>> processing you will have to do some more work
> >> there.
> >>> Then, you have to modify ProcessBufferLists()
> >> which is the function
> >>> that finally calls the Process() functions of
> the
> >> kernels.
> >>>
> >>> I can't really remember the details, but just
> look
> >> around the
> >>> methods I named and try to understand what they
>
=== message truncated ===
____________________________________________________________________________________
Finding fabulous fares is fun.
Let Yahoo! FareChase search your favorite travel sites to find flight and hotel bargains.
http://farechase.yahoo.com/promo-generic-14795097
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden