在 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?
我很迷茫。感谢任何可以向我解释的人!