OpenEdv-开源电子网

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

为什么vs1053 播放大于64kbps出现卡顿 ?

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-11-7
在线时间
0 小时
发表于 2015-11-28 10:34:57 | 显示全部楼层 |阅读模式
5金钱

#include "mp3play.h"
#include "delay.h"
#include "malloc.h"
#include "string.h"
#include "exfuns.h"
#include "fattester.h"
#include "ff.h"  
#include "usart.h"
#include "VS1053.h"
#include "flac.h"
#include "key.h"









//得到path路径下,目标文件的总个数
//path:路径    
//返回值:总有效文件数
u16 mp3_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(SRAMIN,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
}    
}  
}
myfree(SRAMIN,tfileinfo.lfname);
return rval;
}



//播放一曲指定的歌曲          
//返回值:0,正常播放完成
// 1,下一曲
//       2,上一曲
//       0XFF,出现错误了
u8 mp3_play_song(u8 *pname)
{
FIL* fmp3;
   u16 br;
u8 res,rval;  
u8 *databuf;    
u16 i=0;
u8 key;      
 
rval=0;    
fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//申请内存
databuf=(u8*)mymalloc(SRAMIN,1024); //开辟4096字节的内存区域
if(databuf==NULL||fmp3==NULL)rval=0XFF ;//内存申请失败.
if(rval==0)
{  
  VS_Restart_Play();   //重启播放
VS_Set_All();         //设置音量等信息
VS_Reset_DecodeTime(); //复位解码时间  
res=f_typetell(pname); //得到文件后缀  
if(res==0x4c)//如果是flac,加载patch
{
VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
}      
res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//打开文件
if(res==0)//打开成功.
{
VS_SPI_SpeedHigh(); //高速  
while(rval==0)
{
res=f_read(fmp3,databuf,1024,(UINT*)&br);//读出4096个字节  
i=0;
do//主播放循环
   {  
if(VS_Send_MusicData(databuf+i)==0)//给VS10XX发送音频数据
{
i+=32;
}
                   
                   else
                   {
                      key=KEY_Scan(0);
switch(key)
{
case KEY_DOWN:
rval=1; //1下一曲
break;
case KEY_RIGHT:
rval=2; //2上一曲
break;
}
                   }
                   
               
}while(i<1024);//循环发送4096个字节
if(br!=1024||res!=0)
{
rval=0;
break;//读完了.  
}
}
f_close(fmp3);
}else rval=0XFF;//出现错误    
}    
myfree(SRAMIN,databuf);        
myfree(SRAMIN,fmp3);
return rval;        
}



void mp3_play(void)
{
u8 res;
DIR mp3dir; //目录
FILINFO mp3fileinfo;//文件信息
u8 *fn;   //长文件名
   u16 key;
u8 *pname; //带路径的文件名
u16 totmp3num; //音乐文件总数
u16 curindex; //图片当前索引  
u16 temp;
u16 *mp3indextbl; //音乐索引表
while(f_opendir(&mp3dir,"0:/MUSIC"))//打开图片文件夹
{    
printf("MUSIC文件夹错误!");
delay_ms(500);  
}  
totmp3num=mp3_get_tnum("0:/MUSIC"); //得到总有效文件数
   printf("歌曲文件总数:%d!\r\n",totmp3num);
  while(totmp3num==NULL)//音乐文件总数为0
{    
printf("没有音乐文件!\r\n");
delay_ms(500);  
}  
  mp3fileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度
mp3fileinfo.lfname=mymalloc(SRAMIN,mp3fileinfo.lfsize);//为长文件缓存区分配内存
pname=mymalloc(SRAMIN,mp3fileinfo.lfsize); //为带路径的文件名分配内存
mp3indextbl=mymalloc(SRAMIN,2*totmp3num); //申请2*totmp3num个字节的内存,用于存放音乐文件索引
while(mp3fileinfo.lfname==NULL||pname==NULL||mp3indextbl==NULL)//内存分配出错
{    
printf("内存分配出错!\r\n");
delay_ms(500);  
}  

//记录索引
   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);   //将文件名接在后面
// LCD_Fill(60,210,240,210+16,WHITE); //清除之前的显示
// Show_Str(60,210,240-60,16,fn,16,0); //显示歌曲名字
// mp3_index_show(curindex+1,totmp3num);
//播放这个MP3  
        printf("歌名:%s\r\n",fn);  
        key=mp3_play_song(pname);
       if(key==1)  
       curindex++;  
       if(key==2)    
        curindex--;  
        if(key==0xff)  
         printf("播放错误");            
   // curindex++;
     
       if(curindex>=totmp3num)curindex=0;
}  
myfree(SRAMIN,mp3fileinfo.lfname); //释放内存    
myfree(SRAMIN,pname); //释放内存    
myfree(SRAMIN,mp3indextbl); //释放内存
}








正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-11-28 11:38:02 | 显示全部楼层
LZ用论坛代码功能重新发一遍吧,这么看太累。

如果出现卡顿,应该是数据发送跟不上播放出现断流
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-16 05:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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