[C] 纯文本查看 复制代码
if(os_evt_wait_or(0xFFFE, 0xFFFF) == OS_R_EVT)
{
xResult = os_evt_get ();
switch (xResult)
{
/* 如果启用emWin多任务的话,此位是被emWin多任务使用 */
case MusicTaskReserved_0:
break;
/* 实现快进快退 */
case MusicTaskAudioAdjust_1:
AUDIO_Pause();
MP3_TimeSet(fout, ptMP3);
/* 初始化部分变量 */
ptMP3->pReadPos = ptMP3->pInputBuf;
ptMP3->iBytesleft = fread(ptMP3->pInputBuf, 1, DecoderMP3BufSize, fout);
/* 获取3帧解码好的数据 */
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
memcpy(ptMP3->pI2SBuffer0, ptMP3->pI2STempBuff, MaxOutputBufSize);
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
memcpy(ptMP3->pI2SBuffer1, ptMP3->pI2STempBuff, MaxOutputBufSize);
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
AUDIO_Resume();
break;
/* 暂停 */
case MusicTaskAudioPause_2:
AUDIO_Pause();
break;
/* 继续 */
case MusicTaskAudioResume_3:
AUDIO_Resume();
break;
/* 此位暂未使用 */
case MusicTaskReserved_4:
break;
/* 开始播放 */
case MusicTaskAudioPlay_5:
/* 获取要播放mp3文件的相关信息 */
GetMP3TagInfo((uint8_t *)filename, ptMP3);
GetMP3DispInfo(ptMP3, &mp3FrameInfo);
/* mp3文件被打开标志设置 */
ucFileOpenFlag = 1;
/* 打开MP3音频文件*/
fout = fopen ((const char *)filename, "r");
fseek(fout, ptMP3->uiFrameStart, SEEK_SET);
MP3_TimeShow(fout, ptMP3);
/* 初始化部分变量 */
ptMP3->pReadPos = ptMP3->pInputBuf;
ptMP3->iBytesleft = fread(ptMP3->pInputBuf, 1, DecoderMP3BufSize, fout);
/* 初始化Helix MP3解码器 */
mp3Decoder = MP3InitDecoder();
/* 获取3帧解码好的数据 */
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
memcpy(ptMP3->pI2SBuffer0, ptMP3->pI2STempBuff, MaxOutputBufSize);
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
memcpy(ptMP3->pI2SBuffer1, ptMP3->pI2STempBuff, MaxOutputBufSize);
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
/* 初始化SAI音频接口进行播放 */
AUDIO_Init(1, I2S_Standard_Phillips, SAI_DataSize_16b, ptMP3->uiSamplerate, mp3FrameInfo.nChans);
Play_DMA_Init(ptMP3->pI2SBuffer0, ptMP3->pI2SBuffer1, ptMP3->usOutsamples);
AUDIO_Play();
break;
/* 退出音频播放 */
case MusicTaskAudioReturn_6:
AUDIO_Stop();
if(fout != NULL)
{
fclose (fout);
}
MP3FreeDecoder(mp3Decoder);
os_free_mem(AppMalloc, ptMP3->pI2STempBuff);
os_free_mem(AppMalloc, ptMP3->pI2SBuffer1);
os_free_mem(AppMalloc, ptMP3->pI2SBuffer0);
os_free_mem(AppMalloc, ptMP3->pInputBuf);
os_free_mem(AppMalloc, ptMP3);
return;
/* 获取歌曲播放时间 */
case MusicTaskAudioGetTime_7:
if(ucFileOpenFlag == 1)
MP3_TimeShow(fout, ptMP3);
break;
/* 开始播放,歌曲切换下一曲使用 */
case MusicTaskAudioStart_8:
/* 获取要播放mp3文件的相关信息 */
GetMP3TagInfo((uint8_t *)filename, ptMP3);
GetMP3DispInfo(ptMP3, &mp3FrameInfo);
/* mp3文件被打开标志设置 */
ucFileOpenFlag = 1;
/* 打开MP3音频文件*/
fout = fopen ((const char *)filename, "r");
fseek(fout, ptMP3->uiFrameStart, SEEK_SET);
MP3_TimeShow(fout, ptMP3);
/* 初始化部分变量 */
ptMP3->pReadPos = ptMP3->pInputBuf;
ptMP3->iBytesleft = fread(ptMP3->pInputBuf, 1, DecoderMP3BufSize, fout);
/* 初始化Helix MP3解码器 */
mp3Decoder = MP3InitDecoder();
/* 获取3帧解码好的数据 */
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
memcpy(ptMP3->pI2SBuffer0, ptMP3->pI2STempBuff, MaxOutputBufSize);
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
memcpy(ptMP3->pI2SBuffer1, ptMP3->pI2STempBuff, MaxOutputBufSize);
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
/* 初始化SAI音频接口进行播放 */
AUDIO_Init(1, I2S_Standard_Phillips, SAI_DataSize_16b, ptMP3->uiSamplerate, mp3FrameInfo.nChans);
Play_DMA_Init(ptMP3->pI2SBuffer0, ptMP3->pI2SBuffer1, ptMP3->usOutsamples);
AUDIO_Play();
AUDIO_Pause();
break;
/* 当前使用的是缓冲0,填充缓冲1,并通过64点FFT实行频谱显示 */
case MusicTaskAudioFillBuffer1_9:
VedioSynCount--;
if(hWinMusic != WM_HWIN_NULL)
{
DSP_FFT64(ptMP3->pI2SBuffer0);
}
MP3_FillAudio((uint16_t *)ptMP3->pI2SBuffer1,
(uint16_t *)ptMP3->pI2STempBuff,
mp3FrameInfo.outputSamps);
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
break;
/* 当前使用的是缓冲1,填充缓冲0,并通过64点FFT实行频谱显示 */
case MusicTaskAudioFillBuffer0_10:
VedioSynCount--;
if(hWinMusic != WM_HWIN_NULL)
{
DSP_FFT64(ptMP3->pI2SBuffer1);
}
MP3_FillAudio((uint16_t *)ptMP3->pI2SBuffer0,
(uint16_t *)ptMP3->pI2STempBuff,
mp3FrameInfo.outputSamps);
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
break;
/*
早期设计的时候,为了防止视频播放任务一直占用文件系统,导致音频的DMA的
双缓冲都发消息过来,现在的版本进入这个消息的概率极小了。
*/
case MusicTaskWaitBuffer:
#if 0 /* 这种方式有时候会多计算一次 */
printf_MP3dbg("count = %d, ddd = %x\r\n", count, xResult);
xResult = 0;
while(os_sem_wait (&SemaphoreVedio, 0) == OS_R_OK)
{
xResult++;
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
}
printf_MP3dbg("count = %d, ddd = %x\r\n", count, xResult);
count = 0;
#else
printf_MP3dbg("count = %d, ddd = %x\r\n", VedioSynCount, xResult);
uiTempCount = VedioSynCount;
VedioSynCount = 0;
for(i = 0; i < uiTempCount; i++)
{
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
}
/* 防止同步的过程中,count被改变,再进行一次 */
for(i = 0; i < VedioSynCount; i++)
{
GetMP3DecoderData(fout, ptMP3->pI2STempBuff, &mp3FrameInfo, mp3Decoder, ptMP3);
}
printf_MP3dbg("count = %d, ddd = %x\r\n", VedioSynCount, xResult);
VedioSynCount = 0;
#endif
break;
/* 后5位暂未使用 */
default:
printf("xResult = %x\r\n", xResult);
break;
}
}