新手入门
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2016-7-22
- 在线时间
- 4 小时
|
1金钱
我移植的是原子哥miniSTM32开发板列程MP3播放,有一些改动,在自动切换歌曲时会播放不是下一首的歌,播放时长大约为我一个循环发送的数据【4096】,还请大侠帮忙看看。
以下是播放程序:在VS1053忙的时候有插入一些定时器中断。
u8 MUSIC_BUFFER[4096];
u8 Play_Song(u16 index,u16 total)
{
u32 bfactor,starttick;
u32 bcluster;
u16 count;
u8 key,n;
u16 i;
u8 pause=0;
FileInfoStruct FileInfo;
i=Get_File_Info(Cur_Dir_Cluster,&FileInfo,T_MP3|T_WMA|T_WAV|T_MID|T_FLAC|T_OGG,&index);
if(i==0)return 0xff;
VS_Restart_Play();
VS_Set_All();
VS_Reset_DecodeTime();
if(VS10XX_ID==VS1053)
{
if(FileInfo.F_Type==T_FLAC)VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
}else
{
if(FileInfo.F_Type==T_FLAC||FileInfo.F_Type==T_OGG)return 0xfd;
}
bfactor=fatClustToSect(FileInfo.F_StartCluster);
bcluster=FileInfo.F_StartCluster;
count=0;
while(1)
{
//starttick= HAL_GetTick();
if(SD_ReadDisk(MUSIC_BUFFER,bfactor,8))break;
//LCD_ShowNum(110,210,HAL_GetTick()-starttick,6);
SPI1_SetSpeed(SPI_BAUDRATEPRESCALER_4);
//starttick= HAL_GetTick();
count = count+8;
i=0;
do
{
if(VS_DQ!=0&&pause==0)
{
if(VS_Send_MusicData(MUSIC_BUFFER+i)==0)
i= i+32;
}else
{
HAL_RTCEx_RTCEventCallback(&hrtc); //外部RTC中断。
HAL_TIM_PeriodElapsedCallback(&htim3); //外部定时器中断。
HAL_TIM_PeriodElapsedCallback(&htim4); //外部定时器中断。
HAL_TIM_PeriodElapsedCallback(&htim5); //外部定时器中断。
if(mp3control) //按键切换也放入忙时判断
{
switch(mp3control)
{
case 1:
return 1;
case 2:
return 2;
case 3:
pause=!pause;
}
}
}
}while(i<4095);
MP3_Msg_Show(FileInfo.F_Size,index,total);
bfactor = bfactor+8;
//LCD_ShowNum(160,210,HAL_GetTick()-starttick,6);
if(count>=SectorsPerClust)
{
count=0;
bcluster=FAT_NextCluster(bcluster);
//printf("NEXT:%d\n",bcluster);;
if((FAT32_Enable==0&&bcluster==0xffff)||bcluster==0x0ffffff8||bcluster==0x0fffffff)break;//error
bfactor=fatClustToSect(bcluster);
}
}
return 0;
}
|
|