0

OS XおよびiOSフレームワークヘッダーで次のように宣言されたメモリ参照mBuffers.mData(AudioUnit bufferListから)があります。

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 ソースを使用すると、個々のオーディオ サンプルを Audio Unit (または 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

于 2016-02-28T23:23:03.087 に答える