コード例 #1
0
ファイル: audio.c プロジェクト: chalot/BWRecorder
//切歌
//通过此函数切歌,不会出现切换“噪声”				
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();  		//软复位 
	}
}
コード例 #2
0
//播放一曲指定的歌曲	
//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;	  	 		  	    
}