调用 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 是啥?