Ios 在Swift 3中从AudioBufferList中提取数据
我试图从渲染的AudioBufferList中提取本机[Float]数组,其中音频单元的流设置为32位浮点。在Swift 1和Swift 2中,我做到了:Ios 在Swift 3中从AudioBufferList中提取数据,ios,swift,core-audio,swift3,Ios,Swift,Core Audio,Swift3,我试图从渲染的AudioBufferList中提取本机[Float]数组,其中音频单元的流设置为32位浮点。在Swift 1和Swift 2中,我做到了: var monoSamples = [Float]() for i in 0..<Int(inNumberFrames) { withUnsafePointer(to: &bufferList.mBuffers.mData, { let ptr = $0
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)
})
}
但我得到了一个编译错误:
表达式类型“[Float]”在没有更多上下文的情况下不明确
做这件事的正确方法是什么?试试这可能是什么
是的,你是正确的,你必须输入你的$0
作为UnsafePointer
。选择任何类型的UnsafePointer
初始值设定项,并在此处传递该值,以便于我在此处使用bitPattern
进行解释
UnsafeBufferPointer<Float>(start: UnsafePointer(bitPattern: i), count: Int(inNumberFrames))
UnsafeBufferPointer(开始:UnsafePointer(位模式:i),计数:Int(inNumberFrames))
如果您将代码取消转换为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)))
没有爱。现在的错误是:“表达式类型‘UnsafeBufferPointer’在没有更多上下文的情况下是不明确的”谢谢,但我仍然感到困惑。我们在一个不可女性化的指针闭包里,是吗?0美元到哪里去了
monoSamples=[Float](UnsafeBufferPointer(start:UnsafePointer($0),count:Int(inNumberFrames))
产生了另一个错误。下面是一个在Swift游乐场编译(应该编译)的要点:gist.github.com/anonymous/4d55cd1ec55a5a5a5f71246780f4819c94b3
var monoSamples = [Float]()
let ptr = bufferList.mBuffers.mData?.assumingMemoryBound(to: Float.self)
monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(inNumberFrames)))