我有一组 PCM 数据;它可以是 16 位、24 位压缩、32 位等。它可以是有符号的,也可以是无符号的,它可以是 32 位或 64 位浮点数。它当前存储为void**
矩阵,首先按通道索引,然后按帧索引。目标是允许我的库采用任何 PCM 格式并对其进行缓冲,而无需处理数据以适应指定的结构。如果 A/D 转换器输出交错 PCM 的 24 位打包数组,我需要优雅地接受它。我还需要支持 16 位非交错,以及上述格式的任何排列。
我知道运行时的位深度和其他信息,并且我正在尝试有效地编码而不复制代码。我需要的是一种有效的方式来投射矩阵,将PCM数据放入矩阵中,然后再将其拉出。
我可以将矩阵分别转换int32_t
为int16_t
32 位和 16 位带符号的 PCM;我可能还必须将 24 位 PCM 存储在int32_t
32 位、8 位字节系统中。
谁能推荐一种将数据放入此数组并稍后将其取出的好方法?我想避免看起来像这样的大段代码:
switch (mFormat) {
case 1: // unsigned 8 bit
for (int i = 0; i < mChannels; i++)
framesArray = (uint8_t*)pcm[i];
break;
case 2: // signed 8 bit
for (int i = 0; i < mChannels; i++)
framesArray = (int8_t*)pcm[i];
break;
case 3: // unsigned 16 bit
...
限制:我在 C/C++ 中工作,没有模板,没有 RTTI,没有 STL。认为嵌入式。当我必须将它移植到具有 16 位字节的 DSP 时,事情变得更加棘手。
有没有人愿意分享任何有用的宏?