音源用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