我的代碼:轉換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