OpenEdv-开源电子网

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

在加载FLAC插件后VS1053不能播放WMA的原因

[复制链接]

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2012-5-31 21:33:00 | 显示全部楼层 |阅读模式

我想到了一个办法。

//加载用户代码到VS10XX
//FLAC解码.但是加载后不支持WMA.
//写入plugin 
void Load_VS_Load_FlacPatch(void)
{      
 u16 i;
 u16 addr, n, val;         
 for(i=0;i<VS1053B_PATCHLEN;)
 {
  addr = vs1053b_patch[i++];
  n    = vs1053b_patch[i++];
  if(n & 0x8000U) //RLE run, replicate n samples
  {
   n  &= 0x7FFF;
   val = vs1053b_patch[i++];
   while(n--)VS_WR_Cmd(addr, val); 
  }else //copy run, copy n sample
  {
   while(n--)
   {
    val = vs1053b_patch[i++];
    VS_WR_Cmd(addr, val);
   }
  }
 }     
}

//清除VS10XX的FLAC用户代码
//FLAC解码.但是加载后不支持WMA.
//写入plugin 
void Clear_VS_Load_FlacPatch(void)
{      
 u16 i;
 u16 addr, n;         
 for(i=0;i<VS1053B_PATCHLEN;)
 {
  addr = vs1053b_patch[i++];
  n    = vs1053b_patch[i++];
  if(n & 0x8000U) //RLE run, replicate n samples
  {
   n  &= 0x7FFF;
   while(n--)VS_WR_Cmd(addr, 0x0000); 
  }else //copy run, copy n sample
  {
   while(n--)
   {
    VS_WR_Cmd(addr, 0x0000);
   }
  }
 }     
}

在播放FLAC的时候加载插件,不播放的时候就把数据清零,可是实验失败了,还是不行,谁知道原因?

站在巨人的肩膀上不断的前进。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-31 22:47:50 | 显示全部楼层
换歌取的时候,系统软复位一次.需要播放flac的时候再加载flac的plugin.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2012-6-1 07:43:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
嗯,谢谢原子哥,问题已经解决,以前加载FLAC的plugin的时候不是直接接在系统复位后,现在好了,现在把源码发上来,发给需要的盆友们。基于FATFS继承原子哥大部分基因,哈哈,代码不对之处,请多多指出。
//功能:通过按键选择播放,指定路径上的文件
//输入:*path:路径
//输出:1:获取音频文件失败
u32 MUSIC_FILE_TYPE = T_UNTELL;             //存储文件类型,默认不能识别的文件类型
u8 lay_Music(char *path)
{
u16 i;
u8 key;       
u16 mus_total=0;//总音乐文件的个数

if(VS_HD_Reset())return 1;    //硬复位
VS_Soft_Reset();   //软复位VS10XX   
set10XX();         //设置音量等信息  

if(VS10XX_ID==VS1053)   //在软件复位时得到ID
{
MUSIC_FILE_TYPE = T_MP3|T_WMA|T_WAV|T_MID|T_FLAC|T_OGG;

else  MUSIC_FILE_TYPE =  T_MP3|T_WMA|T_WAV|T_MID;

Get_File_Info(path,MUSIC_FILE_TYPE,&mus_total);//获取当前文件夹下面的目标文件个数 

if(!mus_total)  return 2; //无音频文件则返回
i=1;
while(1)
{     
key=Play_Song(path,i,mus_total); 
if(key==1)
{
if(i<mus_total)i++;
else i=1;
}else if(key==2)
{
if(i>1)i--;
else i=mus_total;
}else
{
;
}    
}  
}
////////////////////////////////////////////////////////
//播放音乐
//index:播放的歌曲编号
//返回值:0,成功;1,下一曲;2,上一曲;0xff 得到文件信息失败;0xfe,硬复位失败;  
u8 MUSIC_BUFFER[512];

extern u8 SPI_FLASH_BUF[4096];
u8 *music_path = (u8*)SPI_FLASH_BUF;   

u8 lay_Song(char *path,u16 index,u16 total)
{  
u8 key;
u16 i,count=0;  
u8 pause=0,n;//不暂停  
FRESULT res;
FILINFO fno;
DIR dir;
FIL music_file;
UINT br;

#if _USE_LFN
static char lfn[_MAX_LFN+1];
fno.lfname = lfn;
fno.lfsize = sizeof(lfn);
#endif

res = f_opendir(&dir,path);
if(!res)
{
for(;;)
{
res = f_readdir(&dir,&fno);   //顺序读取目录项
if(res||fno.fname[0]==0) break;
if(fno.fname[0]=='.')  continue;  //跳过自身目录项和父目录项

if(fno.fattrib&AM_DIR) continue;  //跳过文件夹
else
{
if(FileType_Tell(fno.fname)&MUSIC_FILE_TYPE)  //使用短文件名查找
{
count++;
if(count==index) {count=0;break;}
}
}
}
}
Show_Str(60,150,(u8*)fno.lfname,16,0);  //显示歌曲长文件名
strcpy((char*)music_path,path);
strcat((char*)music_path,"/");
strcat((char*)music_path,(char*)fno.fname);    //使用短文件名合成路径,寻址~
res = f_open(&music_file,(const TCHAR*)music_path,FA_READ);

VS_HD_Reset();  //硬复位          
VS_Soft_Reset();//软复位 
set10XX();        //设置音量等信息 
if(T_FLAC==FileType_Tell(fno.fname))  //使用短文件名查找
VS_Load_FlacPatch();                              
while(1)   //播放音乐的主循环
{
SPIx_SetSpeed(SPI_SPEED_2);//SD读取数据时设为高速
res=f_read(&music_file,MUSIC_BUFFER,sizeof(MUSIC_BUFFER),&br);//这里很容易死在这里(堆栈溢出)   //因为默认的堆栈才512字节
if(res||br==0)
{
f_close(&music_file);  
 return 1; //播放完毕,则播放下一首
}

i=0;
SPIx_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M  
do      //主播放循环
    {      
if(VS_DQ!=0&&pause==0)  // 非暂停 送数据给VS1003 
{      
     VS_XDCS=0;    
            for(n=0;n<32;n++)
{
SPIx_ReadWriteByte(MUSIC_BUFFER[i++]);  
}
VS_XDCS=1;    
  }
key=KEY_Scan();
if(key)
{
switch(key)
{
case 1://下一首歌
   f_close(&music_file); 
return 1;
case 2://上一首歌
f_close(&music_file); 
return 2;
case 3://暂停/播放
pause=!pause;
}
}      
}while(i<511); //循环发送512个字节 
MP3_Msg_Show(fno.fsize,index,total);
}
    
}
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-6-5 00:03:58 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2012-8-20
在线时间
25 小时
发表于 2012-8-20 10:41:46 | 显示全部楼层
谢谢
刚好需要
回复 支持 反对

使用道具 举报

22

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2012-2-4
在线时间
0 小时
发表于 2012-9-10 16:47:15 | 显示全部楼层
楼主,高码率的音乐文件放起来卡不卡
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2012-4-27
在线时间
0 小时
发表于 2012-9-13 10:53:32 | 显示全部楼层
回复【6楼】隐隐约约:
---------------------------------
你做的,不能放高码率的音乐是不.
VLSI-代理.我这里提供,开发板,样片,技术资料.15361638451
回复 支持 反对

使用道具 举报

30

主题

210

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2012-11-22
在线时间
12 小时
发表于 2012-11-22 14:34:06 | 显示全部楼层
回复【3楼】xiaoyan:
---------------------------------
顶一下
VLSI?大陆区一级授权代理商,提供技术支持,QQ839638158?VS1003?VS1053?VS1063?VS1011?VS1005?VS1205?VS1103?VS1033?VS8005?VS8053?VS1000?VS23S010?VS1163?开发板,淘宝店铺http://shop105947990.taobao.com/?QQ2355355257
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 21:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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