在Swift中有效地将Int16数据写入内存?

时间:2016-01-25 03:15:47

标签: swift core-audio unsafe-pointers

我有一个内存引用,mBuffers.mData(来自AudioUnit bufferList),在OS X和iOS框架标题中声明为:

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更多的指令)。这是实时音频回调中的循环,因此有效的代码可以最大限度地减少延迟和电池消耗。

有更快的方法吗?

1 个答案:

答案 0 :(得分: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
}

更完整的要点here