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

Posted

技术标签:

【中文标题】调用 AUEffectBase::Render 时如何确定哪个输入总线处于活动状态?【英文标题】:How To Determine What Input Bus Is Active When AUEffectBase::Render Is Called? 【发布时间】:2009-11-17 00:55:26 【问题描述】:

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

我将从a post to the coreaudio-api mailing list 抄录我的问题的措辞。这个问题pops up other times 到 2005 年都没有答案。

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

下面是方法调用顺序的快速概览:

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

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

    DoRenderBus()theOutput 进行一些缓冲区准备,这是传入的output(对于给定的总线号),然后调用RenderBus()。输出元素不被传递。

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

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

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

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

所以...如果他/她在Render() 内进行处理,应该如何确定要使用哪个输出元素?如果您还覆盖RenderBus(),您可以将inBusNumber 参数存储在某处以在Render() 中使用,但这很难看。

【问题讨论】:

【参考方案1】:

正如你所说,Render 不接受总线号参数。

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

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

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

我只尝试了一个输出总线和几个输入总线。

【讨论】:

不过,如果您连接了总线 a、b、c,则无法在 Render() 中判断何时渲染哪个总线。正如您所指出的,您可以知道连接了哪些总线,但这仍然使 a、b、c 成为 Render() 的可能调用者。 @Noel:您假设特定总线必须是 Render 的调用者。恕我直言,这个假设是错误的,音频引擎调用 Render 来为所有总线渲染特定时间的帧。

以上是关于调用 AUEffectBase::Render 时如何确定哪个输入总线处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

调用方法并将返回值分配给数组时,为啥C#在调用方法时使用数组引用?

当 AppX 调用 Service 然后调用 ServiceS 时,调用 Uid 是啥?

c++,类的对象作为形参时一定会调用复制构造函数吗?

从 .Net 线程调用时 COM 调用挂起

Moq:设置一个模拟方法在第一次调用时失败,在第二次调用时成功

调用 web api 时 $http 调用两次