VST插件:如何实现"前瞻"缓冲?

时间:2014-08-26 17:39:39

标签: c++ visual-c++ sox vst audacity

我的目标是编写一个可以在 Audition Audacity 中使用的VST插件,因此我计划使用VST v2.x.我是VST开发的新手,但我研究过这些例子here。到目前为止,大多数东西看起来很直接。主要"魔术"似乎发生在 process() processReplace()函数中。不太清楚这两个功能的好处/缺点是什么。

现在问题"是我的过滤器需要一个" Lookahead"缓冲几秒钟(可能更长,取决于设置)。这意味着,在流程开始时,我需要填充内部缓冲区。并且,在该过程结束时,我将需要从内部缓冲区中刷新待处理的样本。

之前我一直在编写SoX(Sound eXchange)的过滤器,它们的API与VST非常相似。 VST中所谓的 process()在SoX API中称为 flow()。但是有一个主要区别:SoX API中的 flow()函数作为参数获取输入缓冲区中可用的样本数以及适合输出缓冲区的样本数。 flow()函数然后返回它从输入缓冲区中获取的样本数以及它已写入输出的样本数缓冲区。这意味着我不必在每次通话中处理所有可用的输入样本。并且单个调用可以返回比消耗的样本更少的样本。因此,在流程开始时,我可以使用所有输入样本,但完全返回 输出样本!通过这种方式,我可以填满我的前瞻&#34;缓冲在开始。最后,SoX API有一个 drain()函数,该函数将在进程结束时由Main应用程序调用,以便从过滤器 internal <中清除待处理的样本/ em>缓冲区。

根据我对VST的理解, process()函数只有一个参数来指示输入输出样本的数量。并且它无法限制输出样本的数量。显然, process()假设一个简单的&#34; N个样本,N个样本输出&#34;行为。是吗???

如果是这样,在VST中填充内部先行缓冲区的推荐方法是什么?什么是在VST结束时刷新内部缓冲区的推荐方法?


顺便说一句:我知道我当然可以通过仅返回&#34;沉默&#34;填充我的内部缓冲区。在流程开始时的前几个 process()调用中。但这会延迟/移动整个音频文件,这是想要的!此外,解决了在流程结束时如何刷新内部缓冲区的问题。

感谢您的任何建议! ; - )

1 个答案:

答案 0 :(得分:0)

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

<强> [UPDATE]

这似乎适用于 Audition ,但 Audacity 。看起来像 Audacity 忽略 setInitialDelay()设置的值,因此音频最终会延迟。是否有 Audacity ???

的解决方法