搜索
bottom↓
回复: 5

自制MP3发现的关于文件名字的问题,希望大家的解答

[复制链接]

出0入0汤圆

发表于 2009-10-21 09:32:33 | 显示全部楼层 |阅读模式
请教大家个问题;
我用阿勇的程序做的MP3
发现了这样的问题:能放长名字的歌曲,如:如果.爱.MP3,前边加上数字如:01如果.爱.MP3也可以播放,但是只单单写成数字的如01.MP3,02.MP3就不可以,写成a.MP3,b.MP3这种单字母的也不可以,写成she.MP3,backatone.MP3这样的就可以。中间还发现hero.MP3,love.MP3不能播放,改成he_ro.mp3就可以了呢
为什么?
多谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-10-21 17:14:36 | 显示全部楼层
通常是文件名匹配函数不适当造成的.

出0入0汤圆

 楼主| 发表于 2009-10-21 22:34:15 | 显示全部楼层
通常是文件名匹配函数不适当造成的

谢谢,热肠人!
你能给说的明白些吗,实在不懂!!
多谢

出0入0汤圆

发表于 2009-10-22 12:07:02 | 显示全部楼层
您最好把相关部分的代码贴上来,才好仔细分析,否则只能根据您的现象说些指导性的建议.

出0入0汤圆

 楼主| 发表于 2009-10-22 22:37:52 | 显示全部楼层
*-----------------------------------------------------------------------
查询一个文件的开始簇
-----------------------------------------------------------------------*/
unsigned int baseentry = 0;
unsigned int entrycount = 0;


unsigned long fatGetDirEntry(unsigned int entry)
{
        unsigned long sector;
        struct direntry *de = 0;        // 防止compiler warning
        struct winentry *we;
        unsigned int hasBuffer;
        unsigned int b;
        int i,index;
        char *p;
       
                entrycount = 0;
                DirNameBuffer = 0;
       
       
        // 读取目录区数据
        sector = fatClustToSect(FirstDirSector);

        hasBuffer = 0;

        index = 16;       
        do
        {
                if(index == 16)        // 是否该一人一扇区time for next sector ?
                {
                        ReadBlock(sector++);
                        de = (struct direntry *)BUFFER;
                        index = 0;
                }       
       
                if(*de->deName != 0xE5)
                {
                        // 如果if not a deleted entry
                        if(de->deAttributes == ATTR_LONG_FILENAME)
                        {
                                // we have a long name entry
                                we = (struct winentry *) de;
                                b = 13 *( (we->weCnt-1) & 0x0f);                                // index into string
                                p = &LongNameBuffer;
                                for (i=0;i<5;i++)        *p++ = we->wePart1[i*2];        // copy first part                       
                                for (i=0;i<6;i++)        *p++ = we->wePart2[i*2];        // second part
                                for (i=0;i<2;i++)        *p++ = we->wePart3[i*2];        // and third part
                                if (we->weCnt & 0x40) *p = 0;                                        // in case dirnamelength is multiple of 13
                                if ((we->weCnt & 0x0f) == 1) hasBuffer = 1;                // mark that we have a long entry
                        }
                        else
                        {
                                // we have a short name entry
                                // check if this is the end of a multi-part long name entry
                                if(hasBuffer)
                                {
                                        // a long entry name has been collected
                                        // is it a directory ?
                                        if(de->deAttributes == ATTR_DIRECTORY)
                                        {
                                                unsigned long save = FirstDirSector;
                                                unsigned int save2 = baseentry;
                                                unsigned long rval;
                                               
                                                strcpy(DirNameBuffer,LongNameBuffer);
                                                strcat(DirNameBuffer,"/");

//                                                rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();

                                                // call recursively
                                                FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
                                                rval = fatGetDirEntry(entry);
                                                FirstDirSector = save;
                                                baseentry = save2;
                                                if (rval)
                                                        return rval;
                                                else       
                                                {
                                                        // reload original sector
                                                        ReadBlock(sector-1);//ataReadSectors( DRIVE0,        sector-1, 1, SectorBuffer);
                                                        entrycount--;                        // decrement entry counter               
                                                        *DirNameBuffer = 0;
                         }
                                        }
                                        else // normal file entry
                                                if(entrycount == entry)               
                                                        break;
                                        hasBuffer = 0;        // clear buffer       
                                        entrycount++;        // increment entry counter               
                                }
                                // else ignore short_name_only entries
                        }
                }
                de++;
                index++;
        }        while (*de->deName || index == 16);        // 0 in de->deName[0] if no more entries

        if (hasBuffer == 0)                // end of entries
                return 0;
       
        FileSize = de->deFileSize;
        return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
}

/*-----------------------------------------------------------------------
在FAT表中查询下一个簇所在扇区号
-----------------------------------------------------------------------*/
unsigned long fatNextCluster(unsigned long cluster)
{
        unsigned long nextCluster;
        unsigned long fatMask;
        unsigned long fatOffset;
        unsigned long sector;
        unsigned int offset;
       
        if(Fat32Enabled)
        {
                // 一个表项为4bytes(32 bits)
                fatOffset = cluster << 2;
                // 设置 FAT32 bit mask
                fatMask = FAT32_MASK;
        }
        else
        {
                // 一个表项为2bytes(16 bits)
                fatOffset = cluster << 1;
                // 设置 FAT16 bit mask
                fatMask = FAT16_MASK;
        }
       
        //计算FAT扇区号
        sector = FirstFATSector + (fatOffset / BytesPerSector);
        //计算FAT扇区号中表项的偏移地址
        offset = fatOffset % BytesPerSector;
   
        ReadBlock(sector);

        // 读取下一个簇号
        nextCluster = (*((unsigned long*) &((char*)BUFFER)[offset])) & fatMask;

        // 是否文件的结束簇
        if (nextCluster == (CLUST_EOFE & fatMask))
                nextCluster = 0;
               
        return nextCluster;
}
上面是fat文件程序,下面的是播放程序,麻烦哥哥给看看

void mp3_play(unsigned long FirstClust)
{  
uint32 LBA,NextCluster;
uint16 i,data_pointer,rate;
uint8 n,t1;
NextCluster = FirstClust;

   while (1)
          {       
          LBA =fatClustToSect(NextCluster);
          for (i=0;i<SectorsPerCluster;i++)
                    {
                  if(flag==0)  ReadBlock(LBA+i);      //读完后文件指针自动后移
                  
        //按键处理程序
            //ST/PS键按下
          if(!(PINE&STOP))
           {
            delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
                if(!(PINE&STOP))
                {
                 flag^=0x01;
                 }
           }
          //VOLUP键按下
          if(!(PINE&VOLDOWN))  
           {
            delay_nus(250);
            if(!(PINE&VOLDOWN))  
                  {
                  vol=vol+((uint)(2<<8)+2);
                   if(vol>=0xFAFA) vol=0xF0F0;
               else vs1003_cmd_write(0x0b,vol);    //每次左右声道VOL减2
                  }
           }
          //VOLDOWN键按下
          if(!(PINE&VOLUP))
            {
                delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
                if(!(PINE&VOLUP))
                  {
                   vol=vol-((uint)(2<<8)+2);
                   if(vol<=0x0505) vol=0x0505;
                   else vs1003_cmd_write(0x0b,vol);   //每次左右声道VOL加2
              }
                }
          //NEXT键按下
          if(!(PINE&NEXTSONG))
            {
                delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
                delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
                if(!(PINE&NEXTSONG))  goto NEXT;       //跳到下一首歌曲
            }
            //PREV键按下
          if(!(PINE&PREVSONG))
            {
                delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
                if(!(PINE&PREVSONG))
                  {
                  t=t-2;goto NEXT;  //返回前一首歌曲
              }
                }
               
                
                 data_pointer=0;
        while(data_pointer<512)
        {   
            if(PINB&MP3_DATA_REQ)
               {
                 for(n=0;n<32;n++)
                           {
                    vs1003_data_write(BUFFER[data_pointer]);
                    data_pointer++;   
                          }
                                }
             if (data_pointer==511) break;   //如果现在的数据不够了,则跳出来
             }
        }
        NextCluster = fatNextCluster(NextCluster);
        if (NextCluster >=(CLUST_RSRVD&FAT_MASK))break;
        }
NEXT: delay_nus(1);  /* 下一首歌曲*/
       
}

出0入0汤圆

发表于 2009-10-25 11:31:00 | 显示全部楼层
if(index == 16) // 是否该一人一扇区time for next sector ?
每个扇区容纳16个目录项,查完一个扇区要换扇区,代码用变量不太规范,建议参考论坛中其它网友的作品重写文件系统相关部分.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 13:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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