野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21289|回复: 0

MP3示例不能全部播放

[复制链接]
发表于 2013-6-5 13:33:02 | 显示全部楼层 |阅读模式
本帖最后由 yxliank 于 2013-6-8 16:54 编辑

我在做MP3的示例中遇到一个奇怪的问题:
当文件名为001.MP3;002MP3;……010MP3时,程序在运行时,播放了一个文件就自动跳出了。我在程序中增加串口的测试点,串口接收的输入如图。
奇怪的是在文件名字更改为:中文001.MP3;中文002MP3;……中文010MP3时,一切就都正常了。
这是什么原因呢???求大虾给个分析。
2.jpg

程序:
void MP3_Play(void)
{  
FATFS fs;                  // Work area (file system object) for logical drive
FRESULT res;
UINT br;       /*读取出的字节数,用于判断是否到达文件尾*/
FIL fsrc;             // file objects
FILINFO finfo;    /*文件信息*/
DIR dirs;
uint16_t count = 0;

char lfn[70];      /*为支持长文件的数组,[]最大支持255*/
char j = 0;   
char path[100] = {""}; /* MicroSD卡根目录 */
char *result1, *result2, *result3, *result4;

BYTE buffer[512];          /* 存放读取出的文件数据 */

finfo.lfname = lfn;     /*为长文件名分配空间*/
finfo.lfsize = sizeof(lfn);   /*空间大小*/

f_mount(0, &fs);                            /* 挂载文件系统到0区 */  

if (f_opendir(&dirs,path) == FR_OK)            /* 打开根目录 */
{
  while (f_readdir(&dirs, &finfo) == FR_OK)     /* 依次读取文件名 */
  {   
   if ( finfo.fattrib & AM_ARC )        /* 判断是否为存档型文档 */
   {
    if(finfo.lfname[0] == NULL && finfo.fname !=NULL)  /*当长文件名称为空,短文件名非空时转换*/
    { printf(  "测试点1  \r\n" );
     finfo.lfname =finfo.fname;   
    }
    if( !finfo.lfname[0] )  /* 文件名为空即到达了目录的末尾,退出 */
    {   printf(  "测试点2  \r\n" );
     break;  
     }
    printf(  " \r\n 文件名为:  %s \r\n",finfo.lfname );
   
    result1 = strstr( finfo.lfname, ".mp3" ); /* 判断是否为音频文件 */   
    result2 = strstr( finfo.lfname, ".mid" );
    result3 = strstr( finfo.lfname, ".wav" );
    result4 = strstr( finfo.lfname, ".wma" );   
   
    if ( result1!=NULL || result2!=NULL || result3!=NULL || result4!=NULL )
    {     
     if(result1 != NULL)/*若是mp3文件则读取mp3的信息*/
     {
      res = f_open( &fsrc, finfo.lfname, FA_OPEN_EXISTING | FA_READ ); /* 以只读方式打开 */     
      
      
      /* 获取歌曲信息(ID3V1 tag / ID3V2 tag) */     
      if ( Read_ID3V1(&fsrc, &id3v1) == TRUE )
      {// ID3V1 tag
       printf( "\r\n 曲目    :%s \r\n", id3v1.title );
       printf( "\r\n 艺术家  :%s \r\n", id3v1.artist );              
       printf( "\r\n 专辑    :%s \r\n", id3v1.album );     
      }
      else
      {// 有些MP3文件没有ID3V1 tag,只有ID3V2 tag      
       res = f_lseek(&fsrc, 0);
       Read_ID3V2(&fsrc, &id3v2);
      
       printf( "\r\n 曲目    :%s \r\n", id3v2.title );
       printf( "\r\n 艺术家  :%s \r\n", id3v2.artist );                    
      }  
     }
     /* 使文件指针 fsrc 重新指向文件头,因为在调用Read_ID3V1/Read_ID3V2时,
     fsrc 的位置改变了 */
     res = f_open( &fsrc, finfo.lfname, FA_OPEN_EXISTING | FA_READ );
     res = f_lseek(&fsrc, 0);
     
        
     br = 1;              /* br 为全局变量 */
     TXDCS_SET( 0 );            /* 选择VS1003的数据接口 */
     /* ------------------- 一曲开始 --------------------*/
     printf( " \r\n 开始播放 \r\n" );
     for (;;)
     {   
      res = f_read( &fsrc, buffer, sizeof(buffer), &br );
      if ( res == 0 )
      {   
       count = 0;        /* 512字节完重新计数 */
      
       Delay_us( 1000 );         /* 10ms 延时 */
       while ( count < 512)    /* SD卡读取一个sector,一个sector为512字节 */
       {      
        if ( DREQ != 0 )       /* 等待DREQ为高,请求数据输入 */
        {
        for (j=0; j<32; j++ ) /* VS1003的FIFO只有32个字节的缓冲 */
         {         
          VS1003_WriteByte( buffer[count] );         
          count++;
         }
        }              
       }
      }
//     printf( " \r\n TEST1 \r\n" );
      if (res || br == 0) break;   /* 出错或者到了MP3文件尾 */     
     }
     printf( " \r\n 播放结束 \r\n" );
     /* ------------------- 一曲结束 --------------------*/
     count = 0;
     /* 根据VS1003的要求,在一曲结束后需发送2048个0来确保下一首的正常播放 */
     while ( count < 2048 )
     {
      if ( DREQ != 0 )
      {
       for ( j=0; j<32; j++ )
       {           
        VS1003_WriteByte( 0 );        
        count++;
       }
      }
     }
     count = 0;
     TXDCS_SET( 1 );   /* 关闭VS1003数据端口 */
     f_close(&fsrc);  /* 关闭打开的文件 */
    }                           
   }
  } /* while (f_readdir(&dirs, &finfo) == FR_OK) */  
} /* if (f_opendir(&dirs, path) == FR_OK)  */   
} /* end of MP3_Play */
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-8 23:23 , Processed in 0.027114 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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