OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6550|回复: 17

音乐播放器,读取文件夹内文件问题

[复制链接]

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
发表于 2021-2-5 15:55:16 | 显示全部楼层 |阅读模式
1金钱
在做音乐播放器实验的时候,一开始各项操作正常,音乐也能正常播放,当播放第一首音乐的时候,切换上一首,这个时候就出现问题了。
正常日志如下:
$  info: LCD ID:5510
$  info: LCD Soft Init...
$  info: efs_init ok
$  info: mount sdcard ok
$  info: mount flash ok
$  info: RAM Test:0x83FF
$  info: lsit file:曾经的你.mp3                 index:-1
$  info: lsit file:醉千年 - 李袁杰.mp3                 index:160
$  info: lsit file:怀念青春 - 刘刚.mp3                 index:224
$  info: lsit file:一曲相思 - 阿悠悠.mp3                 index:288
$  info: lsit file:青花 - 周传雄.mp3                 index:352
$  info: lsit file:AuxMic.wav                 index:448
$  info: lsit file:光棍好苦.m4a                 index:512
$  info: lsit file:mellow.wma                 index:576
$  info: lsit file:FF7prelu.mid                 index:-1
$  info: lsit file:张国荣-沉默是金.flac                 index:672
$  info: curr file:曾经的你.mp3                 index:-1
$  info: music name:0:/MUSIC/曾经的你.mp3
$  info: curr file:FF7prelu.mid                 index:672
$  info: music name:0:/MUSIC/FF7prelu.mid

上面我把文件索引打出来了,文件名也都正常,之后点击了播放上一首(当前已经是第一首)
就开始出现问题了,日志如下
$  info: RAM Test:0x83FF
$  info: lsit file:曾经的你.MP3                 index:-1
$  info: lsit file:醉千年~1.MP3                 index:160
$  info: lsit file:怀念青~1.MP3                 index:224
$  info: lsit file:一曲相~1.MP3                 index:288
$  info: lsit file:青花-~1.MP3                 index:352
$  info: lsit file:AuxMic.wav                 index:448
$  info: lsit file:光棍好苦.M4A                 index:512
$  info: lsit file:mellow.wma                 index:576
$  info: lsit file:FF7prelu.mid                 index:-1
$  info: curr file:曾经的你.MP3                 index:-1
$  info: music name:0:/MUSIC/曾经的你.MP3
$  error: 0:/MUSIC/曾经的你.MP3 f_stat fail,6
$  info: RAM Test:0x83FF

可以看到这块之前文件名有空格的地方被 ~替代了,文件名后缀都编程大写了,这也就出现后面的获取文件状态信息失败。
fatfs文件使用的是12的版本。
打印这部分代码如下:
        if(FR_OK == (res = f_opendir(music_dir,"0:/MUSIC")))
        {
                curr_index = 0;
                while(1)
                {
                        temp = music_dir->blk_ofs;                                                //记录当前index
                        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)        //取高四位,看看是不是音乐文件
                        {
                                music_index_tb[curr_index] = temp;
                                LOG_INFO("lsit file:%s \t\tindex:%d",file_info->fname,music_index_tb[curr_index]);
                                curr_index++;
                        }
                }
                f_closedir(music_dir);
        }

求教各位,这块是哪儿出了问题呢




最佳答案

查看完整内容[请看2#楼]

谢谢,我的问题解决了,我的问题是引脚冲突了,不过还是谢谢你
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2021-3-8
在线时间
19 小时
发表于 2021-2-5 15:55:17 | 显示全部楼层
北辰 发表于 2021-3-15 19:40
如果确定你的fatfs底层没问你的话,参看下这块代码修改下(当时调试的时候,发现mem_free这块,调用先后 ...

谢谢,我的问题解决了,我的问题是引脚冲突了,不过还是谢谢你
回复

使用道具 举报

4

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2019-5-11
在线时间
39 小时
发表于 2021-2-5 16:00:18 | 显示全部楼层
仿真一下,注意遍历的输出,以及你申请的内存是不是小了
回复

使用道具 举报

12

主题

3402

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8691
金钱
8691
注册时间
2020-5-11
在线时间
4183 小时
发表于 2021-2-5 16:07:20 | 显示全部楼层
不支持长文件名了?变成了短文件名11个字符
专治疑难杂症
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-2-5 16:19:11 | 显示全部楼层
LcwSwust 发表于 2021-2-5 16:07
不支持长文件名了?变成了短文件名11个字符

看上去像是这个样子,感觉怪怪的
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-2-5 17:01: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)        //取高四位,看看是不是音乐文件
                        {
                                music_index_tb[curr_index] = music_dir->blk_ofs;                                        //记录当前index;
                                LOG_INFO("fname:%s,altname:%s",file_info->fname,file_info->altname);
                                curr_index++;
                        }
                }
                f_closedir(music_dir);
        }
正常日志:
$  info: fname:曾经的你.mp3,altname:曾经的你.MP3
$  info: fname:醉千年 - 李袁杰.mp3,altname:醉千年~1.MP3
$  info: fname:怀念青春 - 刘刚.mp3,altname:怀念青~1.MP3
$  info: fname:一曲相思 - 阿悠悠.mp3,altname:一曲相~1.MP3
$  info: fname:青花 - 周传雄.mp3,altname:青花-~1.MP3
$  info: fname:AuxMic.wav,altname:AUXMIC.WAV
$  info: fname:光棍好苦.m4a,altname:光棍好苦.M4A
$  info: fname:mellow.wma,altname:MELLOW.WMA
$  info: fname:FF7prelu.mid,altname:FF7PRELU.MID


切换到上一首,异常日志

$  info: fname:曾经的你.MP3,altname:
$  info: fname:醉千年~1.MP3,altname:
$  info: fname:怀念青~1.MP3,altname:
$  info: fname:一曲相~1.MP3,altname:
$  info: fname:青花-~1.MP3,altname:
$  info: fname:AuxMic.wav,altname:AUXMIC.WAV
$  info: fname:光棍好苦.M4A,altname:
$  info: fname:mellow.wma,altname:MELLOW.WMA
$  info: fname:FF7prelu.mid,altname:FF7PRELU.MID
$  info: curr file:曾经的你.MP3
$  info: music name:0:/MUSIC/曾经的你.MP3
$  error: 0:/MUSIC/曾经的你.MP3 f_stat fail,6
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-2-6 18:53:41 | 显示全部楼层
ma3264175 发表于 2021-2-5 16:00
仿真一下,注意遍历的输出,以及你申请的内存是不是小了

内存应该是够的
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-2-6 18:54:30 | 显示全部楼层
求高手支招
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-2-6 22:12:06 | 显示全部楼层
求支招@正点原子
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2021-2-9 21:53:48 | 显示全部楼层
长文件名没开吧
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-2-19 09:39:36 | 显示全部楼层
ricefat 发表于 2021-2-9 21:53
长文件名没开吧

开过的
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2021-2-19 11:01:20 | 显示全部楼层
可能是播放上一首的时候文件位置指针出了问题
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2021-3-8
在线时间
19 小时
发表于 2021-3-15 15:10:31 | 显示全部楼层
我也遇到这个问题了,楼主解决了吗?
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-3-15 15:11:42 | 显示全部楼层
山支惊蛰 发表于 2021-3-15 15:10
我也遇到这个问题了,楼主解决了吗?

解决了,应该是内存这块出了问题,特别是在分配空间的时候,
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2021-3-8
在线时间
19 小时
发表于 2021-3-15 16:36:15 | 显示全部楼层
北辰 发表于 2021-3-15 15:11
解决了,应该是内存这块出了问题,特别是在分配空间的时候,

可以具体讲一下吗?现在我被这个搞得没有一点头绪
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-3-15 19:40:21 | 显示全部楼层
山支惊蛰 发表于 2021-3-15 16:36
可以具体讲一下吗?现在我被这个搞得没有一点头绪

如果确定你的fatfs底层没问你的话,参看下这块代码修改下(当时调试的时候,发现mem_free这块,调用先后顺序会有影响,虽然不知道啥原因,但是修改之后确实好了)

  1. u8  music_play_song(char* pname)
  2. {
  3.         FIL* music = NULL;
  4.         FILINFO *fileinfo = NULL;
  5.     u16 br = 0;
  6.         u8 res = 0,rval = 0,key = 0;          
  7.         u8 *databuf;                             
  8.         u16 i = 0;
  9.        
  10.         music = (FIL*)mem_malloc(SRAM_IN,sizeof(FIL));
  11.         if(music == NULL)
  12.         {
  13.                 mem_free(SRAM_IN,music);
  14.                 LOG_EROR("malloc for music fail");
  15.                 return 0xFF;
  16.         }
  17.        
  18.         fileinfo = (FILINFO*)mem_malloc(SRAM_IN,sizeof(FILINFO));
  19.         if(fileinfo == NULL)
  20.         {
  21.                 mem_free(SRAM_IN,music);
  22.                 mem_free(SRAM_IN,fileinfo);
  23.                 LOG_EROR("malloc for fileinfo fail");
  24.                 return 0xFF;       
  25.         }
  26.        
  27.         databuf = mem_malloc(SRAM_IN,4096);
  28.         if(databuf == NULL)
  29.         {
  30.                 mem_free(SRAM_IN,music);
  31.                 mem_free(SRAM_IN,fileinfo);
  32.                 mem_free(SRAM_IN,databuf);
  33.                 LOG_EROR("malloc for databuf fail");
  34.                 return 0xFF;
  35.         }
  36.        
  37.         vs_restart_play();                //重启播放
  38.         vs_set_all();                        //设置音量等信息
  39.         vs_reset_decodetime();        //复位解码时间
  40.         res = efs_gettype((u8*)pname);//获取文件类型
  41.         if(res==0x4c)                                //如果是flac,加载patch
  42.         {       
  43.                 vs_load_patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
  44.         }
  45.        
  46.         LOG_INFO("music name:%s",pname);
  47.         res = f_stat((const TCHAR*)pname,fileinfo);
  48.         if(res)
  49.         {
  50.                 LOG_EROR("%s f_stat fail,%d",pname,res);
  51.                 mem_free(SRAM_IN,music);
  52.                 mem_free(SRAM_IN,fileinfo);
  53.                 mem_free(SRAM_IN,databuf);               
  54.                 return 0xFF;
  55.         }
  56.        
  57.         res = f_open(music,(const TCHAR*)pname,FA_READ);
  58.         if(res == FR_OK)
  59.         {
  60.                 vs_spi_speedhigh();
  61.                 while(rval == 0)
  62.                 {
  63.                         res = f_read(music,databuf,4096,(UINT*)&br);
  64.                         i = 0;
  65.                         do
  66.                         {
  67.                                 if(vs_send_musicdata(databuf+i) == 0)
  68.                                 {
  69.                                         i += 32;
  70.                                 }
  71.                                 else
  72.                                 {
  73.                                         key = key_scan(0);
  74.                                         switch (key)
  75.                                         {
  76.                                                 case K0_PRES:
  77.                                                         rval = 1;        //下一曲
  78.                                                         break;
  79.                                                 case K2_PRES:
  80.                                                         rval = 2;        //上一曲
  81.                                                         break;
  82.                                                 case KW_PRES:
  83.                                                         if(g_vs1053.volume < 250)
  84.                                                         {
  85.                                                                 g_vs1053.volume += 5;
  86.                                                                 vs_set_vol(g_vs1053.volume);
  87.                                                         }
  88.                                                         else
  89.                                                         {
  90.                                                                 g_vs1053.volume = 250;
  91.                                                         }
  92.                                                         music_show_vol((g_vs1053.volume - 100)/5);        //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
  93.                                                         break;
  94.                                                 case K1_PRES:
  95.                                                         if(g_vs1053.volume > 100)
  96.                                                         {
  97.                                                                 g_vs1053.volume -= 5;
  98.                                                                 vs_set_vol(g_vs1053.volume);
  99.                                                         }
  100.                                                         else
  101.                                                         {
  102.                                                                 g_vs1053.volume = 100;
  103.                                                         }
  104.                                                         music_show_vol((g_vs1053.volume - 100)/5);        //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
  105.                                                         break;                                                       
  106.                                         }
  107.                                         music_show_msg(fileinfo->fsize);
  108.                                 }
  109.                         }while(i < 4096);
  110.                        
  111.                         if(br != 4096 || res != 0)
  112.                         {
  113.                                 rval = 0;
  114.                                 break;
  115.                         }
  116.                 }
  117.                 f_close(music);
  118.         }
  119.         mem_free(SRAM_IN,music);
  120.         mem_free(SRAM_IN,fileinfo);
  121.         mem_free(SRAM_IN,databuf);
  122.         return rval;
  123. }

  124. void music_play(void)
  125. {
  126.         u8 res = 0, key = 0;
  127.         DIR *music_dir = NULL;
  128.         FILINFO *file_info = NULL;
  129.         char *pname = NULL;                        //带路径的文件名
  130.         u16 total_song = 0,curr_index = 0;
  131.         u32 index_tab[64] = {0};
  132.        
  133.         set_brush_color(GREEN);
  134.         music_dir = (DIR*)mem_malloc(SRAM_IN,sizeof(DIR));
  135.         if(music_dir == NULL)
  136.         {
  137.                 mem_free(SRAM_IN,music_dir);
  138.                 LOG_EROR("malloc for music_dir failed");
  139.                 return;
  140.         }
  141.        
  142.         total_song = music_get_num("0:/MUSIC");
  143.         LOG_INFO("music number:%d",total_song);
  144.         if(total_song == 0)
  145.         {
  146.                 set_brush_color(RED);
  147.                 LOG_EROR("no music file");
  148.                 show_str(30,200,240,24,"MUSIC文件夹没有文件!",24,0);                  
  149.                 delay_ms(500);
  150.                 mem_free(SRAM_IN,music_dir);
  151.                 return;               
  152.         }
  153.        
  154.        
  155.         file_info = (FILINFO*)mem_malloc(SRAM_IN,sizeof(FILINFO));
  156.         if(file_info == NULL)
  157.         {
  158.                 LOG_EROR("malloc for file_info failed");
  159.                 mem_free(SRAM_IN,music_dir);
  160.                 mem_free(SRAM_IN,file_info);               
  161.                 return;
  162.         }
  163.        
  164. #if        FFCONF_DEF == 80196        //R14版本fatfs
  165.         pname = mem_malloc(SRAM_IN,2*FF_MAX_LFN + 1);
  166. #else
  167.         pname = mem_malloc(SRAM_IN,2*_MAX_LFN + 1);
  168. #endif       
  169.         if(pname == NULL)
  170.         {
  171.                 LOG_EROR("malloc for pname failed");
  172.                 mem_free(SRAM_IN,music_dir);
  173.                 mem_free(SRAM_IN,file_info);
  174.                 mem_free(SRAM_IN,pname);
  175.                 return;
  176.         }
  177.        
  178.         mem_memset(music_dir,0,sizeof(DIR));
  179.         mem_memset(file_info,0,sizeof(FILINFO));
  180.         mem_memset(pname,0,2*FF_MAX_LFN + 1);
  181.        
  182.         vs_hd_reset();
  183.         vs_soft_reset();
  184.         g_vs1053.volume = 100;
  185.         music_show_vol((g_vs1053.volume-100)/5);        //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
  186.        
  187.         if(FR_OK == (res = f_opendir(music_dir,"0:/MUSIC")))
  188.         {
  189.                 curr_index = 0;
  190.                 while(1)
  191.                 {
  192.                         res = f_readdir(music_dir,file_info);                        //读取目录下的一个文件
  193.                         if(res != FR_OK || file_info->fname[0] == 0)        //错误了/到末尾了,退出
  194.                         {
  195.                                 break;
  196.                         }
  197.                         res = efs_gettype((u8*)(file_info->fname));
  198.                         if((res&0xF0) == 0x40)                                                        //取高四位,看看是不是音乐文件
  199.                         {
  200.                                 index_tab[curr_index] = music_dir->blk_ofs;                                        //记录当前index;
  201.                                 curr_index++;
  202.                         }
  203.                 }
  204.                 f_closedir(music_dir);
  205.         }
  206.         else
  207.         {
  208.                 set_brush_color(RED);
  209.                 LOG_EROR("open music dir failed");
  210.                 show_str(30,200,240,24,"MUSIC文件夹错误!",24,0);                  
  211.                 delay_ms(500);
  212.                 while(1);
  213.         }
  214.        
  215.         curr_index = 0;
  216.         res = f_opendir(music_dir,"0:/MUSIC");
  217.         while(res == FR_OK)
  218.         {
  219.                 dir_sdi(music_dir,index_tab[curr_index]);        //改变当前目录索引
  220.                 res = f_readdir(music_dir,file_info);
  221.                 LOG_INFO("curr file:%s",file_info->fname);
  222.                 if(res != FR_OK || file_info->fname[0] == 0)        //错误了/到末尾了,退出
  223.                 {
  224.                         break;
  225.                 }
  226.                 strcpy((char*)pname,"0:/MUSIC/");
  227.                 strcat((char*)pname,file_info->fname);
  228.                 show_str(30,200,240,24,file_info->fname,24,0);        //显示歌曲名字
  229.                 music_show_index(curr_index+1,total_song);
  230.                 key = music_play_song(pname);
  231.                 delay_s(5);
  232.                 if(key == 2)        //上一曲
  233.                 {
  234.                         if(curr_index)
  235.                         {
  236.                                 curr_index--;
  237.                         }
  238.                         else
  239.                         {
  240.                                 curr_index = total_song - 1;
  241.                         }
  242.                 }
  243.                 else if(key == 1)        //下一曲
  244.                 {
  245.                         curr_index++;
  246.                         if(curr_index >= total_song)
  247.                         {
  248.                                 curr_index = 0;
  249.                         }
  250.                 }
  251.                 else
  252.                 {
  253.                         break;
  254.                 }
  255.         }
  256.        
  257.         f_closedir(music_dir);
  258.         mem_free(SRAM_IN,music_dir);
  259.         mem_free(SRAM_IN,file_info);
  260.         mem_free(SRAM_IN,pname);
  261. }
复制代码
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-3-16 01:59:57 | 显示全部楼层
说明你不支持长文件名
回复

使用道具 举报

3

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
310
金钱
310
注册时间
2017-5-18
在线时间
47 小时
 楼主| 发表于 2021-3-16 09:16:57 | 显示全部楼层
正点原子 发表于 2021-3-16 01:59
说明你不支持长文件名

相关的配置都对着,长文件名也都支持了,还是内存管理这块出了问题
当你对一件事情有强烈渴望的时候,整个宇宙都会帮你达成,坚持给宇宙发渴望信号 ,就是梦想成真的秘诀。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 04:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表