在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样本。

但是,循环似乎将每个样本的第三个字节作为SInt8引出,并使用该值(范围为-128至+127)表示样本。

如果样本应为24位值,那么对于样本而言,这是一个有效值吗?为什么要查看SInt32的第3个字节并转换为SInt8?

我很困扰。向任何可以向我解释的人致以敬意!

最佳答案

24位数字的高8位是最重要的部分。剩余的次要部分相对于全尺寸而言太小,无法显示在iPhone显示屏上。最高有效的8位位于内存中的低位24位数据类型的第3个字节中。

10-08 12:14