如何在调用AUEffectBase :: Render时确定哪个输入总线处于活动状态?

时间:2009-11-17 00:55:26

标签: c++ audio core-audio

这显然是一个n00b问题,因为这已在应用程序中成功实施。但是现在是2009年,我还不清楚输入/输出总线如何与AUBase一起工作。

我会从a post to the coreaudio-api mailing list中提出问题的措辞。这个问题pops up other times在2005年没有回答。

我只是再次查看AUBase代码,我很难看到AUBase::Render()在多个总线的情况下应该如何工作(因为它不需要总线号码参数)...

以下是方法调用顺序的快速概述:

  1. AUBase::DoRender()的实施中,局部变量output设置为GetOutput(inBusNumber)

  2. 然后output变量最终(在调用预渲染通知标注后)传递给AUBase::DoRenderBus()

  3. DoRenderBus()theOutput上执行一些缓冲区准备工作,传递output(对于给定的总线编号),然后调用RenderBus()。输出元素不会传递。

  4. RenderBus()的默认实现调用NeedsToRender()然后调用Render(),而不传递总线编号或输出元素对象。

  5. AUBase.h中AUBase::RenderBus()上方的评论说:

      

    如果您的AU完全独立处理多个输出总线,则覆盖此方法 - 您只需在没有Render检查的情况下调用NeedsToRender。否则,请覆盖Render()

    对我来说,上面的评论听起来像是说你应该在Render() 甚至 进行处理,如果你支持多条总线。

    所以......如果在Render()内进行他/她的处理,那么应该如何确定使用哪个输出元素?如果您还覆盖RenderBus(),则可以将inBusNumber参数存储在某处,以便在Render()中使用,但这只是丑陋。

1 个答案:

答案 0 :(得分:0)

如你所说,Render没有采用公交车号码。

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

我相信这意味着它应该为所有输出总线渲染输出。它还将从所有输入总线获取输入。

要确定哪些输入总线存在/已连接/处于活动状态(不确定术语是什么),您可以致电HasInput

我只用一条输出总线和几条输入总线试过它。