如何访问 UnsafePointer<AudioBufferList> 中的多个缓冲区(不可变)

How to access multiple buffers in UnsafePointer<AudioBufferList> (non-mutable)

我一直在尝试在 Core Audio 中使用新的 AVAudioSinkNode。 它将类型为 UnsafePointer<AudioBufferList>audioBufferList 传递给处理音频的闭包。

Swift 中 AudioBufferList 的实现使得您 不能 访问多个缓冲区,如果有多个缓冲区的话。 Apple 为可变版本 UnsafeMutablePointer<AudioBufferList> 提供了一个包装器,称为 UnsafeMutableAudioBufferListPointer 并允许访问多个缓冲区。

但是我找不到可以与非可变 UnsafePointer<AudioBufferList> 一起使用的相关包装器 UnsafePointer<AudioBufferList>...

let sinkNode = AVAudioSinkNode() { (timestamp, frames, audioBufferList) -> OSStatus in
    // audioBufferList is UnsafePointer<AudioBufferList>
    // how to access multiple buffers in audioBufferList?
}

提前致谢!

要访问 Swift 中 AudioBufferList 中的每个 AudioBuffer,您可以选择两种方式:

  • 自己做一些指针运算,计算出AudioBuffer的每个地址。​​
  • 强行使用UnsafeMutableAudioBufferListPointer

如果你能在Swift中介绍UnsafeMutableAudioBufferListPointer之前找到合适的示例代码,第一种方法可能是你的选择,但就目前而言,很难找到。


要强行使用UnsafeMutableAudioBufferListPointer,可能需要将UnsafePointer<AudioBufferList>转为UnsafeMutablePointer<AudioBufferList>,难度不大:

            let audioBufferListPtr = UnsafeMutableAudioBufferListPointer(UnsafeMutablePointer(mutating: audioBufferList))

我相信您在获得UnsafeMutableAudioBufferListPointer后就知道如何访问缓冲区了。

警告: 即使从 UnsafePointer<AudioBufferList>UnsafeMutablePointer<AudioBufferList> 的类型转换很容易,但通过 audioBufferList 的实际区域是不可变的.您可能需要格外小心,不要改变此类区域。