了解AurioTouch

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样本。
然而,循环似乎在将每个样本的第三个字节作为SInt8提取并使用此值(范围从-128到+127)来表示样本。
如果样本应该是一个24位的值,那么这怎么是一个有效的值呢?为什么要查看SInt32的第三个字节,并将其强制转换为SInt8?
我非常困惑。谁能够解释一下,我会非常感激!
1个回答

5

24位数字的前8位是最高有效位。剩余的低位相对于全幅太小,在iPhone显示器上无法显示。最高有效的8位位于内存中以小端24位数据类型的第3个字节。


谢谢。我在这里详细阐述了这个答案:http://www.kevatron.co.uk/understanding-auriotouch - Kev
我也在尝试将auriotouch项目集成到我的应用程序中。我已经尝试了很长时间,但仍然无法解决它。所以,你能帮我解决这个问题吗? - The X-Coder
这里也有同样的问题,有人能帮我吗?@TheX-Coder - tryKuldeepTanwar
我手头有代码。给我你的邮箱,我会把它发送过去。 - The X-Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接