📄 audiocontrol.c
字号:
}
ENTER_CRITICAL();
AudioPlayState = Audio_State_Stop;
EXIT_CRITICAL();
Codec_DACMute();
I2sStop();
HDMA_Stop(0);
CloseTrack();
AviOpenTrackFlag = 0;
return TRUE;
}
/**************************************************************************
* 函数描述: 音频快进
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE/FALSE
* 注释:
***************************************************************************/
BOOLEAN AudioFFD(unsigned long StepLen)
{
//依传入的参数快退
if (Audio_State_Stop == AudioPlayState)
return TRUE;
if (Audio_State_FFW != AudioPlayState)
{
Codec_DACMute();
//I2sStop();
AudioPlayState = Audio_State_FFW;
RockOSSendMsg(MBGUI, AS_AUGU_UpdateState, NULL);
}
pAudioRegKey->CurrentTime = (pAudioRegKey->CurrentTime > StepLen) ? (pAudioRegKey->CurrentTime - StepLen) : 0;
CodecSeek(pAudioRegKey->CurrentTime, 0);
//CodecGetTime(&pAudioRegKey->CurrentTime);
RockOSSendMsg(MBGUI, AS_AUGU_UpdateTime, NULL);
return TRUE;
}
/**************************************************************************
* 函数描述: 音频快退
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE/FALSE
* 注释:
***************************************************************************/
BOOLEAN AudioFFW(unsigned long StepLen)
{
//依传入的参数快进
if (Audio_State_Stop == AudioPlayState)
return TRUE;
if (Audio_State_FFD != AudioPlayState)
{
Codec_DACMute();
//I2sStop();
AudioPlayState = Audio_State_FFD;
RockOSSendMsg(MBGUI, AS_AUGU_UpdateState, NULL);
}
pAudioRegKey->CurrentTime = (pAudioRegKey->CurrentTime < pAudioRegKey->TotalTime - StepLen) ? (pAudioRegKey->CurrentTime + StepLen) : pAudioRegKey->TotalTime;
CodecSeek(pAudioRegKey->CurrentTime, 0);
//CodecGetTime(&pAudioRegKey->CurrentTime);
RockOSSendMsg(MBGUI, AS_AUGU_UpdateTime, NULL);
return TRUE;
}
/**************************************************************************
* 函数描述: 任意位置播放
* 入口参数: 无
* 出口参数: 无
* 返回值: TRUE/FALSE
* 注释: 用于触摸屏和断点播放
***************************************************************************/
BOOLEAN AudioSetPosition(unsigned long Desti_Posi)
{
CodecSeek((Desti_Posi > pAudioRegKey->TotalTime) ? pAudioRegKey->TotalTime : Desti_Posi, 0);
return TRUE;
}
/**************************************************************************
* 函数描述: 设置AB复读起点
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void AudioSetAB_A()
{
//.1设置复读起点
AudioPlayInfo.ABRequire = Audio_AB_A;
AudioPlayInfo.AudioABStart = pAudioRegKey->CurrentTime;
}
/*设置幅度终点并启动复读*/
/**************************************************************************
* 函数描述: 设置复读终点并启动复读
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void AudioSetAB(void)
{
//.1设置复读终点
if (AudioPlayInfo.ABRequire == Audio_AB_A)
{
AudioPlayInfo.AudioABEnd = pAudioRegKey->CurrentTime;
AudioPlayInfo.ABRequire = Audio_AB_PLAY;
//.2快退到起点,并播放
#if 1
#if defined( BOARD )
MlcRefreshHook();
#endif
I2sStop();
HDMA_Stop(0);
AudioFFD((pAudioRegKey->CurrentTime - AudioPlayInfo.AudioABStart));
AudioResume();
I2sStart(I2S_Start_Tx);
#else
RockOSSendMsg(MBAUDIO, AS_GUAU_FFD, (void*)(pAudioRegKey->CurrentTime - AudioPlayInfo.AudioABStart));
//AudioFFD(pAudioRegKey->CurrentTime-AudioPlayInfo.AudioABStart);
RockOSSendMsg(MBAUDIO, AS_GUAU_Resume, NULL);
#endif
}
}
/**************************************************************************
* 函数描述: 停止复读
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释:
***************************************************************************/
void AudioABStop()
{
//.1清空复读相关变量
AudioPlayInfo.ABRequire = Audio_AB_NULL;
//.2从当前位置开始播放
}
/**************************************************************************
* 函数描述: 停止复读
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
* 注释: 每次EQ 改变后需要调用,Audio 初始化时也需要调用
***************************************************************************/
void AudioSetEQ(void)
{
switch (AudioIOBuf.EffectCtl.MSMode)
{
case Audio_LEQ:
ms_set_hv_enabled(0);
ms_set_bb_enabled(0);
ms_set_leq_enabled(1);
ms_set_bb_level(3);
break;
case Audio_BB:
ms_set_leq_enabled(0);
ms_set_hv_enabled(0);
ms_set_bb_enabled(1);
ms_set_bb_level(4);
break;
case Audio_3D:
ms_set_leq_enabled(0);
ms_set_bb_enabled(0);
ms_set_hv_enabled(1);
ms_set_bb_level(3);
ms_set_hv_spatialize(8);
ms_set_hv_width(8);
break;
default:
break;
}
EffectAdjust();
}
/*解码失败*/
BOOLEAN AudioDecError()
{
//.1分析error原因(出错or 结束)
//.2解码错:通知UI
// 结束:通知媒体库查找下一曲
return TRUE;
}
/**************************************************************************
* 函数描述: 音频在高优先级task中的线程
* 入口参数: id -- msg的id
msg -- 消息的内容
* 出口参数: 无
* 返回值: true/false
* 注释:
***************************************************************************/
extern SYS_FILE_INFO AudioFileInfo;//add by hzf
extern MUSIC_INFOS gMusicInfos;
BOOLEAN AudioHighTaskMsgCallBack(ROCK_MSG_ID id, void *msg)
{
BOOLEAN ret = TRUE;
unsigned long HoldOnTimeTemp;
switch (id)
{
case AS_AUAU_DecInit:
AudioDecInit((MY_FILE*)msg);
break;
case AS_AUAU_DecStart:
AudioStart();
HoldOnTimeTemp = HoldMusicTimeGet();
if (-1 != HoldOnTimeTemp)
CodecSeek(HoldOnTimeTemp, 0);
gMusicInfos.HoldMusicMode = 0;
break;
case AS_GUAU_Playing:
AudioPlay();
break;
case AS_GUAU_Pause:
AudioPause();
break;
case AS_GUAU_Resume:
AudioResume();
break;
case AS_GUAU_VideoAudioStop:
VideoAudioStop((int)msg);
break;
case AS_GUAU_Stop:
AudioStop((int)msg);
MusicHoldOnInforSave(pAudioRegKey->CurrentTime, &AudioFileInfo);
break;
case AS_GUAU_FFD:
{
AudioFFD((unsigned long)msg);
}
break;
case AS_GUAU_FFW:
{
AudioFFW((unsigned long)msg);
}
break;
case AS_GUAU_GetPosi:
CodecGetTime(&pAudioRegKey->CurrentTime);
break;
case AS_GUAU_SetPosi:
{
AudioSetPosition((unsigned long)msg);
}
break;
case AS_GUAU_ABPlay:
AudioSetAB();
break;
case AS_GUAU_ABSetA:
AudioSetAB_A();
break;
case AS_GUAU_ABStop:
AudioABStop();
break;
case AS_GUAU_VolumeSet:
AudioSetVolume();
break;
case AS_GUAU_EQSet:
if (msg)
RKmemcpy(&AudioIOBuf.EffectCtl, &pAudioRegKey->UserEQ, sizeof(tEffect));
AudioSetEQ();
break;
case AS_GUAU_FreSet:
break;
case AS_AUAU_DecError:
break;
case AS_AUGU_NEXTFILE:
{
if (Audio_State_Stop != AudioPlayState)
AudioStop(Audio_Stop_Force);
#if defined( BOARD )
MlcRefreshHook();
#endif
if (FALSE == AudioGetNextMusic((UINT32)msg))
break;
msg = NULL;
}
case AS_GUGU_FileValidate:
{
AudioMediaValidate(msg);
}
break;
case AS_GUGU_UnMute:
{
Codec_DACUnMute();
}
break;
default:
ret = FALSE;
break;
}
return ret;
}
void AudioSetRepeatModeOnce(unsigned char bSet)
{//BY CZS
//播放音乐后如果再进有音频的游戏,
//音频播放的模式会临时改成只播放一次,退出游戏再恢复原来的模式
if (pAudioRegKey != NULL)
{
if (bSet)
{
AudioLastRepeatMode = pAudioRegKey->RepeatMode;
pAudioRegKey->RepeatMode = Audio_Once;
}
else
{
pAudioRegKey->RepeatMode = AudioLastRepeatMode;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -