📄 mp3player.c
字号:
#include "text.h"
#include "lcd.h"
#include "fat.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "VS10XX.h"
#include "mp3player.h"
#include "key.h"
#include "led.h"
#include "spi.h"
u16 f_kbps=0;//歌曲文件位率
//显示播放时间,比特率 等事信息
void MP3_Msg_Show(u32 lenth,u16 index,u16 total)
{
static u16 playtime=0;//播放时间标记
u16 time=0;// 时间变量
u16 temp=0;
if(f_kbps==0xffff)//未更新过
{
playtime=0;
f_kbps=GetHeadInfo(); //获得比特率
}
time=GetDecodeTime(); //得到解码时间
if(time!=playtime)//1s时间到,更新显示数据
{
playtime=time;//更新时间
temp=GetHeadInfo(); //获得比特率
if(temp!=f_kbps)
{
f_kbps=temp;//更新KBPS
time=((float)lenth/f_kbps)/125;//更新时间
}
//显示播放时间
LCD_Show2Num(60,110,time/60,2,16,0); //分钟
LCD_ShowChar(60+16,110,':',16,0);
LCD_Show2Num(60+24,110,time%60,2,16,0);//秒钟
LCD_ShowChar(60+40,110,'/',16,0);
//显示总时间
if(f_kbps)time=(lenth/f_kbps)/125;//得到秒钟数 (文件长度(字节)/(1000/8)/比特率=持续秒钟数
else time=0;//非法位率
LCD_Show2Num(60+48,110,time/60,2,16,0);//分钟
LCD_ShowChar(60+64,110,':',16,0);
LCD_Show2Num(60+72,110,time%60,2,16,0);//秒钟
//显示当前曲目的索引,及总曲目数
LCD_Show2Num(60+0,130,index,3,16,0); //索引
LCD_ShowChar(60+24,130,'/',16,0);
LCD_Show2Num(60+32,130,total,3,16,0); //总曲目
//显示位率
LCD_ShowNum(60+60,130,f_kbps,3,16);//显示位率
LCD_ShowString(60+84,130,"Kbps");
}
}
//播放音乐
void Play_Music(void)
{
u16 i;
u8 key;
FileInfoStruct FileInfo;
u16 mus_total=0;//总音乐文件的个数
if(FAT32_Enable)Cur_Dir_Cluster=FirstDirClust;//根目录簇号
else Cur_Dir_Cluster=0;
Get_File_Info(Cur_Dir_Cluster,&FileInfo,T_MP3|T_WMA|T_WAV|T_MID,&mus_total);//获取当前文件夹下面的目标文件个数
i=1;
while(1)
{
key=Play_Song(i,mus_total);
if(key==1)
{
if(i<mus_total)i++;
else i=1;
}else if(key==2)
{
if(i>1)i--;
else i=mus_total;
}else
{
i++;
if(i>mus_total)i=1;
}
}
}
////////////////////////////////////////////////////////
//播放音乐
//index:播放的歌曲编号
//返回值:0,成功;1,下一曲;2,上一曲;0xff 得到文件信息失败;0xfe,硬复位失败;
u8 MUSIC_BUFFER[512];
u8 Play_Song(u16 index,u16 total)
{
u32 bfactor;
u32 bcluster;
u16 count;
u8 key,n;
u16 i;
u8 pause=0;//不暂停
FileInfoStruct FileInfo;
i=Get_File_Info(Cur_Dir_Cluster,&FileInfo,T_MP3|T_WMA|T_WAV|T_MID,&index);
if(i==0)return 0xff;//得到文件信息失败。
if(VS_HD_Reset())return 0xfe;//硬复位
VS_Soft_Reset(); //软复位VS1053
set1003(); //设置音量等信息
ResetDecodeTime();//复位解码时间
LCD_Fill(0,110,239,319,WHITE); //整个屏幕清空
Show_Str(60,150,FileInfo.F_Name,16,0); //显示歌曲名字
bfactor=fatClustToSect(FileInfo.F_StartCluster); //得到开始簇对应的扇区
bcluster=FileInfo.F_StartCluster; //得到文件开始簇号
count=0;
while(1) //播放音乐的主循环
{
if(SD_ReadSingleBlock(bfactor,MUSIC_BUFFER))break;//读取一个扇区的数据
SPIx_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M
count++;//扇区计数器
i=0;
do //主播放循环
{
if(VS_DQ!=0&&pause==0) // 非暂停 送数据给VS1003
{
VS_XDCS=0; //MP3_DATA_CS=0;
for(n=0;n<32;n++)
{
SPIx_ReadWriteByte(MUSIC_BUFFER[i++]);
}
VS_XDCS=1; //MP3_DATA_CS=1;
//VS_WR_Data(MUSIC_BUFFER[i++]);//发送音乐数据
}
key=KEY_Scan();
if(key)
{
switch(key)
{
case 1://下一首歌
return 1;
case 2://上一首歌
return 2;
case 3://暂停/播放
pause=!pause;
}
}
}while(i<511);//循环发送512个字节
MP3_Msg_Show(FileInfo.F_Size,index,total);
bfactor++; //扇区加
if(count>=SectorsPerClust)//一个簇结束,换簇
{
count=0;
bcluster=FAT_NextCluster(bcluster);
//printf("NEXT:%d\n",bcluster);
LED1=!LED1;
//文件结束
if((FAT32_Enable==0&&bcluster==0xffff)||bcluster==0x0ffffff8||bcluster==0x0fffffff)break;//error
bfactor=fatClustToSect(bcluster);
}
}
VS_HD_Reset(); //硬复位
VS_Soft_Reset();//软复位
LED1=1; //关闭DS1
return 0;//返回按键的键值!
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -