使用VST.NET获取宿主DAW当前走带时间,Bitwig下返回值全为0
解决Bitwig中VstTimeInfo返回全0的问题
针对你用VST.NET开发插件时,Bitwig下调用GetTimeInfo返回全0的问题,可从以下几个方向调整:
1. 修正GetTimeInfo的Flags参数
Bitwig对VstTimeInfoFlags的要求更严格,仅传TransportPlaying可能只会返回播放状态,不会返回具体时间数据。需组合指定你实际需要的字段标志,比如:
var requiredFlags = VstTimeInfoFlags.TransportPlaying | VstTimeInfoFlags.WantPosition | VstTimeInfoFlags.WantTempo | VstTimeInfoFlags.WantBarBeat | VstTimeInfoFlags.WantSamplePosition; var timeInfo = Host.GetInstance<IVstHostCommands20>().GetTimeInfo(requiredFlags);
如果需要所有可用数据,也可以直接用VstTimeInfoFlags.WantAll替代组合字段。
2. 切换到音频处理线程中获取TimeInfo
很多DAW(包括Bitwig)仅在音频处理线程中提供有效的VstTimeInfo数据,UI线程调用GetTimeInfo会返回空值或全0。你需要:
- 在插件的
Process方法(音频线程回调)中获取TimeInfo并缓存到线程安全的变量中 - UI绘制动画时,读取缓存的变量来更新状态
示例代码思路:
// 线程安全的缓存变量 private readonly object _timeInfoLock = new object(); private VstTimeInfo _cachedTimeInfo; public override void Process(VstAudioBuffer[] inputs, VstAudioBuffer[] outputs) { var requiredFlags = VstTimeInfoFlags.TransportPlaying | VstTimeInfoFlags.WantAll; var timeInfo = Host.GetInstance<IVstHostCommands20>().GetTimeInfo(requiredFlags); lock (_timeInfoLock) { _cachedTimeInfo = timeInfo; } // 执行音频处理逻辑... } // UI绘制时调用的方法 private void UpdateAnimationFrame() { VstTimeInfo currentTimeInfo; lock (_timeInfoLock) { currentTimeInfo = _cachedTimeInfo; } if (currentTimeInfo != null && currentTimeInfo.TransportPlaying) { // 使用currentTimeInfo中的位置、节拍等数据绘制动画 } }
3. 确认Host实例的获取时机
确保Host.GetInstance<IVstHostCommands20>()是在插件初始化完成后调用(比如PluginInitialize方法执行之后),避免在插件加载初期获取无效的Host实例。
4. 检查Bitwig的VST兼容性设置
在Bitwig中,进入插件的设置界面,确认是否开启了VST2的兼容性支持,部分版本可能默认限制了VST2插件的某些权限。
内容的提问来源于stack exchange,提问作者Mava
相关产品推荐
相关产品推荐

