Я не могу сказать, что я понимаю, это хорошо, 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, на котором можно ответить, как получить образцы ответов из буфера mData Core Audio в Swift 3. – hotpaw2