【发布时间】:2011-08-03 18:16:08
【问题描述】:
我开发了一个简单的 VST 插件。该插件有一个带有音频样本的内部缓冲区,如果音频流被中断,则应清除该缓冲区。
现在,如果我在某些媒体播放器中使用此插件(例如带有 VST 包装器插件的 Foobar),并且我使用搜索栏跳到歌曲中的某个位置或切换到新歌曲,我仍然会听到以前音频的尾音.
是否有任何 VST 回调或被调用来通知插件有关此类流中断的东西?
【问题讨论】:
我开发了一个简单的 VST 插件。该插件有一个带有音频样本的内部缓冲区,如果音频流被中断,则应清除该缓冲区。
现在,如果我在某些媒体播放器中使用此插件(例如带有 VST 包装器插件的 Foobar),并且我使用搜索栏跳到歌曲中的某个位置或切换到新歌曲,我仍然会听到以前音频的尾音.
是否有任何 VST 回调或被调用来通知插件有关此类流中断的东西?
【问题讨论】:
没有确切的通知挂钩,但很容易查看播放是开始还是停止。当传输停止和启动时,主机应该分别调用您的插件的suspend() 和resume()。在这些调用中,您可以通过调用getTimeInfo()(在 audioeffectx.h 中声明)来询问插件的播放状态。您可以传递 kVstTransportChanged 和 kVstTransportPlaying 标志让您的插件对传输更改做出相应的反应。
但是,某些主机可能会很顽皮,并且在仅更改播放位置而不是传输状态时不会暂停/恢复。我不确定在处理过程中查询时间信息的 CPU 成本有多大,但您可以尝试在那里这样做,以查看主机是否在安排中跳来跳去。
【讨论】:
process() 中要求提供传输信息,所以也许这没什么大不了的。但我想作为一般规则,不要转发优化......如果该调用是您使插件工作所需的,请实现它,然后对其进行基准测试。 ;)