本帖最后由 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]
请原子哥,及各位高能指教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
[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]
原子哥,各们高能,请伸出你的援助之手。
将单声道数据扩充到立体声输出就行了
读数据的时候,读取一半,没错,但是你数据处理(填充)的时候,出错了
声音是16位的,你搞个8位的数组在处理,而且没处理好,自然不能正常出声。
仿真一下吧,很好解决的。
仿真看看数据,你就知道哪里错了,比如你读到单声道0XAAFF,填充到立体声后,肯定是0XAAFF AAFF。
你这种处理方式,是无法得到0XAAFF AAFF的。
一周热门 更多>