//切歌 //通过此函数切歌,不会出现切换“噪声” void VS_Restart_Play(void) { u16 temp; u16 i; u8 n; u8 vsbuf[32]; for (n = 0; n < 32; n++) vsbuf[n] = 0; //清零 temp = VS_RD_Reg(SPI_MODE); //读取SPI_MODE的内容 temp |= 1 << 3; //设置SM_CANCEL位 temp |= 1 << 2; //设置SM_LAYER12位,允许播放MP1,MP2 VS_WR_Cmd(SPI_MODE, temp); //设置取消当前解码指令 for (i = 0; i < 2048;) //发送2048个0,期间读取SM_CANCEL位.如果为0,则表示已经取消了当前解码 { if (VS_Send_MusicData(vsbuf) == 0) //每发送32个字节后检测一次 { i += 32; //发送了32个字节 temp = VS_RD_Reg(SPI_MODE); //读取SPI_MODE的内容 if ((temp & (1 << 3)) == 0) break; //成功取消了 } } if (i < 2048) //SM_CANCEL正常 { temp = VS_Get_EndFillByte() & 0xff; //读取填充字节 for (n = 0; n < 32; n++) vsbuf[n] = temp; //填充字节放入数组 for (i = 0; i < 2052;) { if (VS_Send_MusicData(vsbuf) == 0) i += 32; //填充 } } else VS_Soft_Reset(); //SM_CANCEL不成功,坏情况,需要软复位 temp = VS_RD_Reg(SPI_HDAT0); temp += VS_RD_Reg(SPI_HDAT1); if (temp) //软复位,还是没有成功取消,放杀手锏,硬复位 { VS_HD_Reset(); //硬复位 VS_Soft_Reset(); //软复位 } }
//播放一曲指定的歌曲 //pname:歌曲路径+名字 //返回值:0,正常播放完成 // 1,下一曲 // 2,上一曲 // 0XFF,出现错误了 u8 MP3_playSong(const char *pName) { FIL* fmp3; u16 br; u8 res,rval; u8 *databuf; u16 i=0; u8 key; //static u8 pause=0; //暂停标志 static u8 lastVol = 0; //上一次音量 //u8 j = 0; rval=0; fmp3=(FIL*)malloc(sizeof(FIL)); //申请内存 databuf=(u8*)malloc(READ_MP3_SIZE); //开辟4096字节的内存区域 if(databuf==NULL||fmp3==NULL)rval=0XFF ;//内存申请失败. if(rval==0) { VS_HD_Reset(); VS_Soft_Reset(); lastVol = vsset.mvol; mp3_vol_show((vsset.mvol-100)/5); //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30 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(); //高速 while(rval==0) { res=f_read(fmp3,databuf,READ_MP3_SIZE,(UINT*)&br);//读出4096个字节 i=0; if (lastVol != vsset.mvol) //检测音量是否重新配置 { VS_Set_Vol(vsset.mvol); lastVol = vsset.mvol; //保存到配置文件 } #if 1 do//主播放循环 { if((VS_Send_MusicData(databuf+i)==0))//给VS10XX发送音频数据 { i+=32; } else { key=KEY_getValue(); switch(key) { case KEY_UP: printf("+++++++++++++++++++++++++++key up\r\n"); rval=KEY_UP; //跳出 break; default: break; } //mp3_msg_show(fmp3->fsize);//显示信息 } }while(i<READ_MP3_SIZE);//循环发送4096个字节 #endif if(br!=READ_MP3_SIZE||res!=0) { rval=KEY_UP; break;//读完了. } } f_close(fmp3); }else rval=0XFF;//出现错误 } if (databuf != NULL) free(databuf); if (fmp3 != NULL) free(fmp3); return rval; }