金牌会员
 
- 积分
- 1574
- 金钱
- 1574
- 注册时间
- 2017-7-17
- 在线时间
- 308 小时
|
原子的音乐播放器例程是用SD卡加FATS文件系统做的,我现在是把wav文件用XMODEM协议从串口助手下载到W25Q128里面去了,也没有用FATS,而是仿照例程,直接从W25Q128里面将wav数据按照4096字节读出来,然后用VS_Send_MusicData()函数发送给VS1053,但是并不能播放,没有声音。我看原子在别的贴里面回复说要发送音频文件头,这个文件头是要我自己组织发送,还是已经包含在.wav文件里面了呢?下面是我的音频播放函数。
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;
//读出文件大小信息
datasize=0;
for(i=0;i<4;i++)
{
W25QXX_Read(&temp,SOUNDSTART+num*16*0x10000+i+1,1);
datasize<<=8;
datasize|=temp;
}
//重启播放
VS_Restart_Play();
//设置音量等信息
VS_Set_All();
//复位解码时间
VS_Reset_DecodeTime();
//设置VS1053高速发送数据
VS_SPI_SpeedHigh();
//开启功放
VS_SPK_Set(1);
//将文件按照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++)
{
VS_Send_MusicData(databuf+i*32);
}
continue;
}
else
{
memset(databuf,0,4096);
W25QXX_Read(databuf,SOUNDSTART+num*16*0x10000+5+datacount,datasize-datacount);
datacount=datasize;
//发送最后一包音频文件
temp=(datasize-datacount)/32+1;
for(i=0;i<temp;i++) VS_Send_MusicData(databuf+i*32);
break;
}
}
LED0=~LED0;
//释放内存空间
free(databuf);
databuf=NULL;
return 0;
}
|
|