金牌会员
- 积分
- 1572
- 金钱
- 1572
- 注册时间
- 2017-7-17
- 在线时间
- 308 小时
|
15金钱
原子哥,是这样子的。我仿照你们的音乐播放器例程写了个程序,但是我是把音乐文件下载到W25Q128里面,然后没有用FATS,而是直接从W25Q128里面读取音乐文件发送到VS1053的。音乐可以播放,但是就是播放MP3时中间会不间断常出现GUGU或JIOJIO的声音,每次出现的地方和声音都一样,不是随机的。播放WAV就更惨了,好多收音机收不到台那种沙沙的背景声音。这个跟VS1053的设置有没有关系呀,还是说程序上需要有什么改进的呀?下面是我播放音乐的代码,原子哥根据经验帮我分析下可能是什么原因呀?
int audio_play(uint8_t num)
{
uint8_t *databuf;
uint8_t temp,i;
uint32_t datacount,datasize;
//分配一个缓冲区
databuf=(uint8_t*)malloc(4096*sizeof(uint8_t));
if(databuf==NULL) return -1;
//检测指定文件是否存在(一个文件占用1M空间)
W25QXX_Read(&temp,SOUNDSTART+num*16*0x10000,1);
if(temp!=0xaa) return -2;
//读出文件大小信息(4个字节的空间保存文件大小)
datasize=0;
for(i=0;i<4;i++)
{
W25QXX_Read(&temp,SOUNDSTART+num*16*0x10000+i+1,1);
datasize<<=8;
datasize|=temp;
}
//进行复位
VS_HD_Reset();
VS_Soft_Reset();
//重启播放
VS_Restart_Play();
//设置音量等信息
VS_Set_All();
//复位解码时间
VS_Reset_DecodeTime();
//设置VS1053高速发送数据
VS_SPI_SpeedHigh();
//关闭功放
VS_SPK_Set(0);
//将文件按照4096字节大小复制到缓冲区中
datacount=0;
while(1)
{
//如果剩余文件超过4096字节,则复制4096字节的音频数据出来
if((datasize-datacount)>=4096)
{
memset(databuf,0,4096);
W25QXX_Read(databuf,SOUNDSTART+num*16*0x10000+5+datacount,4096);
datacount+=4096;
//播放音频数据流
for(i=0;i<128;i++)//播放4096字节的音频数据
{
VS_Send_MusicData(databuf+i*32);
}
continue;
}
else
{
memset(databuf,0,4096);
W25QXX_Read(databuf,SOUNDSTART+num*16*0x10000+5+datacount,datasize-datacount);
//发送最后一包音频文件
temp=(datasize-datacount)/32+1;
datacount=datasize;
for(i=0;i<temp;i++) VS_Send_MusicData(databuf+i*32);
break;
}
}
//释放内存空间
free(databuf);
databuf=NULL;
return 0;
}
|
|