3531立体声调试

goodman 2017-11-22 19:41:21 3075

先决条件:

  • Hi3531 平台uclibc
  • 使用SIO4 I2S连接 TLV320AIC31 48K采样 STEROR(立体声) u32ChnCnt=2通道

海思关于立体声这有这么一个简单的说明:

对于双声道模式,只应对左声道(即编号小于设备属性中通道数 u32ChnCnt 一半的通
道)进行操作, SDK 内部会自动对右声道也进行相应的操作。

那么问题来了(AI通道为0,1):

  1. 数据是走通道的,双声道是的数据都走通道0 还是左声道走Aich0,右声道走Aich1
  2. AI(4,0)--->AENC(0) 有数据
    AI(4,1)--->AENC(1) 无数据

AI 调试信息

我这里使用的是LPCM格式,原始的未压缩的PCM格式

  1. 确定你使用的SIO口,这个是硬件连接请确保你使用的是正确的

    #define SAMPLE_AUDIO_PTNUMPERFRM   320
    #if HICHIP == HI3531_V100
    #define SAMPLE_AUDIO_AI_DEV 4  // 硬件确定后该这里,我使用的是SIO4
    #else
    #define SAMPLE_AUDIO_AI_DEV 0
    #endif
    #define SAMPLE_AUDIO_AO_DEV 4
  2. 确定AI属性是立体声

    
    stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_48000; // 48K sample
    stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
    stAioAttr.enWorkmode = AIO_MODE_I2S_SLAVE;
    stAioAttr.enSoundmode =  AUDIO_SOUND_MODE_STEREO; //立体声
    stAioAttr.u32EXFlag = 1;
    stAioAttr.u32FrmNum = 30;
    stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
    stAioAttr.u32ChnCnt = 2; // 只使用2个AI通道,最大支持16个通道
    stAioAttr.u32ClkSel = 1; 
  3. 只使能stAioAttr.u32ChnCnt 小于 stAioAttr.u32ChnCnt/2的ai通道
    原因是这个:

    对于双声道模式,只应对左声道(即编号小于设备属性中通道数 u32ChnCnt 一半的通
    道)进行操作, SDK 内部会自动对右声道也进行相应的操作。

  4. 使用UserGetMode

    
    HI_S32 HI_MPI_AI_GetFrame(AUDIO_DEV AudioDevId, AI_CHN AiChn,
    AUDIO_FRAME_S *pstFrm, AEC_FRAME_S *pstAecFrm, HI_BOOL bBlock);

typedef struct hiAUDIO_FRAME_S
{
AUDIO_BIT_WIDTH_E enBitwidth;
AUDIO_SOUND_MODE_E enSoundmode;
HI_VOID *pVirAddr[2];// 双声道下pVirAddr[0]表示左声道,pVirAddr[1]表示右声道
HI_U32 u32PhyAddr[2];
HI_U64 u64TimeStamp;
HI_U32 u32Seq;
HI_U32 u32Len;
HI_U32 u32PoolId[2];
}AUDIO_FRAME_S;

最为关键的就是数据的存储问题,一开始我是这样存储数据的。

fwrite(stFrame.pVirAddr[0], 1 ,stFrame.u32Len , pstAiCtl->pfd);
fwrite(stFrame.pVirAddr[1], 1 ,stFrame.u32Len , pstAiCtl->pfd);

写成文件怎么也不对,后来Google了下PCM格式才知道是数据格式问题,改成这样

for(i=0; i<stFrame.u32Len; i+=2) {
fwrite(stFrame.pVirAddr[0]+i, 1 ,2 , pstAiCtl->pfd);
fwrite(stFrame.pVirAddr[1]+i, 1 ,2 , pstAiCtl->pfd);
}


LPCM各个模式下的数据存储格式:
![](/uploads/1511350784_97533.jpg)
也就是说数据是交错排放的,有点类似于YUV里面的packed模式。

最后遗留的问题是不管使用SYS_BIND的方式还是在AiChn里面使用 HI_MPI_AENC_SendFrame发送编码真,使用HI_MPI_AENC_GetStream取得的数据始终是mono的,不知道为什么。
测试的效果如下:
![](/uploads/1511350864_20748.jpg)
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
goodman
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
goodman
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区