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 にキャストするのはなぜですか?
私は非常に混乱しています。私にそれを説明できる人への称賛!