iOS端Audiokit AUv3应用运行时如何获取宿主的BPM节拍速度
iOS端基于AudioKit的AUv3插件从宿主获取BPM的实现方案
可以实现,AUv3标准原生支持从宿主获取时序信息,AudioKit也做了对应封装,具体操作如下:
实现原理
AUv3的核心类AUAudioUnit内置了时序信息同步接口,所有支持AUv3标准的宿主都会按照协议同步工程的节拍、速度、拍号等信息到插件侧,主流iOS端DAW(库乐队、Logic Pro for iPad、Cubasis等)均支持该能力。
AudioKit下的具体实现
要求使用AudioKit v5及以上版本,旧版本AUv3适配不完善,无法直接调用封装接口。
- 直接访问AUv3插件主类的
auAudioUnit.currentMusicalContext属性即可拿到宿主同步的时序对象,其中tempo字段就是需要的BPM数值,类型为Double - 注意做好非空判断:宿主未开启节拍同步、或者宿主不支持时序同步时,该属性会返回nil,需要做好兜底逻辑
代码示例
// 读取宿主BPM的示例方法 func fetchHostTempo() -> Double? { guard let context = auAudioUnit.currentMusicalContext else { // 无有效时序信息时返回默认值或nil即可 return 120.0 // 可根据需求修改兜底BPM } return context.tempo }
注意事项
- 不要在音频渲染实时线程中频繁读取该属性,建议在每个渲染周期开始前的非实时线程预读取,避免触发线程安全问题
- 若需要监听BPM的实时变化,可通过KVO监听
auAudioUnit.currentMusicalContext属性变更,不要做轮询操作减少性能消耗 - 部分宿主默认关闭向第三方插件同步时序信息的开关,可在插件的使用引导中提示用户手动开启对应选项
内容的提问来源于stack exchange,提问作者pablo lopez lozano
相关产品推荐
相关产品推荐

