我有一个内存引用,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更多的指令)。这是实时音频回调中的循环,因此有效的代码可以最大限度地减少延迟和电池消耗。
有更快的方法吗?
答案 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。