2016-09-18 3 views
1

У меня есть код:Преобразование указателей C до Swift 3

let data = Data(bytes: UnsafePointer<UInt8>(audioBuffer.mData), count: Int(bufferSize)) 

и

let u16 = UnsafePointer<Int32>(audioBuffer.mData).pointee 

Оба из которых работают в Swift 2.3, но не в Swift 3. Как преобразовать их так, что они действуют что то же самое? (и почему?)

+0

Возможный дубликат http://stackoverflow.com/questions/38983277/how-to-get-bytes-out-of-an-unsafemutablerawpointer, на котором можно ответить, как получить образцы ответов из буфера mData Core Audio в Swift 3. – hotpaw2

ответ

1

Чтобы прочитать 16-битные сэмплы из АУДИОБЛОКА обратного вызова буферов в Swift 3, я использую:

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 
    } 
} 

Остальная часть кода блока Audio Session и Аудио в этом суть: https://gist.github.com/hotpaw2/630a466cc830e3d129b9

+0

' ++ 'оператор удален из Swift 3. Кажется, ваш код в gist написан без использования' ++ ', и я считаю, что вы можете улучшить свой фрагмент кода в этом ответе. – OOPer

+0

@OOPer: Спасибо. Исправлена ​​ошибка копирования-вставки из старой версии. – hotpaw2

0

Проверить 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) 

`нагрузки (

1

Я не могу сказать, что я понимаю, это хорошо, 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? Или что-то другое?

Смежные вопросы