//得到指定编号文件的文件名 编号:0~dfnum+foldernum-1 //index:文件编号(包含了文件夹) //*ftpt:类型表. //num:类型数 //返回值:该文件的文件名. u8* pfnmg_get_ifname(u16 index) { FILINFO finfo; u16 i=0; u8 t,ftype; u8 res; u8 tlfname[100];//100个字节用于存放长文件名 u8 *plfname; plfname=pfnmg_get_pname();//得到当前路径名 res=f_opendir(&dir,(const TCHAR*)plfname);//打开当前目录 finfo.lfsize=0;//不使用长文件名 if(res==FR_OK) { if(index<pfnmg.foldernum)//是文件夹区 { for(i=0;i<index+1;) { if(i==index)//已经等于当前要找的文件了.使用长文件名. { finfo.lfname=(TCHAR*)tlfname; //长文件名缓存 finfo.lfsize=sizeof(tlfname); //缓存大小 } res=f_readdir(&dir,&finfo); //读取一个文件的信息 if(res!=FR_OK||finfo.fname[0]==0)break;//出错,或者已经读完了 if(finfo.fattrib&AM_DIR) { if(finfo.fname[0]=='.'&&finfo.fname[1]=='\0')continue;//不计算"."文件夹 i++; } } }else //在有效文件区 { index-=pfnmg.foldernum;//实际文件的偏移 for(i=0;i<index+1;) { if(i==index)//已经等于当前要找的文件了.使用长文件名. { finfo.lfname=(TCHAR*)tlfname; //长文件名缓存 finfo.lfsize=sizeof(tlfname); //缓存大小 } res=f_readdir(&dir,&finfo); //读取一个文件的信息 if(res!=FR_OK||finfo.fname[0]==0)break;//出错,或者已经读完了 ftype=f_typetell((u8*)finfo.fname);//得到文件类型 for(t=0;t<pfnmg.fttblsize;t++)if(pfnmg.fttbl[t]==ftype)break; if(t!=pfnmg.fttblsize)i++;//找到一个符合条件的. } } if(res==FR_OK&&finfo.fname[0]!=0)//成功读取了. { f_stradd(pfnmg.plfname,"/"); if(*finfo.lfname)f_stradd(pfnmg.plfname,(u8*)finfo.lfname); //存在长文件名 else f_stradd(pfnmg.plfname,(u8*)finfo.fname); //拷贝短文件名 if(finfo.fattrib&AM_DIR)pfnmg.cftp=T_FOLDER; //是个文件夹. else pfnmg.cftp=f_typetell((u8*)finfo.fname); //目标文件 } } return pfnmg_get_lfname();//返回得到的文件名. }
//得到path路径下,目标文件的总个数 //path:路径 //返回值:总有效文件数 u16 pic_get_tnum(u8 *path) { u8 res; u16 rval=0; DIR tdir; //临时目录 FILINFO tfileinfo; //临时文件信息 u8 *fn; res=f_opendir(&tdir,(const TCHAR*)path); //打开目录 tfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度 tfileinfo.lfname=mymalloc(tfileinfo.lfsize);//为长文件缓存区分配内存 if(res==FR_OK&&tfileinfo.lfname!=NULL) { while(1)//查询总的有效文件数 { res=f_readdir(&tdir,&tfileinfo); //读取目录下的一个文件 if(res!=FR_OK||tfileinfo.fname[0]==0)break; //错误了/到末尾了,退出 fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname); res=f_typetell(fn); if((res&0XF0)==0X50)//取高四位,看看是不是图片文件 { rval++;//有效文件数增加1 } } } return rval; }
//得到path路径下,目标文件的总个数 //path:路径 //返回值:总有效文件数 u16 MP3_getMp3FileNum(u8 *path) { u8 res; u16 rval=0; DIR tdir; //临时目录 FILINFO tfileinfo; //临时文件信息 u8 *fn; res=f_opendir(&tdir,(const TCHAR*)path); //打开目录 tfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度 tfileinfo.lfname=malloc(tfileinfo.lfsize);//为长文件缓存区分配内存 if(res==FR_OK&&tfileinfo.lfname!=NULL) { while(1)//查询总的有效文件数 { res=f_readdir(&tdir,&tfileinfo); //读取目录下的一个文件 if(res != FR_OK || tfileinfo.fname[0] == 0) break; //错误了/到末尾了,退出 fn = (u8*)(*tfileinfo.lfname ? tfileinfo.lfname : tfileinfo.fname); printf("歌曲名字: %s\r\n", fn); //显示歌曲名字 res=f_typetell(fn); if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件 { rval++;//有效文件数增加1 } } } free(tfileinfo.lfname); //printf("目录%s下总共有%d首歌曲.\r\n",path, rval); //显示总歌曲数 return rval; }
//智能画图 //FileName:要显示的图片文件 BMP/JPG/JPEG //(sx,sy) :开始显示的坐标点 //(ex,ey) :结束显示的坐标点 //图片在开始和结束的坐标点范围内显示 BOOL AI_LoadPicFile(u8 *filename,u16 sx,u16 sy,u16 ex,u16 ey) {// FIL* f_bmp; int funcret;//返回值 //得到显示方框大小 u8 fileTpe; int index; for( index=0;index<1024;index++) iclip[index]=0; if(ey>sy)PICINFO.S_Height=ey-sy; else PICINFO.S_Height=sy-ey; if(ex>sx)PICINFO.S_Width=ex-sx; else PICINFO.S_Width=sx-ex; //显示区域无效 if(PICINFO.S_Height==0||PICINFO.S_Width==0) { PICINFO.S_Height=LCD_H; PICINFO.S_Width=LCD_W; return FALSE; } //影响速度 //SD_Init();//初始化SD卡,在意外拔出之后可以正常使用 //显示的开始坐标点 PICINFO.S_YOFF=sy; PICINFO.S_XOFF=sx; fileTpe=f_typetell((u8*)filename); //得到文件的类型 if(fileTpe==T_BMP)//得到一个BMP图像 { funcret=BmpDecode(filename); //得到一个BMP图像 return funcret; } else if(fileTpe==T_JPG||fileTpe==T_JPEG)//得到JPG/JPEG图片 { funcret=f_open(f_jpeg,(const TCHAR*)filename,FA_READ);//打开文件 if(funcret==FR_OK){ f_read(f_jpeg,jpg_buffer,1024,(UINT*)&br); InitTable(); if((funcret=InitTag())!=FUNC_OK)return FALSE; if((SampRate_Y_H==0)||(SampRate_Y_V==0))return FALSE ; AI_Drow_Init(); funcret=Decode(); } f_close(f_jpeg); }else return FALSE; //非图片格式!!! if(funcret==FUNC_OK)return TRUE;//解码成功 else return FALSE; //解码失败 }
//播放某个音频文件 u8 audio_play_song(u8* fname) { u8 res; res=f_typetell(fname); switch(res) { case T_WAV: res=wav_play_song(fname); break; default://其他文件,自动跳转到下一曲 printf("can't play:%s\r\n",fname); res=KEY0_PRES; break; } return res; }
/******************************************************************************* 函数名:MP3_getMp3FileName 描述 :获取指定路径和索引MP3的歌曲名称。 参数 :path:指定路径,如:"0:/MUSIC", index: 指定索引值,其最大值为该目录下mp3文件总数 ,pMp3FileName:保存mp3名称空间首地址。 返回值:0:失败,1:成功 *******************************************************************************/ u8 MP3_getMp3FileName(u8 *path, u8 index, u8 *pMp3FileName) { u8 res = 0; u16 rval=0; DIR tdir; //临时目录 FILINFO tfileinfo; //临时文件信息 u8 *fn; res=f_opendir(&tdir,(const TCHAR*)path); //打开目录 tfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度 tfileinfo.lfname=malloc(tfileinfo.lfsize);//为长文件缓存区分配内存 if (res == FR_OK && tfileinfo.lfname != NULL) { while(1)//查询总的有效文件数 { res=f_readdir(&tdir,&tfileinfo); //读取目录下的一个文件 if(res!=FR_OK||tfileinfo.fname[0]==0)break; //错误了/到末尾了,退出 fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname); res=f_typetell(fn); if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件 { rval++;//有效文件数增加1 if (rval == (index + 1)) { if (strlen(fn) < _MAX_LFN) { sprintf(pMp3FileName, "%s\0", fn); // memcpy(pMp3FileName, fn, strlen(fn)); res = 1; //printf("目录%s下第%d歌曲名为: %s\r\n",path,index, fn); //显示歌曲名字 } else { printf("FileName's space not enough !!!\r\n"); res = 0; } break; } } } } free(tfileinfo.lfname); return res; }
//得到指定目录下的指定类型文件的个数 u16 f_getfilenum(u8* path,u8 ftype) { u8 res; u8 type; u16 fnum=0; FILINFO finfo; res=f_opendir(&dir,(const TCHAR*)path);//打开SD卡上的PICTURE文件夹. finfo.lfsize=0;//不使用长文件名 if(res==FR_OK) { while(1) { res=f_readdir(&dir,&finfo); //读取一个文件的信息 if(res!=FR_OK||finfo.fname[0]==0)break;//出错,或者已经读完了 type=f_typetell((u8*)finfo.fname);//得到文件类型 if(type==ftype)fnum++;//此类型文件个数增加1. } } return fnum; }
int main(void) { u8 res; DIR picdir; //图片目录 FILINFO picfileinfo;//文件信息 u8 *fn; //长文件名 u8 *pname; //带路径的文件名 u16 totpicnum; //图片文件总数 u16 curindex; //图片当前索引 u8 key; //键值 u8 pause=0; //暂停标记 u8 t; u16 temp; u16 *picindextbl; //图片索引表 delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 uart_init(9600); //串口初始化为9600 LCD_Init(); //初始化液晶 LED_Init(); //LED初始化 KEY_Init(); //按键初始化 usmart_dev.init(72);//usmart初始化 mem_init(); //初始化内部内存池 exfuns_init(); //为fatfs相关变量申请内存 f_mount(fs[0],"0:",1); //挂载SD卡 f_mount(fs[1],"1:",1); //挂载FLASH. POINT_COLOR=RED; while(font_init()) //检查字库 { LCD_ShowString(60,50,200,16,16,"Font Error!"); delay_ms(200); LCD_Fill(60,50,240,66,WHITE);//清除显示 delay_ms(200); } Show_Str(60,50,200,16,"Mini STM32开发板",16,0); Show_Str(60,70,200,16,"图片显示程序",16,0); Show_Str(60,90,200,16,"KEY0:NEXT KEY1:PREV",16,0); Show_Str(60,110,200,16,"WK_UP:PAUSE",16,0); Show_Str(60,130,200,16,"正点原子@ALIENTEK",16,0); Show_Str(60,150,200,16,"2014年3月14日",16,0); while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹 { Show_Str(60,170,240,16,"PICTURE文件夹错误!",16,0); delay_ms(200); LCD_Fill(60,170,240,186,WHITE);//清除显示 delay_ms(200); } totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数 while(totpicnum==NULL)//图片文件为0 { Show_Str(60,170,240,16,"没有图片文件!",16,0); delay_ms(200); LCD_Fill(60,170,240,186,WHITE);//清除显示 delay_ms(200); } picfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度 picfileinfo.lfname=mymalloc(picfileinfo.lfsize); //为长文件缓存区分配内存 pname=mymalloc(picfileinfo.lfsize); //为带路径的文件名分配内存 picindextbl=mymalloc(2*totpicnum); //申请2*totpicnum个字节的内存,用于存放图片索引 while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//内存分配出错 { Show_Str(60,170,240,16,"内存分配失败!",16,0); delay_ms(200); LCD_Fill(60,170,240,186,WHITE);//清除显示 delay_ms(200); } //记录索引 res=f_opendir(&picdir,"0:/PICTURE"); //打开目录 if(res==FR_OK) { curindex=0;//当前索引为0 while(1)//全部查询一遍 { temp=picdir.index; //记录当前index res=f_readdir(&picdir,&picfileinfo); //读取目录下的一个文件 if(res!=FR_OK||picfileinfo.fname[0]==0)break; //错误了/到末尾了,退出 fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname); res=f_typetell(fn); if((res&0XF0)==0X50)//取高四位,看看是不是图片文件 { picindextbl[curindex]=temp;//记录索引 curindex++; } } } Show_Str(60,170,240,16,"开始显示...",16,0); delay_ms(1500); piclib_init(); //初始化画图 curindex=0; //从0开始显示 res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE"); //打开目录 while(res==FR_OK)//打开成功 { dir_sdi(&picdir,picindextbl[curindex]); //改变当前目录索引 res=f_readdir(&picdir,&picfileinfo); //读取目录下的一个文件 if(res!=FR_OK||picfileinfo.fname[0]==0)break; //错误了/到末尾了,退出 fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname); strcpy((char*)pname,"0:/PICTURE/"); //复制路径(目录) strcat((char*)pname,(const char*)fn); //将文件名接在后面 LCD_Clear(BLACK); ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片 Show_Str(2,2,240,16,pname,16,1); //显示图片名字 t=0; while(1) { key=KEY_Scan(0); //扫描按键 if(t>250)key=1; //模拟一次按下KEY0 if((t%20)==0)LED0=!LED0;//LED0闪烁,提示程序正在运行. if(key==KEY1_PRES) //上一张 { if(curindex)curindex--; else curindex=totpicnum-1; break; }else if(key==KEY0_PRES)//下一张 { curindex++; if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始 break; }else if(key==WKUP_PRES) { pause=!pause; LED1=!pause; //暂停的时候LED1亮. } if(pause==0)t++; delay_ms(10); } res=0; } myfree(picfileinfo.lfname); //释放内存 myfree(pname); //释放内存 myfree(picindextbl); //释放内存 }
//播放音乐 void audio_play(void) { u8 res; DIR wavdir; //目录 FILINFO wavfileinfo;//文件信息 u8 *fn; //长文件名 u8 *pname; //带路径的文件名 u16 totwavnum; //音乐文件总数 u16 curindex; //图片当前索引 u8 key; //键值 u16 temp; u16 *wavindextbl; //音乐索引表 WM8978_ADDA_Cfg(1,0); //开启DAC WM8978_Input_Cfg(0,0,0);//关闭输入通道 WM8978_Output_Cfg(1,0); //开启DAC输出 while(f_opendir(&wavdir,"0:/MUSIC"))//打开音乐文件夹 { Show_Str(60,190,240,16,"MUSIC文件夹错误!",16,0); delay_ms(200); LCD_Fill(60,190,240,206,WHITE);//清除显示 delay_ms(200); } totwavnum=audio_get_tnum("0:/MUSIC"); //得到总有效文件数 while(totwavnum==NULL)//音乐文件总数为0 { Show_Str(60,190,240,16,"没有音乐文件!",16,0); delay_ms(200); LCD_Fill(60,190,240,146,WHITE);//清除显示 delay_ms(200); } wavfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度 wavfileinfo.lfname=mymalloc(SRAMIN,wavfileinfo.lfsize); //为长文件缓存区分配内存 pname=mymalloc(SRAMIN,wavfileinfo.lfsize); //为带路径的文件名分配内存 wavindextbl=mymalloc(SRAMIN,2*totwavnum); //申请2*totwavnum个字节的内存,用于存放音乐文件索引 while(wavfileinfo.lfname==NULL||pname==NULL||wavindextbl==NULL)//内存分配出错 { Show_Str(60,190,240,16,"内存分配失败!",16,0); delay_ms(200); LCD_Fill(60,190,240,146,WHITE);//清除显示 delay_ms(200); } //记录索引 res=f_opendir(&wavdir,"0:/MUSIC"); //打开目录 if(res==FR_OK) { curindex=0;//当前索引为0 while(1)//全部查询一遍 { temp=wavdir.index; //记录当前index res=f_readdir(&wavdir,&wavfileinfo); //读取目录下的一个文件 if(res!=FR_OK||wavfileinfo.fname[0]==0)break; //错误了/到末尾了,退出 fn=(u8*)(*wavfileinfo.lfname?wavfileinfo.lfname:wavfileinfo.fname); res=f_typetell(fn); if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件 { wavindextbl[curindex]=temp;//记录索引 curindex++; } } } curindex=0; //从0开始显示 res=f_opendir(&wavdir,(const TCHAR*)"0:/MUSIC"); //打开目录 while(res==FR_OK)//打开成功 { dir_sdi(&wavdir,wavindextbl[curindex]); //改变当前目录索引 res=f_readdir(&wavdir,&wavfileinfo); //读取目录下的一个文件 if(res!=FR_OK||wavfileinfo.fname[0]==0)break; //错误了/到末尾了,退出 fn=(u8*)(*wavfileinfo.lfname?wavfileinfo.lfname:wavfileinfo.fname); strcpy((char*)pname,"0:/MUSIC/"); //复制路径(目录) strcat((char*)pname,(const char*)fn); //将文件名接在后面 LCD_Fill(60,190,240,190+16,WHITE); //清除之前的显示 Show_Str(60,190,240-60,16,fn,16,0); //显示歌曲名字 audio_index_show(curindex+1,totwavnum); key=audio_play_song(pname); //播放这个音频文件 if(key==KEY2_PRES) //上一曲 { if(curindex)curindex--; else curindex=totwavnum-1; }else if(key==KEY0_PRES)//下一曲 { curindex++; if(curindex>=totwavnum)curindex=0;//到末尾的时候,自动从头开始 }else break; //产生了错误 } myfree(SRAMIN,wavfileinfo.lfname); //释放内存 myfree(SRAMIN,pname); //释放内存 myfree(SRAMIN,wavindextbl); //释放内存 }
//图片浏览 u8 picviewer_play(void) { DIR picdir; //picdir专用 FILINFO picinfo; u8 rval=0; //返回值 u8 *pname=0; u8 *fn=0; u8 picsta=0; //ebook状态 //0,属于文件浏览状态 //1,顺序播放图片 //2,暂停状态 u16 curindex=0; //当前浏览的图片文件的索引号 u8 endecode=0; //使能解码 u8 key; u16 dtime=0; //延时时间 u8 keyup=1; //松开标记 u8 pictype=0; //图片类型 _filelistbox_obj * flistbox; _filelistbox_list * filelistx; //文件 _btn_obj* rbtn; //返回按钮控件 app_filebrower((u8*)APP_MFUNS_CAPTION_TBL[1][gui_phy.language],0X07);//选择目标文件,并得到目标数量 flistbox=filelistbox_creat(0,gui_phy.tbheight,lcddev.width,lcddev.height-gui_phy.tbheight*2,1,gui_phy.listfsize);//创建一个filelistbox if(flistbox==NULL)rval=1; //申请内存失败. else { flistbox->fliter=FLBOX_FLT_PICTURE; //图片文件 filelistbox_add_disk(flistbox); //添加磁盘路径 filelistbox_draw_listbox(flistbox); } //为长文件名申请缓存区 picinfo.lfsize = _MAX_LFN * 2 + 1; picinfo.lfname = gui_memin_malloc(picinfo.lfsize); if(picinfo.lfname==NULL)rval=1;//申请内存失败 else gui_memset((u8*)picinfo.lfname,0,picinfo.lfsize); rbtn=btn_creat(lcddev.width-2*gui_phy.tbfsize-8-1,lcddev.height-gui_phy.tbheight,2*gui_phy.tbfsize+8,gui_phy.tbheight-1,0,0x03);//创建文字按钮 if(rbtn==NULL)rval=1; //没有足够内存够分配 else { rbtn->caption=(u8*)GUI_BACK_CAPTION_TBL[gui_phy.language];//返回 rbtn->font=gui_phy.tbfsize;//设置新的字体大小 rbtn->bcfdcolor=WHITE; //按下时的颜色 rbtn->bcfucolor=WHITE; //松开时的颜色 btn_draw(rbtn);//画按钮 } LED1=1;//关闭LED1 while(rval==0)//主循环 { tp_dev.scan(0); in_obj.get_key(&tp_dev,IN_TYPE_TOUCH); //得到按键键值 delay_ms(5); if(system_task_return)break; //TPAD返回 if(picsta==0) { filelistbox_check(flistbox,&in_obj); //扫描文件 if(flistbox->dbclick==0X81) //双击文件了 { curindex=flistbox->selindex-flistbox->foldercnt;//得到当前图片索引号 picsta=1; //图片播放状态 endecode=1; //第一张图片自动播放 LCD_Clear(0x0);//黑屏 } } key=btn_check(rbtn,&in_obj); if(key&&((rbtn->sta&0X80)==0)) { if(flistbox->dbclick!=0X81)//在文件浏览的时候按了返回按钮,则返回上一层目录 { filelistx=filelist_search(flistbox->list,flistbox->selindex);//得到此时选中的list的信息 if(filelistx->type==FICO_DISK)//已经不能再往上了,则退出图片浏览 { break; }else filelistbox_back(flistbox);//退回上一层目录 } } if(endecode) { rval=f_opendir(&picdir,(const TCHAR*)flistbox->path); //打开选中的目录 if(rval)break; ff_enter(picdir.fs);//进入fatfs,防止被打断. dir_sdi(&picdir,flistbox->findextbl[curindex]); ff_leave(picdir.fs);//退出fatfs,继续运行os等 rval=f_readdir(&picdir,&picinfo);//读取文件信息 if(rval)break;//打开成功 fn=(u8*)(*picinfo.lfname?picinfo.lfname:picinfo.fname); pname=gui_memin_malloc(strlen((const char*)fn)+strlen((const char*)flistbox->path)+2);//申请内存 if(pname==NULL)break; //申请失败 pname=gui_path_name(pname,flistbox->path,fn); //文件名加入路径 pictype=f_typetell(pname); if(pictype==T_GIF)gui_show_string(fn,5,5,lcddev.width-5,gui_phy.tbfsize,gui_phy.tbfsize,RED); //显示GIF名字 ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1); //播放这个图片 if(pictype!=T_GIF)gui_show_string(fn,5,5,lcddev.width-5,gui_phy.tbfsize,gui_phy.tbfsize,RED); //显示图片名字 gui_memin_free(pname); //释放内存 pname=NULL; endecode=0; } keyup=0; dtime=0; while(picsta)//按键扫描循环 { key=pic_tp_scan(); dtime++; if(dtime>400&&(picsta==1))key=3;//顺序播放状态下时间溢出,自动播放下一张图片 if(key)//有按键按下 { dtime=0; if(keyup) { keyup=0; if(key==1)//上一幅图片 { if(curindex)curindex--; else curindex=flistbox->filecnt-1; endecode=1; LCD_Clear(0x0);//黑屏 break; }else if(key==2)//在暂停和非暂停之间切换 { if(picsta==1) { picsta=2; LED1=0; //表示暂停 }else { picsta=1; LED1=1; //暂停结束 } }else if(key==3) { if(systemset.picmode==0)//顺序播放 { if(curindex<(flistbox->filecnt-1))curindex++; else curindex=0; }else //随机播放 { curindex=app_get_rand(flistbox->filecnt);//随机得到下一张图片的编号 } endecode=1; LCD_Clear(0x0);//黑屏 break; } } }else keyup=1;//标记按键松开 delay_ms(10); if(system_task_return)picsta=0;//TPAD返回 if(picsta==0)//回到文件浏览状态之前的处理 { LED1=1; //关闭LED1 flistbox->dbclick=0; //设置非文件浏览状态 app_filebrower((u8*)APP_MFUNS_CAPTION_TBL[1][gui_phy.language],0X07);//选择目标文件,并得到目标数量 btn_draw(rbtn); //画按钮 filelistbox_rebuild_filelist(flistbox);//重建flistbox system_task_return=0; //还不能退出图片浏览 break; } } } LED1=1;//关闭LED1 filelistbox_delete(flistbox); //删除filelist btn_delete(rbtn); //删除按钮 gui_memin_free(pname); //释放内存 gui_memin_free(picinfo.lfname); return rval; }
//播放音乐 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"))//打开音乐文件夹 { printf("MUSIC文件夹错误!\r\n"); mico_thread_msleep(200); } totmp3num=mp3_get_tnum("0:/MUSIC"); //得到总有效文件数 while(totmp3num==NULL)//音乐文件总数为0 { printf("没有音乐文件!\r\n"); mico_thread_msleep(200); } mp3fileinfo.lfsize = _MAX_LFN*2+1; //长文件名最大长度 mp3fileinfo.lfname = malloc(mp3fileinfo.lfsize);//为长文件缓存区分配内存 pname = malloc(mp3fileinfo.lfsize); //为带路径的文件名分配内存 mp3indextbl = malloc(2*totmp3num); //申请2*totmp3num个字节的内存,用于存放音乐文件索引 while(mp3fileinfo.lfname==NULL||pname==NULL||mp3indextbl==NULL)//内存分配出错 { printf("内存分配失败!\r\n"); mico_thread_msleep(200); } //记录索引 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); //将文件名接在后面 printf("歌曲名字: %s\r\n", fn); //显示歌曲名字 mp3_index_show(curindex+1,totmp3num); key=MP3_playSong(pname); //播放这个MP3 if(key==KEY0_PRES)//下一曲 { curindex++; if(curindex>=totmp3num)curindex=0;//到末尾的时候,自动从头开始 }else break; //产生了错误 } free(mp3fileinfo.lfname); //释放内存 free(pname); //释放内存 free(mp3indextbl); //释放内存 }