Chinaunix首页 | 论坛 | 博客
  • 博客访问: 478630
  • 博文数量: 154
  • 博客积分: 746
  • 博客等级: 入伍新兵
  • 技术积分: 1129
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-20 09:20
个人简介

此生既入苦寒山,何妨再攀险峰!

文章分类

全部博文(154)

文章存档

2017年(1)

2016年(2)

2015年(25)

2014年(24)

2013年(8)

2012年(15)

2011年(79)

分类: LINUX

2015-04-13 17:11:38


音源用cooledit放了,双通道放的听不清,但是单通道就能听出来正常的声音,虽然杂音大
问题基本是确定是他们没有用decode的问题,decode里面用了转换了
送DA的数据一定要双通道
他们送单通道数据进da,结果:假设1兆的文件10秒播完(双通道源数据),这个时候你送单通道的源数据,1兆,结果DA用双通道播,就变快了而且声音有问题
参考audio_decode_decode 这个函数里面   if(nSize > 0) 开始的通道转换的,把数据转成双通道再送DA
        else
        {
            int i;
            uint16 *in , *out;
            in = (uint16 *)pdecode_handle->out_buf;
            out = (uint16 *) out_buf;
 
            for(i = 0; i < (nSize >> 1); i ++, in++, out++)
            {
                *out = *in ;
out++;
                *out = *in ;
            }
nSize = nSize *2;
        }
就是这个地方
        out_sz = audio_decode_decode(paudio_talk->decode_handle, paudio_talk->decode_buf + cur_size, 2);
这个是我们在audio_talk里面调用的,最后参数是2,所有打开paudio_talk->decode_handle设置的不是2,就会走下面,把数据转成双通道再送DA

下面是修改后播放正常的源码:
#if 1    

    int len = 0 ;
    int i = 0 ;
    char *pOut = bufOut ;
    if(fdTalkTest < 0)
    {
        //fdTalkTest=open("/mnt/audio3.g711",O_RDONLY) ;
        fdTalkTest=open("/mnt/dana.pcm",O_RDONLY) ;
        if(fdTalkTest < 0 )
        {
            ERR("open file\n") ;
        }
    }
    if(fdTalkTest > 0 )
    {
        len = read(fdTalkTest,bufRead,sizeof(bufRead));
        LOG("read len=%d\n",len) ;
    }
    if(len > 0)
    {
        for(i = 0 ;i < len;i++) //后+
        {
            *pOut = bufRead[i] ;
            pOut ++ ;
            *pOut = bufRead[i] ;
            pOut ++ ;
        }
        talk_data.buf = bufOut ; //之前 bufRead
        talk_data.size = len *2;  //后+  *2
        //int sleepCount = len *1000 / (16 *1024) ;
        //usleep(sleepCount * 1000) ;
        return &talk_data ;
    }
#endif   
阅读(1352) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~