从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
什么是做到这一点的正确方法?
如果您未将代码转换为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
为UnsafePointer
。选择任何类型的UnsafePointer
初始值设定项,并将此值传递给此处,为了解释的目的,我在此处使用了bitPattern
。
UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames))
没有爱。现在的错误是:“表达式类型”UnsafeBufferPointer
谢谢,但我仍然困惑。我们在这里有一个withUnsafeMutablePointer闭包,是吗? $ 0去哪里? 'monoSamples = [Float](UnsafeBufferPointer
这是一个在Swift Playground中编译(嗯,_should_ compile)的主题:https://gist.github.com/anonymous/4d55cd1ec55a5f71246780f4819c94b3 –
以下是编译(当然,_should_编译)在斯威夫特游乐场的要点:gist.github.com/anonymous/4d55cd1ec55a5f71246780f4819c94b3 –