VST 音频插件如何检测来自 VST 主机的流中断?

Posted

技术标签:

【中文标题】VST 音频插件如何检测来自 VST 主机的流中断?【英文标题】:How can VST audio plugin detect stream interrupts from VST host? 【发布时间】:2011-08-03 18:16:08 【问题描述】:

我开发了一个简单的 VST 插件。该插件有一个带有音频样本的内部缓冲区,如果音频流被中断,则应清除该缓冲区。

现在,如果我在某些媒体播放器中使用此插件(例如带有 VST 包装器插件的 Foobar),并且我使用搜索栏跳到歌曲中的某个位置或切换到新歌曲,我仍然会听到以前音频的尾音.

是否有任何 VST 回调或被调用来通知插件有关此类流中断的东西?

【问题讨论】:

【参考方案1】:

没有确切的通知挂钩,但很容易查看播放是开始还是停止。当传输停止和启动时,主机应该分别调用您的插件的suspend()resume()。在这些调用中,您可以通过调用getTimeInfo()(在 audioeffectx.h 中声明)来询问插件的播放状态。您可以传递 kVstTransportChangedkVstTransportPlaying 标志让您的插件对传输更改做出相应的反应。

但是,某些主机可能会很顽皮,并且在仅更改播放位置而不是传输状态时不会暂停/恢复。我不确定在处理过程中查询时间信息的 CPU 成本有多大,但您可以尝试在那里这样做,以查看主机是否在安排中跳来跳去。

【讨论】:

似乎 foobar VST 很“调皮”,仅在音频格式更改时才调用 resume() 而不是在流/歌曲更改时调用。但是感谢您提供时间信息的想法,我会尝试的。 想一想,我记得之前在开发一个大型 VST 插件,之前在 process() 中要求提供传输信息,所以也许这没什么大不了的。但我想作为一般规则,不要转发优化......如果该调用是您使插件工作所需的,请实现它,然后对其进行基准测试。 ;) 哦,getTimeInfo() 总是返回 NULL,看来这个特殊的 Foobar VST 包装器并没有提供任何有用的东西。我希望其他一些主机会更好。 嗯,这可能是因为它本身不是一个合适的音序器。但他们绝对应该提供至少基本的播放信息。也许您可以以某种方式询问社区和/或向他们提交错误报告?

以上是关于VST 音频插件如何检测来自 VST 主机的流中断?的主要内容,如果未能解决你的问题,请参考以下文章

从 JUCE 音频 VST 插件控制主机播放

我将如何以编程方式与 VST(i) 插件交互以合成音频?

如何编译 VST 插件?

如何在代码中实例化 Vst3 插件?对于 vst3 主机应用程序

在 .NET 框架中使用 VST 插件效果

如何使用命令行编译 VST 3 或音频单元?