我的目标是编写一个适用于Audition和Audacity的VST插件,因此我打算使用 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 中最后刷新内部缓冲区的推荐方法是什么?
顺便说一句:我知道我当然可以通过在进程开始时的前几个process()调用中只返回“静音”来填充我的内部缓冲区。但这会延迟/移动整个音频文件,这是不想要的!它也没有解决如何在进程结束时刷新内部缓冲区的问题。
感谢您的任何建议!;-)