在stm32f4 discovery fw中Audio_playback_and_record的USB OTG基础上修改,读取U盘中名为audio.mp3的文件,解码正常,可以听歌,没有杂音,但是从板载DAC出来的不是立体声,两个声道混合一起的声音。就像老式单声道收音机。求助。
解决了,原先以为是出在I2S上,后来发现还是出在解码过程中。
问题出在拷贝过来的Helix Mp3解码库上。百度上翻了不少实例,发现大家都一样,只能自己调试单步看。
1. 对比了原版的helix mp3解码库,拷贝过来的库多了一个mp3_play.c。里面有两个函数:
/************************************************************************************/
/*
* File Name : Convert_Stereo
* Description : I have do some modification in Subband() function due to the long time of
* decode.Using PolyphaseMono() function which is used in decode mono mp3,to decode
* Stereo,so must use this funtion to convert mono to Stereo.
* Input : Adress of buffer data
* Output : None
* Return : None
*/
/************************************************************************************/
void Convert_Stereo(short *buffer)
/***********************************************************************************/
/*
* File Name : Convert_Mono
* Description : after decoder a frame of Mono MP3,the buffer will fill by 1152 halfword,this function
* will change Mono into Stereo. Mono
1,L2,L3,L4. Stereo
1R1,L2R2,L3R3.L4R4
* Input : Adress of buffer data
* Output : None
* Return : None
*/
/***********************************************************************************/
void Convert_Mono(short *buffer)
看了注释后才知道第一个函数是将两个声道混合。
第二个函数是将单声道复制到另外一个声道。
在播放大循环中调用了void Convert_Stereo(short *buffer),混合两个声道,所以放音出来是单声道声音。
注释掉后发现声音像哨子,还是不对。
在void Convert_Stereo(short *buffer)上面的注释中发现了蹊跷,原来以前的人对这个库进行了修改,找到库里的subband.c
找到了int Subband(MP3DecInfo *mp3DecInfo, short *pcmBuf)
既然没有双声道 就到双声道代码区找
if (mp3DecInfo->nChans == 2) {
/* stereo */
for (b = 0; b < BLOCK_SIZE; b++) {
// FDCT32(mi->outBuf[0], sbi->vbuf + 0*32, sbi->vindex, (b & 0x01), mi->gb[0]);
// FDCT32(mi->outBuf[1], sbi->vbuf + 1*32, sbi->vindex, (b & 0x01), mi->gb[1]);
// PolyphaseMono(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef);
// sbi->vindex = (sbi->vindex - (b & 0x01)) & 7;
// pcmBuf += (2 * NBANDS);
/*the normal code*/
FDCT32(mi->outBuf[0]
, sbi->vbuf + 0*32, sbi->vindex, (b & 0x01), mi->gb[0]);
FDCT32(mi->outBuf[1], sbi->vbuf + 1*32, sbi->vindex, (b & 0x01), mi->gb[1]);
PolyphaseStereo(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef);
sbi->vindex = (sbi->vindex - (b & 0x01)) & 7;
pcmBuf += (2 * NBANDS);
}
上面绿 {MOD}部分是作者原先在使用的代码,下半黑 {MOD}部分才是原先正常的代码,区别就是
PolyphaseMono(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef);
PolyphaseStereo(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef);
一个是单声道函数 一个立体声函数。把修改部分注释掉,重新编译,OK,现在声音对了,是正常的立体声。
原先的作者估计是想在单个喇叭上播放,所以对库进行了修改。
传新的附件。
一周热门 更多>