在F4Discovery 板上移植了Helix 软解MP3,放音不是立体声,求助(解决了)

2019-07-20 07:47发布

在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.  Mono1,L2,L3,L4.  Stereo1R1,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,现在声音对了,是正常的立体声。

原先的作者估计是想在单个喇叭上播放,所以对库进行了修改。

传新的附件。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。