最近在用STM32F103驱动VS1003,发现在播放过程中音量无法调节大小,
在系统初始化的时候音量可以设置
请问我哪个地方不合适?
下面是我的播放代码
[mw_shl_code=c,true]char MP3Broadcast(void)
{
OS_ERR err;
unsigned int count=0;
unsigned char j=0;
static u8 buffer[512];
unsigned int br;// 文件读计数器
FRESULT res;// FatFs 功能函数返回结果变量
static FIL MB_fsrc; // 文件标志
static char Volume;
res = f_open(&MB_fsrc, str[0], FA_OPEN_EXISTING | FA_READ);//打开要播放的歌曲str[x]
res = f_read(&MB_fsrc, buffer, sizeof(buffer), &br); //读取文件开始的512字节
if(buffer[0]==0x49&&buffer[1]==0x44&&buffer[2]==0x33)
{ //起始帧是ID3帧
j=buffer[8]*128+ buffer[9]+10; //计算出数据帧头位置
f_lseek(&MB_fsrc,j); //定位到数据帧
res = f_read(&MB_fsrc,buffer,sizeof(buffer),&br); //读取512字节
}
VS10xx_Reset_DecodeTime();//必须复位播放时间否则会出现播放迟缓现象
br=1;
XDCS_SET(0); //xDCS = 0,选择vs1003的数据接口
SysParameter.SysSDCard.VS10xxRunFlag = 1;
for (;;)
{
res = f_read(&MB_fsrc, buffer, sizeof(buffer), &br);
if(res==0)
{
count=0;
//下面这个延时设置太大卡顿,太小对系统压力大
OSTimeDlyHMSM(0, 0, 0, 20,OS_OPT_TIME_HMSM_STRICT,&err);
while(count<512)
{ //根据SD卡介质的原因,文件每次只能读出512字节
if(!SysParameter.SysSDCard.VS10xxBroadcastControl)//停止播放
{
br = 0;//用于跳出for(;;)循环
break;
}
if(VS_DREQ!=0)
{ //VS1003数据申请口线, 每次为高后,可以通过SPI2写入32字节的音频数据
for(j=0;j<32;j++) //每次送32个数据
{
// VS10xx_WriteByte(buffer[count]); //写入音频数据
SysDMAVS10xx.SendBuff[j] = buffer[count];
count++;
}
DMA1CHx_Enable(DMA1_Channel5,32);
while(DMA1_Channel5->CNDTR!=0)OSTimeDlyHMSM(0, 0, 0, 4,OS_OPT_TIME_HMSM_STRICT,&err);
SysParameter.SysSDCard.VS10xx_Step += 32;//播放进度
}
if (res || br == 0) break; // 是否到文件尾
}
if(Volume != SysDWINTouchLCD.Vs100xVolume)//如果音量修改了,设置音量大小
{ while(VS_DREQ==0);
VS10xx_SPI_SpeedLow(); //低速
XDCS_SET(1); //xDCS = 1
CS_SET(0); //xCS = 0
VS10xx_Set_Vol(SysDWINTouchLCD.Vs100xVolume);
CS_SET(1); //xCS = 1
XDCS_SET(0); //xDCS = 0,选择vs1003的数据接口
VS10xx_SPI_SpeedHigh(); //高速
while(VS_DREQ==0);
Volume = SysDWINTouchLCD.Vs100xVolume;
}
}
if (res || br == 0) break; // 是否到文件尾
}
count=0;
while(count<2048)
{ //根据VS1003的特性,需要音乐文件的末尾发送一些个0 ,保证下一个音频文件的播放
if(VS_DREQ!=0)
{
for(j=0;j<32;j++) //每次送32个数据
{
VS10xx_WriteByte(0);
count++;
}
}
}
XDCS_SET(1);
f_close(&MB_fsrc);
return FR_OK;
}[/mw_shl_code]
[mw_shl_code=c,true]
//设定VS10XX播放的音量和高低音
//volx:音量大小(0~254)
void VS10xx_Set_Vol(unsigned char volx)
{
u16 volt=0; //暂存音量值
volt=254-volx; //取反一下,得到最大值,表示最大的表示
volt<<=8;
volt+=254-volx; //得到音量设置后大小
VS10xx_WriteReg(SPI_VOL,volt);//设音量
}[/mw_shl_code]
[mw_shl_code=c,true]
/****************************************************************************
* 名 称:void VS10xx_WriteReg(unsigned char add, unsigned short Data)
* 功 能:写VS10xx寄存器
* 入口参数:add:寄存器地址,Data:要发送的16bit数据
* 出口参数:无
* 说 明:
* 调用方法:无
****************************************************************************/
void VS10xx_WriteReg(unsigned char add, unsigned short Data)
{
while(VS_DREQ==0); //等待空闲
VS10xx_SPI_SpeedLow(); //低速
XDCS_SET(1); //xDCS = 1
CS_SET(0); //xCS = 0
VS10xx_WriteByte(VS_WRITE_COMMAND); //发送写寄存器命令
VS10xx_WriteByte(add); //发送寄存器的地址
VS10xx_WriteByte(Data>>8); //发送待写数据的高8位
VS10xx_WriteByte(Data); //发送待写数据的低8位
CS_SET(1); //xCS = 1
VS10xx_SPI_SpeedHigh(); //高速
}
[/mw_shl_code]
|