高级会员

- 积分
- 680
- 金钱
- 680
- 注册时间
- 2013-8-16
- 在线时间
- 37 小时
|

楼主 |
发表于 2015-5-25 11:02:34
|
显示全部楼层
下面就是控制MP3播放的函数代码:
//播放音乐
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(60,210,240,16,"MUSIC文件夹错误!",16,0);
delay_ms(200);
LCD_Fill(60,210,240,226,WHITE);//清除显示
delay_ms(200);
}
totmp3num=mp3_get_tnum("0:/MUSIC"); //得到总有效文件数
while(totmp3num==NULL)//音乐文件总数为0
{
Show_Str(60,210,240,16,"没有音乐文件!",16,0);
delay_ms(200);
LCD_Fill(60,210,240,226,WHITE);//清除显示
delay_ms(200);
}
mp3fileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度
mp3fileinfo.lfname=mymalloc(mp3fileinfo.lfsize);//为长文件缓存区分配内存
pname=mymalloc(mp3fileinfo.lfsize); //为带路径的文件名分配内存
mp3indextbl=mymalloc(2*totmp3num); //申请2*totmp3num个字节的内存,用于存放音乐文件索引
while(mp3fileinfo.lfname==NULL||pname==NULL||mp3indextbl==NULL)//内存分配出错
{
Show_Str(60,210,240,16,"内存分配失败!",16,0);
delay_ms(200);
LCD_Fill(60,210,240,226,WHITE);//清除显示
delay_ms(200);
}
VS_HD_Reset();
VS_Soft_Reset();
vsset.mvol=200; //默认设置音量为210.
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(60,210,240,210+16,WHITE); //清除之前的显示
Show_Str(60,210,240-60,16,fn,16,0); //显示歌曲名字
mp3_index_show(curindex+1,totmp3num);
key=mp3_play_song(pname); //播放这个MP3
if(key==KEY1_PRES) //上一曲
{
if(curindex)curindex--;
else curindex=totmp3num-1;
}else if(key==KEY0_PRES)//下一曲
{
curindex++;
if(curindex>=totmp3num)curindex=0;//到末尾的时候,自动从头开始
}else break; //产生了错误
}
myfree(mp3fileinfo.lfname); //释放内存
myfree(pname); //释放内存
myfree(mp3indextbl); //释放内存
} |
|