从Swift 3中的AudioBufferList中提取数据

时间:2016-09-24 18:42:29

标签: ios swift core-audio swift3

我试图从渲染的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;在没有更多背景的情况下是模棱两可的

正确的方法是什么?

2 个答案:

答案 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))