?? mp3player.c
字號(hào):
#include "COMM.h"
u16 f_kbps=0;//歌曲文件位率
//進(jìn)度條,時(shí)間,比特率 等事實(shí)信息顯示控制
void MP3_PROG(u32 pos,u32 lenth)
{
static u16 playtime=0;//播放時(shí)間標(biāo)記
float propos=0;
u16 time=0;// 時(shí)間變量
u16 temp=0;
if(f_kbps==0xffff)//未更新過(guò)
{
playtime=0;
f_kbps=GetHeadInfo(); //獲得比特率
}
POINT_COLOR=GREEN;
BACK_COLOR=MP3COLOR4;
if(lenth)
{
propos=(float)pos*512/lenth;//得到百分比
if(propos>1)propos=1;//限制propos的范圍
}else return;//文件為空,返回
if(f_kbps)//對(duì)位率不為0 的文件
{
time=(lenth/f_kbps)/125;//總時(shí)間
time=propos*time; //得到當(dāng)前比例時(shí)間
}else time=GetDecodeTime(); //對(duì)位率為0的文件,得到解碼時(shí)間
propos=propos*180;//得到實(shí)際長(zhǎng)度
TFT_ProBar((u8)propos);//顯示進(jìn)度條
if(time!=playtime)//1s時(shí)間到,更新顯示數(shù)據(jù)
{
temp=GetHeadInfo(); //獲得比特率
if(temp)
{
f_kbps=temp;//更新KBPS
time=(((float)lenth/f_kbps)/125)*(propos/180);//更新時(shí)間
}
playtime=time;//更新時(shí)間
//顯示播放時(shí)間
TFT_ShowNum(87,72,time/60,12,0); //分鐘
TFT_ShowChar(99,72,':',12,0);
TFT_ShowNum(105,72,time%60,12,0);//秒鐘
TFT_ShowChar(117,72,'/',12,0);
//顯示總時(shí)間
if(f_kbps)time=(lenth/f_kbps)/125;//得到秒鐘數(shù) (文件長(zhǎng)度(字節(jié))/(1000/8)/比特率=持續(xù)秒鐘數(shù)
else time=0;//非法位率
TFT_ShowNum(123,72,time/60,12,0);//顯示總分鐘數(shù)
TFT_ShowChar(135,72,':',12,0);
TFT_ShowNum(141,72,time%60,12,0);//顯示總秒鐘數(shù)
//顯示位率
TFT_Show3Num(168,72,f_kbps,12,0);
TFT_ShowChar(186,72,'k',12,0);
TFT_ShowChar(192,72,'b',12,0);
TFT_ShowChar(198,72,'p',12,0);
TFT_ShowChar(204,72,'s',12,0);
}
}
u8 *MP3_VOL[5]={" 音量 "," 高音 "," 低音 ","左聲道","右聲道"};
u8 *MP3_OTHER[3]={"頻譜顯示","歌詞顯示","退出播放"};
//檢測(cè)數(shù)據(jù)合法性
void VOL_Data_Check(u8 volx,u8 *datax)
{
switch(volx)
{
case 0: //主音量
if(*datax>64)*datax=64;
if(*datax<1)*datax=1;
break;
case 1: //高音
case 2: //低音
if(*datax>15)*datax=15;
if(*datax<1)*datax=1;
break;
case 3: //左聲道
case 4: //右聲道
if(*datax>32)*datax=32;
if(*datax<1)*datax=1;
break;
case 5://超重音
if(*datax>1)*datax=1;
break;
}
}
//顯示數(shù)據(jù)
void MP3_MsgBox_Data(u16 *sysmsg,u8 menu,u8 key)
{
u16 volx;
BACK_COLOR=MP3COLOR6;//背景色
POINT_COLOR=RED;
TFT_Fill(58,259,138,275,MP3COLOR6);//抹掉上次數(shù)據(jù)
switch(menu)
{
case 0://音效模式
if(key==7)INITDSP++;
else if(key==8)
{
if(INITDSP==0)INITDSP=4;//數(shù)據(jù)合法性判斷
else INITDSP--;
}
if(INITDSP>4)INITDSP=0;
TFT_ShowNum(82,259,INITDSP+1,16,0);//顯示數(shù)據(jù)
break;
case 1:
volx=(*sysmsg>>2)&0x07;
if(key==7)voltemp[volx]++;
else if(key==8)voltemp[volx]--;
VOL_Data_Check(volx,&voltemp[volx]);//數(shù)據(jù)合法性判斷
TFT_ShowNum(82,259,voltemp[volx],16,0);//顯示數(shù)據(jù)
break;
case 2:
volx=(*sysmsg>>5)&0x03;
if(key==7){volx++;if(volx>2)volx=0;}
else if(key==8)
{
if(volx)volx--;
else volx=2;
}
*sysmsg&=0XFF9F;
*sysmsg|=volx<<5;
Show_Str(58,259,MP3_OTHER[volx],0);
break;
}
//第三欄信息更新
BACK_COLOR=MP3COLOR3;//背景色
POINT_COLOR=GRED;
for(volx=0;volx<3;volx++)TFT_ShowNum(26+60*volx,47,voltemp[volx],16,0);//顯示音量信息
TFT_ShowNum(206,47,INITDSP+1,16,0);//顯示音效信息
}
//顯示MP3目錄表的信息
//*menu :先前的目錄號(hào)
//*sysmsg :但前運(yùn)行標(biāo)志信息
//curmenu:當(dāng)前目錄號(hào)
void MP3_MsgBox_Menu(u16 *sysmsg,u8 *menu,u8 curmenu)
{
u16 temp;
BACK_COLOR=MP3COLOR6;
//顯示音效部分
temp=(*sysmsg>>9)&0x01;
if(curmenu==0)
{
POINT_COLOR=RED;
if(*menu==curmenu)//再次點(diǎn)擊
{
temp=!temp;
*sysmsg&=0XFDFF;
*sysmsg|=temp<<9;
}
*menu=curmenu;
}
else POINT_COLOR=GREEN;
if(temp)Show_Str_Mid(8,227,"存音效",0,48);
else Show_Str_Mid(8,227," 音效 ",0,48);
//顯示音量
temp=(*sysmsg>>2)&0x07;
if(curmenu==1)
{
POINT_COLOR=RED;
if(*menu==curmenu)//再次點(diǎn)擊
{
temp++;
if(temp>=5)temp=0;
*sysmsg&=0XFFE3;
*sysmsg|=temp<<2;
temp=(*sysmsg>>2)&0x07;
}
*menu=curmenu;
}
else POINT_COLOR=GREEN;
Show_Str_Mid(64,227,MP3_VOL[temp],0,48);
//其他選擇
if(curmenu==2)
{
*menu=curmenu;
POINT_COLOR=RED;
}
else POINT_COLOR=GREEN;
Show_Str_Mid(120,227," 其他 ",0,48);
}
//RGB音樂(lè)彩燈控制
//val:0~100的數(shù)據(jù)
void Mus_RGB_LED(u8 rval,u8 gval,u8 bval)
{
float ftemp;
ftemp=(float)MAX_Red/100;
rval=ftemp*rval;//得到紅色分量值
ftemp=(float)255/100;
gval=ftemp*gval;//得到紅色分量值
bval=ftemp*bval;//得到紅色分量值
LED_R=rval;
LED_G=gval;
LED_B=bval;
}
//播放選定的歌曲
//index:當(dāng)前播放的歌曲索引
//total:總共音樂(lè)文件的個(gè)數(shù)
//關(guān)于音樂(lè)的幾乎所有控制都在這個(gè)里面
u8 Mus_Play(FileInfoStruct *FileName,u16 index,u16 total)
{
unsigned long bfactor=0; //物理扇區(qū),絕對(duì)地址
unsigned long bcluster=0;//物理簇號(hào)
u32 file_pos=0; //記錄文件播放的長(zhǎng)度
u8 count=0; //扇區(qū)計(jì)數(shù)器,用于換簇
u16 i,n;
u8 key,menux=1;
u8 keycnt; //按鍵計(jì)數(shù)器
u8 FFT_LRC=0;//默認(rèn)FFT
u8 *BUFFER=(u8*)MCUBuffer;//指向JPEG的開(kāi)始512字節(jié)
u8 *spedate=(u8*)MCUBuffer+512;//當(dāng)前頻譜分析的結(jié)果寄存器
u8 *topval=(u8*)MCUBuffer+526; //FFT柱的最高點(diǎn)記錄表
u8 *flyval=(u8*)MCUBuffer+540; //FFT柱的懸浮點(diǎn)記錄表
u8 mark=1; //標(biāo)記
u8 timer=0; //頻譜定時(shí)器
u32 topstay1; //最高點(diǎn)頻點(diǎn)延時(shí)1
u32 topstay2; //最高點(diǎn)頻點(diǎn)延時(shí)2
//bit0~9用來(lái)標(biāo)記功能 ,默認(rèn)全部循環(huán)
//bit0,1:循環(huán)模式;bit2,3,4:音量設(shè)置;bit5,6:其他設(shè)置
//bit7:超重低音標(biāo)記;bit8:是否有歌詞;bit9:音效存/取標(biāo)記
u16 sysfun=1;
u16 temp;
u8 forpreclust;//快進(jìn)快退需要的簇?cái)?shù)
timer3_init();//初始化歌詞顯示定時(shí)器
INITDSP=FM24C16_ReadOneByte(30);//調(diào)用DSP值
if(INITDSP>4)//未初始化,則初始化
{
INITDSP=0;
for(temp=0;temp<31;temp++)FM24C16_WriteOneByte(temp,0);//全部清空
}else read_dsp(); //已經(jīng)初始化過(guò)了 讀取DSP效果
init_pt2314(MP3_Audio);//設(shè)置聲音
MUS_RGB_Status=FM24C16_ReadOneByte(487);//讀取音樂(lè)彩燈標(biāo)志
if(FFT_LRC==0)
{
LED_R=0;
LED_G=0;
LED_B=0;
ENRGB(MUS_RGB_Status);//使能音樂(lè)彩燈(如果設(shè)置MUS_RGB_Status位的話)
}else ENRGB(0); //關(guān)閉彩燈
Read_VS_Set();//讀取VS1003的設(shè)置
RESTART:
forpreclust=FileName->F_Size/(SectorsPerClust*BytesPerSector*50);//每次前進(jìn)/后退 2%所需要的簇?cái)?shù)
if(forpreclust<2)forpreclust=2;//最少也要兩個(gè)簇
//fft部分,變量清空
topstay1=0;
topstay2=0;
file_pos=0;
keycnt=0;
f_kbps=0xffff;//文件位率設(shè)置為不可能值
count=0; //扇區(qū)計(jì)數(shù)器
bfactor=fatClustToSect(FileName->F_StartCluster);//得到開(kāi)始簇對(duì)應(yīng)的扇區(qū)
bcluster=FileName->F_StartCluster; //得到文件開(kāi)始簇號(hào)
printf("F_StartCluster:%d\n",FileName->F_StartCluster);
//從當(dāng)前目錄下找歌詞文件,有,則標(biāo)記.
if(FindLrcFile(Cur_Dir_Cluster,FileName->F_ShortName))
{
sysfun|=1<<8; //標(biāo)記有歌詞
Lrc_Read_Init(); //初始化歌詞讀取
}else sysfun&=~(1<<8);//標(biāo)記沒(méi)有歌詞
Mp3Reset(); //硬復(fù)位
Vs1003SoftReset();//軟復(fù)位VS1003
LoadPatch(); //加載頻譜分析代碼
Load_Gui_Mp3(sysfun);//加載播放界面
timer=5;//設(shè)置到一個(gè)不可能的值,初始化信息欄
MP3_MsgBox_Menu(&sysfun,&timer,menux);//加載信息欄
MP3_MsgBox_Data(&sysfun,menux,1); //加載數(shù)據(jù)
//顯示但前文件夾下的歌曲數(shù)目,及當(dāng)前歌曲的索引
BACK_COLOR=MP3COLOR4;
POINT_COLOR=GREEN;
TFT_Show3Num(30,72,index,12,0);
TFT_ShowChar(48,72,'/',12,0);
TFT_Show3Num(54,72,total,12,0);
//顯示歌曲標(biāo)題
POINT_COLOR=WHITE;
Show_Str_Mid(0,24,FileName->F_Name,0x01,240); //顯示歌曲名字
//FFT數(shù)據(jù)清空
for(i=0;i<14;i++)//清空相關(guān)數(shù)據(jù)
{
topval[i]=0;
flyval[i]=0;
spedate[i]=0;
}
key=0;
Pen_Point.Key_Sta=Key_Up;//釋放按鍵
while(1) //播放音樂(lè)的主循環(huán)
{
if(SD_ReadSingleBlock(bfactor,BUFFER))break;//讀取一個(gè)扇區(qū)的數(shù)據(jù)
i=0;
count++;//扇區(qū)計(jì)數(shù)器
do //主播放循環(huán)
{
while((GPIOC->IDR&MP3_DREQ)==0&&((sysfun&0X0400)==0)) //等待高/進(jìn)行頻譜顯示/非暫停
{
if(FFT_LRC==0)//頻譜模式
{
if(mark)
{
GetSpec(spedate);//得到頻譜數(shù)據(jù)
if(MUS_RGB_Status==1)Mus_RGB_LED(topval[1],topval[10],topval[7]);//使能了漸變模式
else if(MUS_RGB_Status==2)Mus_RGB_LED(spedate[1],spedate[10],spedate[7]);//使能了跳變模式
MP3_PROG(file_pos,FileName->F_Size);//MP3進(jìn)度顯示/播放時(shí)間
}
else TFT_ShowFFT(spedate,topval,flyval,&topstay1,&topstay2);//頻譜顯示
timer++;
if(timer>=3)//FFT最高的懸浮點(diǎn)控制
{
Top_Delet_FFT(flyval,&topstay1,&topstay2);//刪除高端
timer=0;
}
}else //歌詞模式
{
if(mark&&sysfun&(1<<8))LyricDisplayCtrl();//存在歌詞,則顯示
else if(mark==0)MP3_PROG(file_pos,FileName->F_Size);//MP3進(jìn)度顯示/播放時(shí)間
//printf("end\n");
}
mark=!mark;
}
if((GPIOC->IDR&MP3_DREQ)!=0&&((sysfun&0X0400)==0)) //非暫停,送數(shù)據(jù)給VS1003
{
for(n=0;n<32;n++)Vs1003_DATA_Write(BUFFER[i++]);//發(fā)送音樂(lè)數(shù)據(jù)
}
if((Pen_Point.Key_Sta==Key_Down||NPEN)&&Pen_Point.Key_LSta)key=Touch_To_Num(3);//得到按鍵值
if(PEN)//按鍵松開(kāi)了,狀態(tài)改變(狀態(tài)機(jī))
{
Pen_Point.Key_LSta=1;
keycnt=0;
Pen_Point.Key_Sta=Key_Up;
}
if(key)//有按鍵按下
{
Pen_Point.Key_LSta=0;
switch(key)
{
case 1://循環(huán)模式更改
temp=sysfun&0x03;
temp++;
if(temp>1)temp=0;//只用其中兩個(gè),單曲循環(huán)/全部循環(huán)
//顯示循環(huán)模式
BACK_COLOR=MP3COLOR4;
POINT_COLOR=GREEN;
TFT_ShowButton(214,72,temp+2);//加載循環(huán)模式
sysfun&=0XFFFC;
sysfun|=temp;//更改標(biāo)志位
break;
case 2://Supper Bass 部分
temp=(sysfun>>7)&0x01;
voltemp[5]=temp;//記錄超重低音值
temp=!temp;
init_pt2314(MP3_Audio);//設(shè)置生效
//顯示超重低音部分
BACK_COLOR=MP3COLOR5;
POINT_COLOR=GRED;
if(temp)Show_Str_Mid(0,102,"Supper Bass",0,240);
else Show_Str_Mid(0,102," ",0,240);//清除顯
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -