音乐播放单声道文件,怎么搞?求原子哥及各位高能指点。

2019-07-20 17:03发布

本帖最后由 tianxin19 于 2017-1-17 15:44 编辑

STM32F407 实验43音乐播放例程
例程里的附带的音频是双声道的,我要播放一个单声道的音乐总是放不出来。原来的代码如下。
[mw_shl_code=c,true]//填充buf
//buf:数据区
//size:填充数据量
//bits:位数(16/24)
//返回值:读到的数据个数
u32 wav_buffill(u8 *buf,u16 size,u8 bits)
{
        u16 readlen=0;
        u32 bread;
        u16 i;
        u8 *p;
        if(bits==24)//24bit音频,需要处理一下
        {
                readlen=(size/4)*3;                                                        //此次要读取的字节数
                f_read(audiodev.file,audiodev.tbuf,readlen,(UINT*)&bread);        //读取数据
                p=audiodev.tbuf;
                for(i=0;i<size;)
                {
                        buf[i++]=p[1];
                        buf=p[2];
                        i+=2;
                        buf[i++]=p[0];
                        p+=3;
                }
                bread=(bread*4)/3;                //填充后的大小.
        }else
        {
                f_read(audiodev.file,buf,size,(UINT*)&bread);//16bit音频,直接读取数据  
                if(bread<size)//不够数据了,补充0
                {
                        for(i=bread;i<size-bread;i++)buf=0;
                }
        }
        return bread;
}  [/mw_shl_code]

我对代码进行了修改,加入了对声道数的预判,但是效果不对,代码如下:
[mw_shl_code=c,true]//填充buf
//buf:数据区
//size:填充数据量
//bits:位数(16/24)
//返回值:读到的数据个数
u32 wav_buffill(u8 *buf,u16 size,u8 bits,u8 nch)
{
        u16 readlen=0;
        u32 bread;
        u16 i,j;
        u8 *p;
        if(bits==24)//24bit音频,需要处理一下
        {
                readlen=(size/4)*3;                                                        //此次要读取的字节数
                f_read(audiodev.file,audiodev.tbuf,readlen,(UINT*)&bread);        //读取数据
                p=audiodev.tbuf;
                for(i=0;i<size;)
                {
                        buf[i++]=p[1];
                        buf=p[2];
                        i+=2;
                        buf[i++]=p[0];
                        p+=3;
                }
                bread=(bread*4)/3;                //填充后的大小.
        }
        else
        {
                if(nch==2)
                {
                        f_read(audiodev.file,buf,size,(UINT*)&bread);//16bit音频,直接读取数据
                        if(bread<size)//不够数据了,补充0
                        {
                                for(i=bread;i<size-bread;i++)buf=0;
                        }               
                }
                else
                {
                        readlen=size/2;
                        f_read(audiodev.file,audiodev.tbuf,readlen,(UINT*)&bread);        //读取数据
                        p=audiodev.tbuf;
                        for(j=0;j<size;j++)
                        {
                                buf[2*j]=p[j];
                                buf[2*j+1]=p[j];
                        }
                        bread=bread/2;
                }
        }
        return bread;
}  [/mw_shl_code]

请原子哥,及各位高能指教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
红萝卜的蔬菜汤
1楼-- · 2019-07-21 15:15
 精彩回答 2  元偷偷看……
tianxin19
2楼-- · 2019-07-21 20:52
本帖最后由 tianxin19 于 2017-1-24 12:58 编辑

SD卡内三个WAV文件,分别为:Success.wav 、 Fail.wav、一生所爱.wav等。
有些声频播放不正常,怀疑是SPI频率过快,尝试修改SPI速度设置函数[mw_shl_code=c,true]SPI1_Init();                                           //初始化SPI
        SPI1_SetSpeed(SPI_SPEED_2);                //设置为42M时钟,高速模式 [/mw_shl_code]

补充内容 (2017-2-3 10:10):
将其修改为SPI_BaudRatePrescaler_256(相当于32K时钟),问题依旧存在。故排除。
正点原子
3楼-- · 2019-07-21 22:48
tianxin19 发表于 2017-1-24 11:39
SD卡内三个WAV文件,分别为:Success.wav 、 Fail.wav、一生所爱.wav等。
有些声频播放不正常,怀疑是SPI ...

这个你SD卡用的SPI 驱动么?
Moowox
4楼-- · 2019-07-22 02:00
Mark一下
tianxin19
5楼-- · 2019-07-22 06:51
 精彩回答 2  元偷偷看……
tianxin19
6楼-- · 2019-07-22 09:05
 精彩回答 2  元偷偷看……

一周热门 更多>