📄 audiocontrol.c
字号:
* 函数描述: 开始播放
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释: 加入媒体库和资源管理器后需修改
***************************************************************************/
void AudioStart(void)
{
AudioInitList();
AudioIOBuf.gAudioOutBufIndex = 0;// AUDIO_OUT_BUF_NUM;
AudioIOBuf.gAudioDecoderIndex = AUDIO_OUT_BUF_NUM - 1;
AudioIOBuf.gAudioOutBufIndex = 0;
AudioIOBuf.lOutLength = 2048;
AudioPlayState = Audio_State_Play;
RockOSSendMsg(MBGUI, AS_AUGU_UpdateState, NULL);
// AudioPlay();
memset(AudioIOBuf.PCMBuf, 0, AUDIO_OUT_BUF_NUM*AUDIO_OUT_BUF_LEN*2);
if (VideoPlaying == 0)
{
// 音效初始化
EffectInit();
//AudioIOBuf.EffectCtl.Mode = pAudioRegKey->EQType;
//AudioIOBuf.EffectCtl.MSMode = pAudioRegKey->MSEQType;
AudioSetEQ();
}
////////////////////////////////////////////////////////////
gAudioReq = 0;
AudioPlayInfo.PlayDirect = 1;
AudioHWInit();
I2sStart(I2S_Start_Tx);
AudioOutBufSwitch();
Codec_DACUnMute();
//080520,huangsl,音频 CACHE 命中测试语句.
//Cache_MeasureStart( CACHE_MEASURE_DATA );
// RockOSSendMsg(MBGUI,AS_AUGU_UpdateAll,NULL);
}
BOOLEAN VideoAudioStop(UINT16 ReqType);
/**************************************************************************
* 函数描述: 音频解码
解码下一祯
修正显示相关的全局变量,并通知ui更新
若在复读模式,检查是否播放到复读终点,然,发送AB消息
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE/FALSE
* 注释:
***************************************************************************/
#ifdef SPECTRUM
int SpectrumOutBuffer[128 * 2];
#endif
BOOLEAN AudioPlay()
{
static int cnt = 0;
UINT32 i;
short *outtmp, *outtmp1;
short *left, *right;
unsigned long cur_time = 0;
AUDIOLISTENTRY *LEntry;
DECLARE_CUP_SR;
if (Audio_State_Play != AudioPlayState)
return FALSE;
//ENTER_CRITICAL();
if (gAudioDecBufList.FreeList)
{
LEntry = (AUDIOLISTENTRY*)gAudioDecBufList.FreeList;
outtmp1 = outtmp = (short*)LEntry->BuffAddr;
//EXIT_CRITICAL();
}
else
{
//EXIT_CRITICAL();
return FALSE;
}
//.1解码下一祯
{
static int err_cnt = 0;
if ((0 == CodecDecode()) || ((!VideoPlaying) && (pAudioRegKey->CurrentTime == pAudioRegKey->TotalTime) && (0 < pAudioRegKey->CurrentTime)))
{//4出错返回,暂无纠错处理
err_cnt ++;
if (0 == VideoPlaying)
AudioStop(Audio_Stop_Normal);
//上面是谁添加的 修改请留下记号
else //the else is added By Vincent Hisung , Dec 25,2007
{
if (err_cnt == 5)
{
RockOSSendMsg(MBVIDEO, AS_GUVI_RealDisplayStart, NULL);
}
else if (err_cnt > 64)
{
err_cnt = 0;
#ifdef MOV_INCLUDE
MovSetAudioPlayEnd();
#endif
VideoAudioStop(0);
RealAudioErrorDeal();
}
return FALSE;
}
return FALSE;
}
else
{
err_cnt = 0;
}
}
CodecGetCaptureBuffer(&AudioIOBuf.pOutLeft, &AudioIOBuf.pOutRight, &AudioIOBuf.lOutLength);
//保存第一次有解码数据的BUFFER地址
//Bug Fix : OutLenth shoud more than zero :(
//Dec 12,2007 By Vincent Hisung
if ((isFirstDec == 0) && (AudioIOBuf.lOutLength > 0))
{
isFirstDec = 1;
FirstOutBuf = outtmp;
}
//nTick0 = RockGetNTick();
#if 0
for (i = 0;i < AudioIOBuf.lOutLength;i++)
{
*(outtmp++) = AudioIOBuf.pOutLeft[i];
*(outtmp++) = AudioIOBuf.pOutRight[i];
}
#else
i = AudioIOBuf.lOutLength;
left = AudioIOBuf.pOutLeft;
right = AudioIOBuf.pOutRight;
while (i--)
{
*(outtmp++) = *(left++);
*(outtmp++) = *(right++);
}
#endif
// 音效处理
if (0 == VideoPlaying)
EffectProcess(outtmp1, AudioIOBuf.lOutLength);
ENTER_CRITICAL();
LEntry = (AUDIOLISTENTRY*)gAudioDecBufList.FreeList;
if (LEntry->BuffAddr != outtmp1)
RKmemcpy(LEntry->BuffAddr, outtmp1, AudioIOBuf.lOutLength*2*sizeof(short));
SListAddEntryTail((SLIST*)&gAudioDecBufList);
EXIT_CRITICAL();
//频谱处理
#ifdef SPECTRUM
if ((0 == VideoPlaying))//&&(pAudioRegKey->DispContent == Audio_FreqChart)&&(FALSE == SysIdleGetState(SYS_LCD_OFF)))
{
if (SpectrumLoop == 0)
{
if (SpectrumCnt == 0)
memset(SpectrumBuf, 0, SPECTRUM_LINE_M*sizeof(unsigned short));
if (/*(pAudioRegKey->DispContent==Audio_FreqChart)&&*/(Audio_State_Play == AudioPlayState) && (SpectrumCnt < 3))
{
int i;
// 080104,huangsl,由于 里面使用了 r13 作为 临时寄存器,因此不能进行任务切换.
DECLARE_CUP_SR;
ENTER_CRITICAL();
//OSSchedLock();
Spectrum_fft_main(AudioIOBuf.pOutLeft, SpectrumOutBuffer);
//OSSchedUnlock();
EXIT_CRITICAL();
Spectrum_Norm((unsigned short*)SpectrumOutBuffer, pAudioRegKey->Samplerate);
for (i = 0;i < SPECTRUM_LINE_M;i++)
{
SpectrumBuf[i] = MAX(Spectrum_gLinePow[i], SpectrumBuf[i]);
}
SpectrumCnt++;
if (SpectrumCnt >= 3)
{
SpectrumLoop = SpectrumLoopTime;
RockOSSendMsg(MBGUI, AS_AUGU_UpdateFrequence, 0);
SpectrumCnt = 0;
}
}
}
if (SpectrumLoop > 0)
SpectrumLoop-- ;
}
#endif
AudioFindValidateFile = TRUE;
//.2修正显示相关的全局变量,并通知ui更新
if (pAudioRegKey)
{
CodecGetTime(&cur_time);
if (cur_time - pAudioRegKey->CurrentTime > 1000)
{
pAudioRegKey->CurrentTime = cur_time;
RockOSSendMsg(MBGUI, AS_AUGU_UpdateTime, (void*)cur_time);
}
//.3若在复读模式,检查是否播放到复读终点,然,发送AB消息
if ((Audio_AB_PLAY == AudioPlayInfo.ABRequire) && (AudioPlayInfo.AudioABEnd <= cur_time))
{
//RockOSSendMsg(MBAUDIO,AS_GUAU_ABPlay,NULL);
AudioPlayInfo.ABRequire = Audio_AB_A;
AudioSetAB();
}
}
return TRUE;
}
/**************************************************************************
* 函数描述: 音频解码暂停
暂通过修改播放状态来暂停
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE/FALSE
* 注释:
***************************************************************************/
BOOLEAN AudioPause()
{
//.1清空音频解码DMA回调
if (Audio_State_Play == AudioPlayState)
{
DECLARE_CUP_SR;
//while(AudioIOBuf.gAudioOutBufIndex != AudioIOBuf.gAudioDecoderIndex);
//while(gAudioDmaState);
//while(((AudioIOBuf.gAudioOutBufIndex+3)%AUDIO_OUT_BUF_NUM) == AudioIOBuf.gAudioDecoderIndex)
ENTER_CRITICAL();
AudioPlayState = Audio_State_Pause;
EXIT_CRITICAL();
Codec_DACMute();
RockOSSendMsg(MBGUI, AS_AUGU_UpdateState, NULL);
}
//.2维持其他解码相关变量不变
return TRUE;
}
/**************************************************************************
* 函数描述: 音频解码恢复
修改播放状态
发送解码消息
启动DMA
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE/FALSE
* 注释:
***************************************************************************/
BOOLEAN AudioResume()
{
//.1启动dma
#if 0
if ((Audio_State_FFD == AudioPlayState) || (Audio_State_FFW == AudioPlayState))
{
memset(AudioIOBuf.PCMBuf, 0, AUDIO_OUT_BUF_NUM*AUDIO_OUT_BUF_LEN*2);
}
else if (Audio_State_Pause != AudioPlayState)
return FALSE;
#else
if ((Audio_State_Pause != AudioPlayState) && (Audio_State_FFD != AudioPlayState) && (Audio_State_FFW != AudioPlayState))
return FALSE;
RKmemset(AudioIOBuf.PCMBuf, 0, AUDIO_OUT_BUF_NUM*AUDIO_OUT_BUF_LEN*2);
#endif
AudioInitList();
Codec_DACUnMute();
AudioPlayState = Audio_State_Play;
RockOSSendMsg(MBGUI, AS_AUGU_UpdateState, NULL);
AudioOutBufSwitch();
return TRUE;
}
/**************************************************************************
* 函数描述: 音频解码结束
修改播放状态
关闭文件
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE/FALSE
* 注释:
***************************************************************************/
BOOLEAN AudioStop(UINT16 ReqType)
{
// UINT16 loop=0,cnt = 0;
//.1反初始化解码相关变量至启动状态
DECLARE_CUP_SR;
//080520,huangsl,音频 CACHE 命中测试语句,和 AudioStart里面对应,此处用于打印
//CACHE命中率.
#if 0
INT32U total, hit;
TB_FIXBMP *pfixBmp;
Cache_MeasureStop(&total , &hit);
pfixBmp = ToolBarGetFixBmpItem(3); // 3,状态栏测试部分.
//sprintf( (char*)pfixBmp->unitData , "%x:%x" , hit,total);
sprintf((char*)pfixBmp->unitData , "%02d%" , (hit / (total / 100)));
#endif
AudioStopCtl = 1;
if (Audio_State_Stop == AudioPlayState)
return FALSE;
if (Audio_State_Play == AudioPlayState)
while (gAudioDecBufList.UsedList);
if (0 == VideoPlaying)
{
if ((CurrentCodec == CODEC_MP3) && (pAudioRegKey->Samplerate > 44100))
PMU_ExitModule(PMU_MP3H);
else
PMU_ExitModule(Audio_PMU[CurrentCodec]);
}
AudioPlayInfo.ABRequire = Audio_AB_NULL;
ENTER_CRITICAL();
AudioPlayState = Audio_State_Stop;
EXIT_CRITICAL();
Codec_DACMute();
I2sStop();
HDMA_Stop(0);
CloseTrack();
EffectEnd(); // 音效结束
if (pRawFileCache) //防止播视频死机
{
FSFileClose((MY_FILE *) pRawFileCache); //文件操作或在外部进行 by Vincent
pRawFileCache = NULL;
}
if (Audio_Stop_Normal == ReqType)
{
RockOSSendMsg(MBAUDIO, AS_AUGU_NEXTFILE, (void*)(Audio_Direct_Forword | Audio_Stop_Normal));
}
RockOSSendMsg(MBGUI, AS_AUGU_UpdateState, NULL);
return TRUE;
}
BOOLEAN VideoAudioStop(UINT16 ReqType)
{
//.1反初始化解码相关变量至启动状态
UINT32 TimeOutCount;
DECLARE_CUP_SR;
AudioStopCtl = 1;
if (Audio_State_Stop == AudioPlayState)
return FALSE;
if (Audio_State_Play == AudioPlayState)
{
while (gAudioDecBufList.UsedList) //超时处理add by hzf 080508
{
if (++TimeOutCount > 5)
break;
DelayMs_nops(30);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -