在Swift 3中从AudioBufferList提取数据

Joh*_*alo 3 core-audio ios swift 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)
        })
    }
Run Code Online (Sandbox Code Playgroud)

无疑不是最快的方法,但它确实有效。在Swift 3中,编译时没有错误,但是在运行时出现崩溃:

致命错误:不同大小的类型之间不能unsafeBitCast

这有点令人惊讶;Swift的Float是32位的,流的数据是32位的。

我想做的就是:

    withUnsafeMutablePointer(to: &bufferList.mBuffers.mData, {
        let monoSamples = [Float](UnsafeBufferPointer(start: $0, count:Int(inNumberFrames)))
    })
Run Code Online (Sandbox Code Playgroud)

但是我得到一个编译错误:

表达式类型'[Float]'不明确,没有更多上下文

什么是正确的方法?

OOP*_*Per 6

如果您将代码未转换为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)))
Run Code Online (Sandbox Code Playgroud)