新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2016-5-13
- 在线时间
- 6 小时
|
1金钱
关于用VS1053播放MP3音乐的问题,直接在main函数中调用mp3_play_song(u8 *pname)函数能读到相关路径下文件数据,函数返回值为0,但就是没有声音,用的是战舰V2开发板测试,
而在主函数中调用 mp3_play( )函数能播放音乐,功能正常,mp3_play_song()函数写的有问题还是咋滴,望大神解惑?(程序用的是战舰例程)
战舰部分例程:
void mp3_play(void)
{
u8 res;
DIR mp3dir; //目录
FILINFO mp3fileinfo;//文件信息
u8 *fn; //长文件名
u8 *pname; //带路径的文件名
u16 totmp3num; //音乐文件总数
u16 curindex; //图片当前索引
u8 key; //键值
u16 temp;
u16 *mp3indextbl; //音乐索引表
while(f_opendir(&mp3dir,"0:/MUSIC"))//打开图片文件夹
{
// Show_Str(30,190,240,16,"MUSIC文件夹错误!",16,0);
printf("MUSIC文件夹错误!... \r\n");
delay_ms(200);
// LCD_Fill(30,190,240,206,WHITE);//清除显示
delay_ms(200);
}
totmp3num=mp3_get_tnum("0:/MUSIC"); //得到总有效文件数
printf("文件数=%d \r\n",totmp3num);
while(totmp3num==NULL)//音乐文件总数为0
{
// Show_Str(30,190,240,16,"没有音乐文件!",16,0);
printf("没有音乐文件!... \r\n");
delay_ms(200);
// LCD_Fill(30,190,240,146,WHITE);//清除显示
delay_ms(200);
}
mp3fileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度
mp3fileinfo.lfname=mymalloc(SRAMIN,mp3fileinfo.lfsize); //为长文件缓存区分配内存
pname=mymalloc(SRAMIN,mp3fileinfo.lfsize); //为带路径的文件名分配内存
mp3indextbl=mymalloc(SRAMIN,2*totmp3num); //申请2*totmp3num个字节的内存,用于存放音乐文件索引
while(mp3fileinfo.lfname==NULL||pname==NULL||mp3indextbl==NULL)//内存分配出错
{
// Show_Str(30,190,240,16,"内存分配失败!",16,0);
printf("内存分配失败!... \r\n");
delay_ms(200);
// LCD_Fill(30,190,240,146,WHITE);//清除显示
delay_ms(200);
}
VS_HD_Reset();
VS_Soft_Reset();
vsset.mvol=220; //默认设置音量为220.
// mp3_vol_show((vsset.mvol-100)/5); //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
printf("音量=%d \r\n",(vsset.mvol-100)/5);
//记录索引
res=f_opendir(&mp3dir,"0:/MUSIC"); //打开目录
if(res==FR_OK)
{
curindex=0;//当前索引为0
while(1)//全部查询一遍
{
temp=mp3dir.index; //记录当前index
res=f_readdir(&mp3dir,&mp3fileinfo); //读取目录下的一个文件
if(res!=FR_OK||mp3fileinfo.fname[0]==0)break; //错误了/到末尾了,退出
fn=(u8*)(*mp3fileinfo.lfname?mp3fileinfo.lfname:mp3fileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件
{
mp3indextbl[curindex]=temp;//记录索引
curindex++;
}
}
}
curindex=0; //从0开始显示
res=f_opendir(&mp3dir,(const TCHAR*)"0:/MUSIC"); //打开目录
while(res==FR_OK)//打开成功
{
dir_sdi(&mp3dir,mp3indextbl[curindex]); //改变当前目录索引
res=f_readdir(&mp3dir,&mp3fileinfo); //读取目录下的一个文件
if(res!=FR_OK||mp3fileinfo.fname[0]==0)break; //错误了/到末尾了,退出
fn=(u8*)(*mp3fileinfo.lfname?mp3fileinfo.lfname:mp3fileinfo.fname);
strcpy((char*)pname,"0:/MUSIC/"); //复制路径(目录)
strcat((char*)pname,(const char*)fn); //将文件名接在后面
// LCD_Fill(30,190,240,190+16,WHITE); //清除之前的显示
// Show_Str(30,190,240-30,16,fn,16,0); //显示歌曲名字
printf("MP3_name:%s \r\n",fn);
// mp3_index_show(curindex+1,totmp3num);
// printf("%d/%d \r\n",curindex+1,totmp3num);
key=mp3_play_song(pname); //播放这个MP3
if(key==2) //上一曲
{
if(curindex)curindex--;
else curindex=totmp3num-1;
}
else if(key<=1)//下一曲
{
curindex++;
if(curindex>=totmp3num)curindex=0;//到末尾的时候,自动从头开始
}
else break; //产生了错误
}
myfree(SRAMIN,mp3fileinfo.lfname); //释放内存
myfree(SRAMIN,pname); //释放内存
myfree(SRAMIN,mp3indextbl); //释放内存
}
u8 mp3_play_song(u8 *pname)
{
FIL* fmp3;
u16 br;
u8 res,rval;
u8 *databuf;
u16 i=0;
u8 key;
rval=0;
fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//申请内存
databuf=(u8*)mymalloc(SRAMIN,4096); //开辟4096字节的内存区域
if(databuf==NULL||fmp3==NULL)rval=0XFF ;//内存申请失败.
if(rval==0)
{
VS_Restart_Play(); //重启播放
VS_Set_All(); //设置音量等信息
VS_Reset_DecodeTime(); //复位解码时间
res=f_typetell(pname); //得到文件后缀
if(res==0x4c)//如果是flac,加载patch
{
VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
}
res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//打开文件
if(res!=FR_OK)
{
rval=0XFF;//出现错误
printf("---res---=%d \r\n",res);
}
else//打开成功.
{
VS_SPI_SpeedHigh(); //高速
while(rval==0)
{
res=f_read(fmp3,databuf,4096,(UINT*)&br);//读出4096个字节
i=0;
do//主播放循环
{
if(VS_Send_MusicData(databuf+i)==0)//给VS10XX发送音频数据
{
i+=32;
}
else //VS10XX忙
{
key=KEY_Scan(0);
switch(key)
{
case KEY0_PRES:
rval=1; //下一曲
printf("------下一曲------ \r\n");
break;
case KEY2_PRES:
rval=2; //上一曲
printf("------上一曲------ \r\n");
break;
case WKUP_PRES: //音量增加
if(vsset.mvol<250)
{
vsset.mvol+=5;
VS_Set_Vol(vsset.mvol);
}
else vsset.mvol=250;
printf("音量增大到 %d \r\n",(vsset.mvol-100)/5);
// mp3_vol_show((vsset.mvol-100)/5); //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
break;
case KEY1_PRES: //音量减
if(vsset.mvol>100)
{
vsset.mvol-=5;
VS_Set_Vol(vsset.mvol);
}
else vsset.mvol=100;
printf("音量减小到 %d \r\n",(vsset.mvol-100)/5);
break;
}
// mp3_msg_show(fmp3->fsize);//显示信息
}
}while(i<4096);//循环发送4096个字节
if(br!=4096||res!=0)
{
rval=0;//所有MP3文件都读完才能进此
break;//读完了.
}
}
f_close(fmp3);
}
}
myfree(SRAMIN,databuf);
myfree(SRAMIN,fmp3);
return rval;
}
|
|