OpenEdv-开源电子网

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

MP3音乐快进快退播放遇到问题

[复制链接]

8

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2012-11-12
在线时间
22 小时
发表于 2013-5-10 22:48:04 | 显示全部楼层 |阅读模式
 本人对文件系统还不算很透彻的了解,但是想实现音乐的快速播放,
所以利用  f_lseek(mp3dev->fmp3,k);//快速定位       函数进行定位,定位后回到大循环中继续读取数据
f_read(mp3dev->fmp3,databuf,4096,(UINT*)&br); //读出readlen个字节
结果就是当我长按时,音乐就从头播放。我感觉是那个定位函数貌似没定位到似的,到时从读数据是从头开始读取。
不知道是不是这样?应该如何改进?

 while(rval==0)
    { 
     res=f_read(mp3dev->fmp3,databuf,4096,(UINT*)&br); //读出readlen个字节
     i=0;
     do//主播放循环
        {   
      if((VS_Send_MusicData(databuf+i)==0)&&(mp3dev->sta&(1<<5))==0)//给VS10XX发送音频数据
      {
       i+=32;             
      }
下面就是按键长按的定位函数,定位后回到while中去。


没人看你努力的过程,只看最后的结果。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-5-11 00:11:48 | 显示全部楼层
回复【楼主位】黄毛:
---------------------------------
没看到长按部分啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2012-11-12
在线时间
22 小时
 楼主| 发表于 2013-5-11 00:39:26 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
if(res==0)//打开成功.

VS_SPI_SpeedHigh(); //高速
   
while(rval==0)
{
res=f_read(mp3dev->fmp3,databuf,4096,(UINT*)&br); //读出readlen个字节 
i=0;
do//主播放循环
{  
if((VS_Send_MusicData(databuf+i)==0)&&(mp3dev->sta&(1<<5))==0)//给VS10XX发送音频数据
{
i+=32;
}
else   
{
key=KEY_Scan(0);
switch(key)
{
case://省略音量调节函数
case KEY_RIGHT://上一曲或者下一曲或长按快进(暂时没快退)
case KEY_LEFT:
while(1)
{
key=KEY_Scan(1);
if(key==KEY_RIGHT)//判断还是按下时进入(快进)
{
t++;
if(t==10)//当t为10时设置一次MP3的位置
{ t=0;
k=k+mp3dev->fmp3->fsize/10; //快进一次的进度是总长度的1/10
if(k>mp3dev->fmp3->fsize)k=mp3dev->fmp3->fsize;              f_lseek(mp3dev->fmp3,k);//快速定位
i=4098;//为了方便跳出while循环
break;
}
}
else
{
mp3dev->sta|=1<<0;//在歌曲播完后只有该位为0才进入顺序或随机程序    
if(systemset.mp3mode==1)//随机播放
{     
        mp3dev->curindex=app_get_rand(mp3dev->mfilenum);//得到下一首歌曲的索引
rval=1;   
}else
{
if(key==KEY_LEFT)//上一曲
{
if(mp3dev->curindex>1)mp3dev->curindex--;//减1是因为mp3dev->curindex最小值为1,为1代表第一首歌。
else mp3dev->curindex=mp3dev->mfilenum;
rval=1;
}else
{
if(mp3dev->curindex<(mp3dev->mfilenum))mp3dev->curindex++;
else mp3dev->curindex=0;
rval=2;
}

break;
 }
}     
break;
case KEY_SURE://播放/暂停
if(mp3dev->sta&(1<<5))//是暂停
{
mp3dev->sta&=~(1<<5);//取消暂停

}else//暂停状态
{
mp3dev->sta|=1<<5;//标记暂停

}
break;
case KEY_BACK://音效模式键  
 OLED_Clear();
 mp3_mode();
 OLED_Clear();
 mp3_load_ui();//加载主界面
 mp3_index_show(0,52,mp3dev->curindex,mp3dev->mfilenum); //显示曲目数
break;
}
mp3_msg_show(mp3dev->fmp3->fsize);
}
            
}while(i<4096);//循环发送4096个字节 
if(br!=4096||res!=0)
{
break;//读完了.
}
}
f_close(mp3dev->fmp3);
}

程序参考了综合程序,在上面快进扫描中只是示意性的看能否实现快进功能,所以每次当t==10时,就快进总长度的1/10.
出现的问题:当我长按时,歌曲就从头开始唱起。
没人看你努力的过程,只看最后的结果。
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-5-11 01:01:16 | 显示全部楼层
回复【3楼】黄毛:
---------------------------------
仿真看一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-29 11:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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