4

iPhone の AurioTouch の例では、次のコードを使用して、画面にレンダリングするときに使用される描画バッファーにサンプルを追加します。

SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);
for (int i=0; i<numFrames; i++)
{
    if ((i+drawBufferIdx) >= drawBufferLen)
    {
        cycleOscilloscopeLines();
        drawBufferIdx = -i;
    }

    drawBuffers[0][i + drawBufferIdx] = data_ptr[2];
    data_ptr += 4;
}

なぜこれが機能するのか理解できません。実際の mData バッファーには、固定小数点 8.24 LPCM のSInt32サンプルが含まれています。

ただし、ループはすべてのサンプルの 3 番目のバイトを SInt8 として抽出し、この値 (-128 から +127 の範囲) を使用してサンプルを表しているようです。

サンプルが 24 ビット値であることが意図されている場合、これはどのようにサンプルの有効な値になりますか? SInt32 の 3 番目のバイトを見て、SInt8 にキャストするのはなぜですか?

私は非常に混乱しています。私にそれを説明できる人への称賛!

4

1 に答える 1

5

24 ビット数値の上位 8 ビットが最上位部分です。残りのあまり重要でない部分は、フルスケールに比べて小さすぎて、iPhone ディスプレイに表示できません。最上位の 8 ビットは、メモリ内のリトル エンディアン 24 ビット データ型の 3 番目のバイトにあります。

于 2012-06-26T18:06:53.347 に答える