|
发表于 2011-9-23 10:07:49
|
显示全部楼层
回复【180楼】sharpufo
-----------------------------------------------------------------------
我用学习板做了一个界面,已经能显示根目录,子目录,带触摸的。现在想加入WAV播放。但对楼主的WAV播放源代码有很多不明白。不知道是如何实现播放的?
我理解是这样,不知道是否正确。应该在先用WAV_Check_PCM_Buf_And_Refill()检查PCM_Buf 里面是否有内容,然后WAV_Fill_PCM_Buf()把读出的wav内容填入,然后执行playWAV()
int playWAV(char * filename)
{
FIL file;
UINT br;
int i,pause_play,pause_disp;
int eof;
struct wavhead head;
U32 freq;
INIT_PLAY_WAV:
pause_play=0;
DISABLE_AUDIO;
if(f_open(&file,filename,FA_READ)!=FR_OK)return 1;
LoadWavHead(&file,&head);
DumpWavHead(&head);
freq=head.fmt.SamplePerSec;
if(
//freq!=I2S_AudioFreq_48k &&
freq!=I2S_AudioFreq_44k// &&
// freq!=I2S_AudioFreq_22k &&
// freq!=I2S_AudioFreq_16k &&
// freq!=I2S_AudioFreq_8k
)
{f_close(&file);return 2;}
if(head.fmt.Channels!=2 && head.fmt.Channels!=1)
{f_close(&file);return 2;}
if(head.fmt.BitsPerSample!=16)
{f_close(&file);return 2;}
if(head.dataOffset)
f_lseek(&file,head.dataOffset);
else return 2;
//I2S_SetFreq(head.fmt.SamplePerSec);/*if use iis in stm32 instead you have to set samplerate before enable audio play 。*/
LCD_Txt_Set_YX(TIM_DIS_LINE,0);
LCD_Printf("PLAYTIME :");
LCD_Txt_Display();
LCD_BMP( 0,0,15,15,icon_folder);
LCD_BMP( 0,3*16,15,3*16+15,icon_music_red);
//播放前先填充满缓冲区
WAV_Fill_PCM_Buf(&file,&head);
eof=0;oldtime=-1;
pcm_send_data=0;
sync_lrck=1;
ENABLE_AUDIO;
while(eof==0)
{
if(key_right||key_left||key_up ||key_up_long)
{
DISABLE_AUDIO;
f_close(&file);
if(nowtime>10 && key_left){key_left=0;goto INIT_PLAY_WAV;}
return 0;
}
//检测并重填缓冲区
WAV_Check_PCM_Buf_And_Refill(&file,&eof,&head);
//更新时间显示
WAV_TimeUpdate(&file,&head);
//暂停<->播放 pause<->play
if(key_play)
{
key_play=0;
if(pause_play==0)
{
pause_play=1;
DISABLE_AUDIO;
LCD_PutString(200,(TIM_DIS_LINE)*16,"PAUSE",RED,BLACK);
}
else
{
LCD_PutString(200,(TIM_DIS_LINE)*16," ",RED,BLACK);
pause_play=0;
pcm_buf[now_buf].ptr &= 0xfffe;
sync_lrck=1;
ENABLE_AUDIO;
}
}
//暂停状态时跳动显示"PAUSE"字符
if(pause_play)
{
pause_disp++;
if(pause_disp==PAUSE_DISP_TIME)
LCD_PutString(200,(TIM_DIS_LINE)*16," ",RED,BLACK);
if(pause_disp>=2*PAUSE_DISP_TIME)
{
pause_disp=0;
LCD_PutString(200,(TIM_DIS_LINE)*16,"PAUSE ",RED,BLACK);
}
}
}
//等待剩余数据发送完
for(eof=0;;)
{
for(i=0;i<PCM_BUFFER_NUM;i++)
if(pcm_buf.ptr>=pcm_buf.size)eof++;
if(eof>=PCM_BUFFER_NUM)break;
}
DISABLE_AUDIO;
f_close(&file);
return 0;
}
但我省略了快进部分代码贴出来,对playWAV()里面的运作过程就是不太明白,既然是从SPI,应该有接受到主MEGA48发出信号,才送出信号,但为什么在这函数里面没有检测,如何把WAV送到SPI2上面的呢?还有比如INIT_PLAY_WAV作用是什么;不知道在那里定义。没有找到!DISABLE_AUDIO ENABLE_AUDIO; 我在commone.h里面找到定义,只是SPI发送一个指令?这个指令到底什么作用 到底那个部分说明了把数据传到spi口,怎么好像没有找到这部分的命令,另外PCM_BUM 是定义为SPI的数据寄存器吗的地址吗?怎么我没有找到的!
也上问题请楼主帮忙解答,小弟万分感激 |
|