我的代码:转换C指针斯威夫特3
let data = Data(bytes: UnsafePointer<UInt8>(audioBuffer.mData), count: Int(bufferSize))
和
let u16 = UnsafePointer<Int32>(audioBuffer.mData).pointee
这两者工作雨燕2.3,但不是在斯威夫特3.如何转换他们,使他们采取行动等效? (以及为什么?)
我的代码:转换C指针斯威夫特3
let data = Data(bytes: UnsafePointer<UInt8>(audioBuffer.mData), count: Int(bufferSize))
和
let u16 = UnsafePointer<Int32>(audioBuffer.mData).pointee
这两者工作雨燕2.3,但不是在斯威夫特3.如何转换他们,使他们采取行动等效? (以及为什么?)
要斯威夫特3读取音频单元回调缓冲器的16位音频样本,我使用:
let bufferPointer = UnsafeMutableRawPointer(mBuffers.mData)
if var bptr = bufferPointer {
for i in 0..<(Int(frameCount)) {
let oneSampleI16 = bptr.assumingMemoryBound(to: Int16.self).pointee
// do something with the audio sample
bptr += 1
}
}
音频会话和音频单元代码的其余部分是在这个要点:https://gist.github.com/hotpaw2/630a466cc830e3d129b9
检查the latest reference of Data.init(bytes:count:)
。
参数bytes
的类型是UnsafeRawPointer
,它接受UnsafeMutableRawPointer
。并且AudioBuffer.mData
的类型是UnsafeMutableRawPointer?
。您无需使用初始值设定项进行转换。
let data = Data(bytes: audioBuffer.mData!, count: Int(bufferSize))
(你只需要明确地解开mData
,因为它导入为可空类型,UnsafeMutableRawPointer?
,但你需要通过非空UnsafeRawPointer
(或UnsafeMutableRawPointer
)。
第二个例子,你最好检查一下UnsafeMutableRawPointer
有哪些方法可用,你可以找到load(fromByteOffset:as:)
的方法,并且可以这样使用它
let i32 = audioBuffer.mData!.load(as: Int32.self)
`负载(
我不能说我明白了这口井,nor have I read the document,但它看起来像swift3指针强制类型转换作用域为避免或限制走样,所以你无法(容易)有两种不同同一段记忆的意见,或至少不是很长时间。这意味着您必须复制演员数据或在演员回调中做任何您需要做的事情。
为什么要消除混叠?我想这会让编译器更快乐。
对于Data
:
// [NS]Data. probably copying the data
Data(bytes: audioBuffer.mData!, count: Int(audioBuffer.mDataByteSize))
对于数字数组:
// cast the data to Int32s & (optionally) copy the data out
let umpInt32 = audioBuffer.mData!.assumingMemoryBound(to: Int32.self)
let frameCount = Int(audioBuffer.mDataByteSize/4)
var u32 = [Int32](repeating: 0, count: frameCount)
// copy data from buffer
u32.withUnsafeMutableBufferPointer {
$0.baseAddress!.initialize(from: umpInt32, count: frameCount)
}
P.S.你的代码有一些混乱。是u16
应该是数组Int32
s?或UInt16
s?或者是其他东西?
可能http://stackoverflow.com/questions/38983277/how-to-get-bytes-out-of-an-unsafemutablerawpointer,它回答了如何从Swift 3的Core Audio mData缓冲区中获取答案样本。 – hotpaw2