了解AurioTouch

时间:2012-06-26 10:22:11

标签: iphone ios core-audio

在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?

我很困惑。感谢任何能向我解释的人!

1 个答案:

答案 0 :(得分:5)

24位数的前8位是最重要的部分。剩下不太重要的部分相对于全尺寸来说太小,无法在iPhone显示屏上显示。最重要的8位位于存储器中的小端24位数据类型的第3个字节中。