初级会员

- 积分
- 127
- 金钱
- 127
- 注册时间
- 2013-10-20
- 在线时间
- 0 小时
|
5金钱
以下摘自例程中一段:
//播放一曲指定的歌曲
//返回值:0,正常播放完成
// 1,下一曲
// 2,上一曲
// 0XFF,出现错误了
u8 mp3_play_song1(u8 *pname)
{
FIL* fmp3;
u16 br;
u8 res,rval;
u8 *databuf;
u16 i=0;
u8 key;
static u8 pause=0; //暂停标志
rval=0;
fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//申请内存
databuf=(u8*)mymalloc(SRAMIN,4096); //开辟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);//打开文件
//printf("sram :%d",mem_perused(0));
if(res==0)//打开成功.
{
VS_SPI_SpeedHigh(); //高速
////////////////////
Text_Buf[0]='A';
Text_Buf[4097]='A';
///////////////////////
while(rval==0)
{
res=f_read(fmp3,databuf,4096,(UINT*)&br);//读出4096个字节
i=0;
do//主播放循环
{
//if((VS_Send_MusicData(databuf+i)==0)&&(pause==0))//给VS10XX发送音频数据
if(pause==0)
{
i++;
//////////////////////////////
Text_Buf[1+i]=databuf;
//////////////////////////////
}else
{
key=KEY_Scan();
switch(key)
{
case KEY0_VAL:
rval=KEY0_VAL; //下一曲
break;
case KEY1_VAL:
rval=KEY1_VAL; //上一曲
break;
case KEY_UP_VAL: //暂停/播放
pause = !pause;
break;
default:
break;
}
mp3_msg_show(fmp3->fsize);//显示信息
}
}while(i<4096);//循环发送4096个字节
if(br!=4096||res!=0)
{
rval=KEY0_VAL;
break;//读完了.
}
//////////////////////////////////////////////////
MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输
//////////////////////////
if(DMA1->ISR&(1<<13))//等待通道4传输完成标志位
{
DMA1->IFCR|=1<<13;//清除通道4传输标志位
break;
}
//////////////////////////////////////////////////////
}
f_close(fmp3);
}else rval=0XFF;//出现错误
}
myfree(SRAMIN,databuf);
myfree(SRAMIN,fmp3);
return rval;
}
问题1:红色部分每次只发送4096个字节?
2、我用串口查看,每次只收到音频数据的4096个字节就没了下文了,这是什么情况?我感觉这样一个文件都没读完吧
3、从大体上我理解成这样的,只要没按键(下一首、上一首)就不会跳出循环,应该不停地每次取4096个字节的音频数据,但实际上,开发板显示间隔一会儿就立马切换了,根本就不知道有没有发完一首音频数据,
|
最佳答案
查看完整内容[请看2#楼]
回复【3楼】爱在暖晴天:
---------------------------------
if(br!=4096||res!=0)
{
rval=KEY0_VAL;
break;//读完了.
}
|