C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – Void *数组转换为float,int32,int16等大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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

解决方法

这个将匹配typecodes到强制转换函数.基本思想是它为每种类型创建一组微小的转换函数,以及一组函数指针,然后根据数据格式索引到该数组中,以便找到要调用的正确转换函数.

使用:

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,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 – Void *数组转换为float,int32,int16等全部内容,希望文章能够帮你解决c – Void *数组转换为float,int32,int16等所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。