如何访问 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
的实际区域是不可变的.您可能需要格外小心,不要改变此类区域。
我一直在尝试在 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
的实际区域是不可变的.您可能需要格外小心,不要改变此类区域。