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.