中级会员
 
- 积分
- 310
- 金钱
- 310
- 注册时间
- 2017-5-18
- 在线时间
- 47 小时
|

楼主 |
发表于 2021-3-15 19:40:21
|
显示全部楼层
如果确定你的fatfs底层没问你的话,参看下这块代码修改下(当时调试的时候,发现mem_free这块,调用先后顺序会有影响,虽然不知道啥原因,但是修改之后确实好了)
- u8 music_play_song(char* pname)
- {
- FIL* music = NULL;
- FILINFO *fileinfo = NULL;
- u16 br = 0;
- u8 res = 0,rval = 0,key = 0;
- u8 *databuf;
- u16 i = 0;
-
- music = (FIL*)mem_malloc(SRAM_IN,sizeof(FIL));
- if(music == NULL)
- {
- mem_free(SRAM_IN,music);
- LOG_EROR("malloc for music fail");
- return 0xFF;
- }
-
- fileinfo = (FILINFO*)mem_malloc(SRAM_IN,sizeof(FILINFO));
- if(fileinfo == NULL)
- {
- mem_free(SRAM_IN,music);
- mem_free(SRAM_IN,fileinfo);
- LOG_EROR("malloc for fileinfo fail");
- return 0xFF;
- }
-
- databuf = mem_malloc(SRAM_IN,4096);
- if(databuf == NULL)
- {
- mem_free(SRAM_IN,music);
- mem_free(SRAM_IN,fileinfo);
- mem_free(SRAM_IN,databuf);
- LOG_EROR("malloc for databuf fail");
- return 0xFF;
- }
-
- vs_restart_play(); //重启播放
- vs_set_all(); //设置音量等信息
- vs_reset_decodetime(); //复位解码时间
- res = efs_gettype((u8*)pname);//获取文件类型
- if(res==0x4c) //如果是flac,加载patch
- {
- vs_load_patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
- }
-
- LOG_INFO("music name:%s",pname);
- res = f_stat((const TCHAR*)pname,fileinfo);
- if(res)
- {
- LOG_EROR("%s f_stat fail,%d",pname,res);
- mem_free(SRAM_IN,music);
- mem_free(SRAM_IN,fileinfo);
- mem_free(SRAM_IN,databuf);
- return 0xFF;
- }
-
- res = f_open(music,(const TCHAR*)pname,FA_READ);
- if(res == FR_OK)
- {
- vs_spi_speedhigh();
- while(rval == 0)
- {
- res = f_read(music,databuf,4096,(UINT*)&br);
- i = 0;
- do
- {
- if(vs_send_musicdata(databuf+i) == 0)
- {
- i += 32;
- }
- else
- {
- key = key_scan(0);
- switch (key)
- {
- case K0_PRES:
- rval = 1; //下一曲
- break;
- case K2_PRES:
- rval = 2; //上一曲
- break;
- case KW_PRES:
- if(g_vs1053.volume < 250)
- {
- g_vs1053.volume += 5;
- vs_set_vol(g_vs1053.volume);
- }
- else
- {
- g_vs1053.volume = 250;
- }
- music_show_vol((g_vs1053.volume - 100)/5); //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
- break;
- case K1_PRES:
- if(g_vs1053.volume > 100)
- {
- g_vs1053.volume -= 5;
- vs_set_vol(g_vs1053.volume);
- }
- else
- {
- g_vs1053.volume = 100;
- }
- music_show_vol((g_vs1053.volume - 100)/5); //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
- break;
- }
- music_show_msg(fileinfo->fsize);
- }
- }while(i < 4096);
-
- if(br != 4096 || res != 0)
- {
- rval = 0;
- break;
- }
- }
- f_close(music);
- }
- mem_free(SRAM_IN,music);
- mem_free(SRAM_IN,fileinfo);
- mem_free(SRAM_IN,databuf);
- return rval;
- }
- void music_play(void)
- {
- u8 res = 0, key = 0;
- DIR *music_dir = NULL;
- FILINFO *file_info = NULL;
- char *pname = NULL; //带路径的文件名
- u16 total_song = 0,curr_index = 0;
- u32 index_tab[64] = {0};
-
- set_brush_color(GREEN);
- music_dir = (DIR*)mem_malloc(SRAM_IN,sizeof(DIR));
- if(music_dir == NULL)
- {
- mem_free(SRAM_IN,music_dir);
- LOG_EROR("malloc for music_dir failed");
- return;
- }
-
- total_song = music_get_num("0:/MUSIC");
- LOG_INFO("music number:%d",total_song);
- if(total_song == 0)
- {
- set_brush_color(RED);
- LOG_EROR("no music file");
- show_str(30,200,240,24,"MUSIC文件夹没有文件!",24,0);
- delay_ms(500);
- mem_free(SRAM_IN,music_dir);
- return;
- }
-
-
- file_info = (FILINFO*)mem_malloc(SRAM_IN,sizeof(FILINFO));
- if(file_info == NULL)
- {
- LOG_EROR("malloc for file_info failed");
- mem_free(SRAM_IN,music_dir);
- mem_free(SRAM_IN,file_info);
- return;
- }
-
- #if FFCONF_DEF == 80196 //R14版本fatfs
- pname = mem_malloc(SRAM_IN,2*FF_MAX_LFN + 1);
- #else
- pname = mem_malloc(SRAM_IN,2*_MAX_LFN + 1);
- #endif
- if(pname == NULL)
- {
- LOG_EROR("malloc for pname failed");
- mem_free(SRAM_IN,music_dir);
- mem_free(SRAM_IN,file_info);
- mem_free(SRAM_IN,pname);
- return;
- }
-
- mem_memset(music_dir,0,sizeof(DIR));
- mem_memset(file_info,0,sizeof(FILINFO));
- mem_memset(pname,0,2*FF_MAX_LFN + 1);
-
- vs_hd_reset();
- vs_soft_reset();
- g_vs1053.volume = 100;
- music_show_vol((g_vs1053.volume-100)/5); //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
-
- if(FR_OK == (res = f_opendir(music_dir,"0:/MUSIC")))
- {
- curr_index = 0;
- while(1)
- {
- res = f_readdir(music_dir,file_info); //读取目录下的一个文件
- if(res != FR_OK || file_info->fname[0] == 0) //错误了/到末尾了,退出
- {
- break;
- }
- res = efs_gettype((u8*)(file_info->fname));
- if((res&0xF0) == 0x40) //取高四位,看看是不是音乐文件
- {
- index_tab[curr_index] = music_dir->blk_ofs; //记录当前index;
- curr_index++;
- }
- }
- f_closedir(music_dir);
- }
- else
- {
- set_brush_color(RED);
- LOG_EROR("open music dir failed");
- show_str(30,200,240,24,"MUSIC文件夹错误!",24,0);
- delay_ms(500);
- while(1);
- }
-
- curr_index = 0;
- res = f_opendir(music_dir,"0:/MUSIC");
- while(res == FR_OK)
- {
- dir_sdi(music_dir,index_tab[curr_index]); //改变当前目录索引
- res = f_readdir(music_dir,file_info);
- LOG_INFO("curr file:%s",file_info->fname);
- if(res != FR_OK || file_info->fname[0] == 0) //错误了/到末尾了,退出
- {
- break;
- }
- strcpy((char*)pname,"0:/MUSIC/");
- strcat((char*)pname,file_info->fname);
- show_str(30,200,240,24,file_info->fname,24,0); //显示歌曲名字
- music_show_index(curr_index+1,total_song);
- key = music_play_song(pname);
- delay_s(5);
- if(key == 2) //上一曲
- {
- if(curr_index)
- {
- curr_index--;
- }
- else
- {
- curr_index = total_song - 1;
- }
- }
- else if(key == 1) //下一曲
- {
- curr_index++;
- if(curr_index >= total_song)
- {
- curr_index = 0;
- }
- }
- else
- {
- break;
- }
- }
-
- f_closedir(music_dir);
- mem_free(SRAM_IN,music_dir);
- mem_free(SRAM_IN,file_info);
- mem_free(SRAM_IN,pname);
- }
复制代码 |
|