在 iPhone 的 AurioTouch 示例中,以下代码用于将样本添加到绘制缓冲区中,在渲染到屏幕时使用该缓冲区。
我完全不明白为什么这样做是有效的。实际的mData缓冲区包含固定点8.24 LPCM类型的SInt32样本。
然而,循环似乎在将每个样本的第三个字节作为SInt8提取并使用此值(范围从-128到+127)来表示样本。
如果样本应该是一个24位的值,那么这怎么是一个有效的值呢?为什么要查看SInt32的第三个字节,并将其强制转换为SInt8?
我非常困惑。谁能够解释一下,我会非常感激!
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?
我非常困惑。谁能够解释一下,我会非常感激!