2016-01-25 2 views
0

У меня есть ссылка памяти, mBuffers.mData (от AudioUnit bufferList), объявленный в OS X и IOS каркасных заголовки как:Эффективно записывать данные Int16 в память в Swift?

UnsafeMutablePointer<Void> 

Что такое эффективный способ, чтобы написать множество значений Int16 в память на который ссылается этот указатель?

разборка этого Swift исходного кода:

for i in 0..<count { 
    var x : Int16 = someFastCalculation() 
    let loByte : Int32 = Int32(x)  & 0x00ff 
    let hiByte : Int32 = (Int32(x) >> 8) & 0x00ff 
    memset(mBuffers.mData + 2 * i , loByte, 1) 
    memset(mBuffers.mData + 2 * i + 1, hiByte, 1) 
} 

показывает много инструкций Настройки вызовов MemSet() функций (гораздо больше команд, чем в моем someFastCalculation). Это цикл внутри обратного вызова в реальном времени, поэтому эффективный код для минимизации латентности и потребления батареи имеет важное значение.

Есть ли более быстрый способ?

+0

Существуют ли зависимости между предыдущим расчетным значением и новым расчетным значением? Если нет, мы можем попытаться выполнить этот цикл параллельно с помощью GCD. –

ответ

0

Этот источник Swift позволяет распределять массивы отдельных аудиопоследовательностей аудиоустройству аудиоустройства (или AUAudioUnit) и сводится к более быстрому результату, чем использование memset.

let mutableData = UnsafeMutablePointer<Int16>(mBuffers.mData) 
let sampleArray = UnsafeMutableBufferPointer<Int16>(
    start: mutableData, 
    count: Int(mBuffers.mDataByteSize)/sizeof(Int16)) 

for i in 0..<count { 
    let x : Int16 = mySampleSynthFunction(i) 
    sampleArray[i] = x 
} 

Подробнее Gist here.