views:

69

answers:

1

It's clearly a n00b question, as this has been implemented successfully in applications. But it's 2009 and I'm still unclear how input/output buses work with AUBase.

I'll crib the wording of my question from a post to the coreaudio-api mailing list. This question pops up other times with no answer through 2005.

I was just looking over the AUBase code again, and I'm having trouble seeing how AUBase::Render() is supposed to work in the case of multiple busses (because it doesn't take a bus number argument)...

Here's a quick overview of the method call order: 1. In the implementation of AUBase::DoRender(), the local variable "output" is set to GetOutput(inBusNumber). 2. Then the "output" variable is eventually (after calling the pre-render notify callout) passed to AUBase::DoRenderBus(). 3. DoRenderBus() does some buffer preparation on "theOutput", which is "output" passed in (for the given bus number), and then calls RenderBus(). The output element is not passed along. 4. The default implementation of RenderBus() calls NeedsToRender() and then onto Render(), without passing the bus number or output element object.

The comment above AUBase::RenderBus() in AUBase.h says "Override this method if your AU processes multiple output busses completely independently -- you'll want to just call Render without the NeedsToRender check. Otherwise, override Render()." To me, the comment above sounds like it's saying that you should do your processing in Render() even if you support multiple busses.

So... if one does his/her processing within Render(), how is one supposed to determine which output element to work with? If you also override RenderBus(), you could store the inBusNumber argument somewhere for use in Render(), but that's just ugly.

A: 

As you say, Render does not take a bus-number argument.

virtual OSStatus Render(AudioUnitRenderActionFlags & ioActionFlags,
                        const AudioTimeStamp & inTimeStamp,
                        UInt32 inNumberFrames);

I believe this means it should render output for all output busses. It will also fetch input from all input busses.

To determine which input busses exist/are connected/active (not sure what the terminology is) you can call HasInput.

I only tried it with one output bus and several input busses.

yairchu
Still, if you have buses a,b,c connected, there is no way to tell when in Render() which bus is being rendered. As you point out you can know which buses are connected, but that still leaves a,b,c as possible callers of Render().
Noel
@Noel: You assume that a specific bus must be the caller of Render. imho this assumption is wrong and the audio engine calls Render to render the frames for specific times for all busses.
yairchu