0

我有一个内存引用 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 中的指令多得多)。这是实时音频回调中的一个循环,因此最大限度地减少延迟和电池消耗的高效代码非常重要。

有更快的方法吗?

4

1 回答 1

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
}

更完整的要点在这里

于 2016-02-28T23:23:03.087 回答