要获取AUAudioUnit的宿主采样率变化,可以使用AUAudioUnit的formatObserver属性来观察采样率的变化。下面是一个示例代码:
class MyAudioUnit: AUAudioUnit {
var sampleRateObserverToken: AUParameterObserverToken?
override init(componentDescription: AudioComponentDescription, options: AudioComponentInstantiationOptions = []) throws {
super.init(componentDescription: componentDescription, options: options)
// 注册观察者
sampleRateObserverToken = self.auAudioUnit.scheduleParameterBlock { [weak self] token in
guard let self = self else { return }
// 检查采样率参数的变化
if let parameterTree = self.auAudioUnit.parameterTree, let sampleRateParam = parameterTree.parameter(withAddress: YourSampleRateParameterAddress) {
let sampleRate = sampleRateParam.value
print("Sample rate changed to \(sampleRate)")
// 在此处执行相应的操作,如更新音频处理算法等
}
}
}
override func deallocateRenderResources() {
super.deallocateRenderResources()
// 注销观察者
if let token = sampleRateObserverToken {
auAudioUnit.parameterTree?.removeParameterObserver(token)
sampleRateObserverToken = nil
}
}
}
在上面的示例中,我们在初始化AUAudioUnit时注册了一个观察者,用于监视采样率参数的变化。当采样率参数发生变化时,观察者的闭包将被调用,并在控制台上打印新的采样率。你可以在闭包中执行相应的操作,如更新音频处理算法等。
请注意,你需要将YourSampleRateParameterAddress
替换为你实际使用的采样率参数的地址。此外,当AUAudioUnit不再需要时,需要在deallocateRenderResources
方法中注销观察者,以避免潜在的内存泄漏问题。