从Swift 3中的AudioBufferList中提取数据

问题描述:

我试图从音频单元的流设置为32位浮点的渲染AudioBufferList中提取本机[Float]数组。在斯威夫特1 & 2我这样做:从Swift 3中的AudioBufferList中提取数据

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编译没有错误,但在运行时我碰到:

fatal error: can't unsafeBitCast between types of different sizes

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

我想要做的简直就是:

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

但我得到一个编译错误:

Expression type '[Float]' is ambiguous without more context

什么是做到这一点的正确方法?

+0

以下是编译(当然,_should_编译)在斯威夫特游乐场的要点:gist.github.com/anonymous/4d55cd1ec55a5f71246780f4819c94b3 –

如果您未将代码转换为Swift 2,则无法正常工作。您可能已修改了你太多的代码转换为斯威夫特3.

时,试试这个:

var monoSamples = [Float]() 
let ptr = bufferList.mBuffers.mData?.assumingMemoryBound(to: Float.self) 
monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(inNumberFrames))) 
+0

这很有效!谢谢! –

试试这可能是?

是的,你是正确的,你必须输入你的$0UnsafePointer。选择任何类型的UnsafePointer初始值设定项,并将此值传递给此处,为了解释的目的,我在此处使用了bitPattern

UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames)) 
+0

没有爱。现在的错误是:“表达式类型”UnsafeBufferPointer '不明确,没有更多的上下文“ –

+0

谢谢,但我仍然困惑。我们在这里有一个withUnsafeMutablePointer闭包,是吗? $ 0去哪里? 'monoSamples = [Float](UnsafeBufferPointer (start:UnsafePointer($ 0),count:Int(inNumberFrames)))'产生另一个错误。 –

+0

这是一个在Swift Playground中编译(嗯,_should_ compile)的主题:https://gist.github.com/anonymous/4d55cd1ec55a5f71246780f4819c94b3 –