[mw_shl_code=c,true]以下为源代码,不知道如何修改。使其成为播放指定的一首歌曲,并且在歌曲播放完成之后停止工作。。谢谢各位大神。。[/mw_shl_code]
[mw_shl_code=c,true]//??·?????
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);
delay_ms(200);
LCD_Fill(30,190,240,206,WHITE);//????????
delay_ms(200);
}
totmp3num=mp3_get_tnum("0:/MUSIC"); //????×????§??????
while(totmp3num==NULL)//????????×?????0
{
Show_Str(30,190,240,16,"????????????!",16,0);
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);
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
//?????÷??
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); //?????è?ú??×?
mp3_index_show(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); //??·?????
}
//??·????ú???¨???è?ú
//·?????:0,??????·??ê??
// 1,?????ú
// 2,?????ú
// 0XFF,?????í?ó??
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==0)//?ò??????.
{
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
{
key=KEY_Scan(0);
switch(key)
{
case KEY0_PRES:
rval=1; //?????ú
break;
case KEY2_PRES:
rval=2; //?????ú
break;
case WKUP_PRES: //????????
if(vsset.mvol<250)
{
vsset.mvol+=5;
VS_Set_Vol(vsset.mvol);
}else vsset.mvol=250;
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;
mp3_vol_show((vsset.mvol-100)/5); //??????????:100~250,???????±?ò,°???????(vol-100)/5,????,??????0~30
break;
}
mp3_msg_show(fmp3->fsize);//????????
}
}while(i<4096);//???··???4096??×???
if(br!=4096||res!=0)
{
rval=0;
break;//???ê??.
}
}
f_close(fmp3);
}else rval=0XFF;//?????í?ó
}
myfree(SRAMIN,databuf);
myfree(SRAMIN,fmp3);
return rval;
}
[/mw_shl_code]
|