VST插件:如何实现“前瞻”缓冲区?

3
我的目标是编写一个VST插件,应该可以在AuditionAudacity中运行,因此我计划使用VST v2.x。我对VST开发还很陌生,但我已经学习了这里的示例。到目前为止,大部分东西看起来都很简单。主要的“魔法”似乎发生在process()processReplace()函数中。不太确定这两个函数的优缺点是什么。
现在的“问题”是,我的过滤器将需要几秒钟(可能更长,取决于设置)的“先行缓冲区”。这意味着,在处理开始时,我需要填充我的内部缓冲区。在处理结束时,我需要从内部缓冲区清除待处理的样本。
我之前曾为SoX (Sound eXchange) 编写过滤器,他们的API与VST非常相似。在VST中被称为process()的函数,在SoX API中被称为flow()。但是有一个重要的区别:SoX API中的flow()函数作为参数接收输入缓冲区中可用的样本数以及适合输出缓冲区的样本数。然后,flow()函数返回它从输入缓冲区中取的样本数和它写入输出缓冲区的样本数。这意味着我不必在每次调用时处理所有可用的输入样本。单个调用可能返回比其消耗的样本更少。因此,在处理开始时,我可以消耗所有的输入样本,但完全没有返回任何输出样本!这样我就可以在开始时填充我的"预见"缓冲区。最后,SoX API有一个drain()函数,在处理结束时,主应用程序将调用该函数以清空过滤器的内部缓冲区中挂起的样本。
据我所了解,关于VST,process()函数只有一个参数用来指示输入和输出样本的数量,并且没有办法限制输出样本的数量。显然,process()假定了简单的“N个样本输入,N个样本输出”的行为。是这样吗?如果是,那么在VST中填充内部前瞻缓冲区的推荐方法是什么?在VST中清空内部缓冲区的推荐方法是什么?

顺便说一句:我知道我当然可以通过在处理的开头返回只有“静音”的内容来填充我的内部缓冲区。但这会延迟/移动整个音频文件,这是不想要的!而且它也不能解决如何在处理结束时清空内部缓冲区的问题。

感谢任何建议!;-)

1个回答

0

好的,我想我找到了一个解决方案。在VST中有一个setInitialDelay()函数。所以我想我需要自己延迟输出,然后通过setInitialDelay()设置正确的值来进行补偿。

[更新]

这似乎在Audition中很好用,但是在Audacity不行。看起来Audacity忽略了setInitialDelay()设置的值,因此音频最终被延迟了。是否有任何解决Audacity的方法?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接