我有一个PCM数据阵列,它可以是16位,24位打包,32位等。它可以是有符号或无符号的,它可以是32位或64位浮点数。它目前存储为“void **”矩阵,按通道索引,然后按帧索引。目标是允许我的库采用任何PCM格式并缓冲它,而不需要操纵数据以适合指定的结构。如果A / D转换器吐出24位压缩交错PCM阵列,我需要优雅地接受它。我还需要支持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时,事情变得棘手。
是否有人有可能愿意分享的任何有用的宏?
谢谢,
-Griff
答案 0 :(得分:5)
这个将typecodes与cast函数匹配。基本思想是它为每种类型创建一组微小的转换函数,以及一组函数指针,然后根据数据格式索引到该数组中,以便找到要调用的正确转换函数。
使用:
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
希望帮助