我有一系列的PCM数据;它可以是16位,24位压缩,32位等。它可以是有符号的或无符号的,并且可以是32或64位浮点。它当前存储为void**
矩阵,首先按 channel 索引,然后按帧索引。目的是允许我的库采用任何PCM格式并对其进行缓冲,而无需对数据进行操作以适合指定的结构。如果A/D转换器吐出交错PCM的24位压缩数组,我需要优雅地接受它。我还需要支持16位非交织以及上述格式的任何排列。
我知道运行时的位深度和其他信息,我正在尝试有效地编码,而又不重复代码。我需要的是一种有效的方法来转换矩阵,将PCM数据放入矩阵,然后稍后将其拉出。
我可以将矩阵分别转换为32位和16位有符号PCM的int32_t
或int16_t
;对于32位,8位字节系统,我可能还必须将24位PCM存储在int32_t
中。
谁能推荐一种好方法将数据放入此数组中,并在以后将其拔出?我想避免看起来像这样的大部分代码:
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时,事情变得更加棘手。是否有人愿意分享任何有用的宏?
最佳答案
这将使类型代码与强制转换功能匹配。基本思想是,它为每种类型创建一组微小的转换函数,并创建一个函数指针数组,然后根据数据格式索引到该数组中,以找到要调用的正确转换函数。
用法示例:
int main ()
{
void** pcm;
int currentChannel;
int currentFrame;
int mFormat;
// gets data casted to our type
STORETYPE translatedFrameData = GET_FRAMEDATA(pcm, currentChannel, currentFrame, mFormat);
return 0;
}
头文件:// this is a big type, we cast to this one
#define STORETYPE int32_t
// these functions get a single frame
typedef STORETYPE (*getterFunction)(void**, int, int);
// this macros make an array that maps format codes to cast functions
#define BEGIN_RESERVE_FORMAT_CODES getterFunction __getter_array[] = {
#define RESERVE_FORMAT_CODE(code) __get__##code##__,
#define END_RESERVE_FORMAT_CODES };
//
#define FORMAT_DEFINITION(code, format) STORETYPE __get__##code##__(void**pcm, int channel, int frame) \
{ return (STORETYPE) ((format**)pcm)[channel][frame]; }
// get corresponding function
#define GET_FRAMEDATA( pcm, channel, frame, format ) __getter_array[format](pcm,channel,frame)
//serious part, define needed types
FORMAT_DEFINITION(0, uint8_t)
FORMAT_DEFINITION(1, int8_t)
FORMAT_DEFINITION(2, uint16_t)
FORMAT_DEFINITION(3, int16_t)
//actually this makes the array which binds types
BEGIN_RESERVE_FORMAT_CODES
RESERVE_FORMAT_CODE(0)
RESERVE_FORMAT_CODE(1)
RESERVE_FORMAT_CODE(2)
RESERVE_FORMAT_CODE(3)
END_RESERVE_FORMAT_CODES
//WATCH OUT FOR SEQUENCE
希望有所帮助关于c++ - 如何有效地从C++中的void *数组解压缩float,int16,int32等数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4642836/