中级会员
- 积分
- 259
- 金钱
- 259
- 注册时间
- 2016-6-12
- 在线时间
- 61 小时
|
1金钱
用这段代码实现播放WAV文件的,我用EMWIN 的listbox通过点击不同项目播放不同WAV文件,用EMWIN的效果就是不等下面的函数执行完直接重新执行,我把该释放的内存在函数执行前释放一次,避免重复申请内存,还是会进入6次就卡死,但是让WAV文件播放完毕再点击播放就不会出现这个问题,什么原因?
[mw_shl_code=c,true]u8 recorder_play_song(u8* fname)
{
u8 key;
u8 t=0;
u8 res;
u32 fillnum;
audiodev.file=(FIL*)mymalloc(SRAMIN,sizeof(FIL));
audiodev.i2sbuf1=mymalloc(SRAMIN,WAV_I2S_TX_DMA_BUFSIZE);
audiodev.i2sbuf2=mymalloc(SRAMIN,WAV_I2S_TX_DMA_BUFSIZE);
audiodev.tbuf=mymalloc(SRAMIN,WAV_I2S_TX_DMA_BUFSIZE);
if(audiodev.file&&audiodev.i2sbuf1&&audiodev.i2sbuf2&&audiodev.tbuf)
{
res=wav_decode_init(fname,&wavctrl);//μÃμ½ÎļtμÄDÅÏ¢
if(res==0)//½aÎöÎļt3é1|
{
if(wavctrl.bps==16)
{
WM8978_I2S_Cfg(2,0); //·éàûÆÖ±ê×¼,16λêy¾Y3¤¶è
I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_16bextended); //·éàûÆÖ±ê×¼,Ö÷»ú·¢Ëí,ê±ÖóμíμçƽóDD§,16λà©Õ1Ö¡3¤¶è
}else if(wavctrl.bps==24)
{
WM8978_I2S_Cfg(2,2); //·éàûÆÖ±ê×¼,24λêy¾Y3¤¶è
I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_24b); //·éàûÆÖ±ê×¼,Ö÷»ú·¢Ëí,ê±ÖóμíμçƽóDD§,24λà©Õ1Ö¡3¤¶è
}
I2S2_SampleRate_Set(wavctrl.samplerate);//éèÖÃ2éÑùÂê
I2S2_TX_DMA_Init(audiodev.i2sbuf1,audiodev.i2sbuf2,WAV_I2S_TX_DMA_BUFSIZE/2); //ÅäÖÃTX DMA
i2s_tx_callback=wav_i2s_dma_tx_callback; //»Øμ÷oˉêyÖ¸wav_i2s_dma_callback
audio_stop();
res=f_open(audiodev.file,(TCHAR*)fname,FA_READ); //′ò¿aÎļt
if(res==0)
{
f_lseek(audiodev.file, wavctrl.datastart); //ìø1yÎļtí·
fillnum=wav_buffill(audiodev.i2sbuf1,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);
fillnum=wav_buffill(audiodev.i2sbuf2,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);
audio_start();
while(res==0)
{
GUI_Delay(100);
while(wavtransferend==0);//μè′ywav′«êäíê3é;
wavtransferend=0;
if(fillnum!=WAV_I2S_TX_DMA_BUFSIZE)//2¥·Å½áêø?
{
res=KEY0_PRES;
break;
}
if(wavwitchbuf)fillnum=wav_buffill(audiodev.i2sbuf2,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);//ìî3äbuf2
else fillnum=wav_buffill(audiodev.i2sbuf1,WAV_I2S_TX_DMA_BUFSIZE,wavctrl.bps);//ìî3äbuf1
while(1)
{
GUI_Delay(100);
key=KEY_Scan(0);
if(key==WKUP_PRES)//ÔYí£
{
if(audiodev.status&0X01)audiodev.status&=~(1<<0);
else audiodev.status|=0X01;
}
if(key==KEY2_PRES||key==KEY0_PRES)//ÏÂò»Çú/éÏò»Çú
{
res=key;
break;
}
wav_get_curtime(audiodev.file,&wavctrl);//μÃμ½×üê±¼äoíμ±Ç°2¥·ÅμÄê±¼ä
recorder_msg_show(wavctrl.totsec,wavctrl.cursec,wavctrl.bitrate);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
if((audiodev.status&0X01)==0)delay_ms(10);
else break;
}
}
audio_stop();
}else res=0XFF;
}else res=0XFF;
}else res=0XFF;
myfree(SRAMIN,audiodev.tbuf); //êí·ÅÄú′æ
myfree(SRAMIN,audiodev.i2sbuf1);//êí·ÅÄú′æ
myfree(SRAMIN,audiodev.i2sbuf2);//êí·ÅÄú′æ
myfree(SRAMIN,audiodev.file); //êí·ÅÄú′æ
return res;
}[/mw_shl_code]
|
|