我试图从渲染的AudioBufferList中提取本地[Float]数组,其中音频单元的流设置为32位浮点。在Swift 1& 2我这样做了:
var monoSamples = [Float]()
for i in 0..<Int(inNumberFrames) {
withUnsafePointer(to: &bufferList.mBuffers.mData, {
let ptr = $0
let newPtr = ptr + i
let sample = unsafeBitCast(newPtr.pointee, to: Float.self)
monoSamples.append(sample)
})
}
毫无疑问,这不是最快的方法,但它确实奏效了。在Swift 3中,这种编译没有错误,但在运行时我遇到了崩溃:
致命错误:不同大小的类型之间的不安全比特
这有点令人惊讶; Swift的Float是32位,流的数据是32位。
我想做的只是:
withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, {
let monoSamples = [Float](UnsafeBufferPointer(start: $0, count:Int(inNumberFrames)))
})
但是我收到了编译错误:
表情类型&#39; [Float]&#39;在没有更多背景的情况下是模棱两可的
正确的方法是什么?
答案 0 :(得分:5)
如果您将代码转换为Swift 2,则无效。将代码转换为Swift 3时,您可能修改了太多。
试试这个:
var monoSamples = [Float]()
let ptr = bufferList.mBuffers.mData?.assumingMemoryBound(to: Float.self)
monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(inNumberFrames)))
答案 1 :(得分:0)
试试这可能是?
是的,你是对的,你必须输入$0
作为UnsafePointer
。选择任何类型的UnsafePointer
初始值设定项并在此处传递该值,以便我在此处使用bitPattern
作为解释。
UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames))