📄 audioconsle.c
字号:
RockOSSendMsg(MBAUDIO, AS_AUAU_DecInit, (void*)handle);
}
else
{
RockOSSendMsg(MBGUI, AS_AUGU_ReportErr, Audio_Err_OpenFile);
}
AudioErrFileSetbit(AudioFileInfo.CurrentFileNum - 1, AudioFileScanFlag);
//RKFSFileRead(buffer,10,handle);
//若失败,查询媒体库,若媒体库也没有有效文件,则宣布失败
}
BOOLEAN AudioErrFileChkbit(UINT16 bit, char* flagBuf)
{
char* p2res = &flagBuf[bit>>3];
return *p2res&(1 << (bit % 8)) ? 1 : 0;
}
BOOLEAN AudioAllFileScaned(UINT16 Total, char* flagBuf)
{
UINT16 cnt = 0;
for (;cnt < Total;cnt++)
{
if (FALSE == AudioErrFileChkbit(cnt, flagBuf))
return FALSE;
}
return TRUE;
}
void AudioErrFileSetbit(int bit, char* flagBuf)
{
char* p2res = &flagBuf[bit>>3];
*p2res |= 1 << (bit % 8);
}
/**************************************************************************
* 函数描述: 音频获取一个限定范围内的随机数
* 入口参数: Max -- 限定范围
* 出口参数: 无
* 返回值: 暂定文件指针
* 注释:
***************************************************************************/
void AudioGetRandNum(UINT16 Direct)
{
UINT16 i;
srand(RockGetRamdom());
if (MAX_AUDIO_FILES < AudioFileInfo.TotalFiles)
AudioFileInfo.TotalFiles = MAX_AUDIO_FILES;
AudioFileInfo.CurrentFileNum = rand() % AudioFileInfo.TotalFiles;
if (FALSE == AudioAllFileScaned(AudioFileInfo.TotalFiles, AudioFileScanFlag))
{
if (AudioErrFileChkbit(AudioFileInfo.CurrentFileNum, AudioFileScanFlag))
AudioFileInfo.CurrentFileNum = 0;
while ((AudioFileInfo.CurrentFileNum < AudioFileInfo.TotalFiles) && AudioErrFileChkbit(AudioFileInfo.CurrentFileNum, AudioFileScanFlag))
AudioFileInfo.CurrentFileNum++;
}
AudioFileInfo.CurrentFileNum++;
return;
}
/**************************************************************************
* 函数描述: 音频获取一个限定方向的顺序数
* 入口参数: Max -- 限定范围
* 出口参数: 无
* 返回值: 暂定文件指针
* 注释:
***************************************************************************/
void AudioGetNextNum(UINT16 Direct)
{
if (Direct)
{
if (++AudioFileInfo.CurrentFileNum > AudioFileInfo.TotalFiles)
AudioFileInfo.CurrentFileNum = 1;
}
else
{
if (0 == --AudioFileInfo.CurrentFileNum)
AudioFileInfo.CurrentFileNum = AudioFileInfo.TotalFiles;
}
return;
}
/**************************************************************************
* 函数描述: 音频获取下一曲文件
* 入口参数: Direction -- 选曲方向
* 出口参数: 无
* 返回值: bool 返回true 可以播放,false停止播放
* 注释:
***************************************************************************/
BOOLEAN AudioGetNextMusic(UINT32 msg)
{
AUDIOGETNUM AudioGetNum = (AUDIOGETNUM)((Audio_Rand == pAudioRegKey->PlayMode) ? AudioGetRandNum : AudioGetNextNum);
UINT16 Direct = (UINT16)(msg >> 8);
UINT16 ReqType = (UINT16)(msg & 0xff);
BOOLEAN ret = TRUE;
if ((Audio_Stop_Force == ReqType) && (AudioAllFileScaned(AudioFileInfo.TotalFiles, AudioFileScanFlag)))
RKmemset(AudioFileScanFlag, 0, MAX_FLAG_MEMO);
switch (pAudioRegKey->RepeatMode)
{
case Audio_Repeat://单曲重复
if (Audio_Stop_Force == ReqType)
{
AudioGetNum(Direct);
AudioFindValidateFile = FALSE;
}
else
{
if (FALSE == AudioFindValidateFile)
{
ret = FALSE;
}
}
break;
case Audio_Try:
case Audio_AllOnce:
{
if (AudioAllFileScaned(AudioFileInfo.TotalFiles, AudioFileScanFlag))
{
ret = FALSE;
break;
}
AudioGetNum(Direct);
}
break;
case Audio_AllRepeat:
{
if (AudioAllFileScaned(AudioFileInfo.TotalFiles, AudioFileScanFlag) && (FALSE == AudioFindValidateFile))
{
ret = FALSE;
break;
}
AudioGetNum(Direct);
}
break;
case Audio_Once:
if (Audio_Stop_Force == ReqType)
{
AudioGetNum(Direct);
ret = TRUE;
break;
}
return FALSE;
default:
ret = FALSE;
break;
}
#if(SD_CARD_EN)
if (AudioFileInfo.Path[0] == 'E')
{
DelayMs_nops(56);//等待卡检测timer5ms
if (FALSE == SDCardInsert)
{
AudioFileInfo.CurrentFileNum = 0;
RockOSSendMsg(MBGUI, AS_AUGU_ReportErr, Audio_Err_OpenFile);
return FALSE;
}
}
#endif
if (ret)
ret = AudioFileInfo.callback(&AudioFileInfo, AudioFileInfo.CurrentFileNum, FILE_ATTR_TYPE_MUSIC);
if ((0 == ret) && (0 == AudioFileInfo.TotalFiles))
{
AudioFileInfo.CurrentFileNum = 0;
RockOSSendMsg(MBGUI, AS_AUGU_ReportErr, Audio_Err_OpenFile);
return FALSE;
}
RockOSSendMsg(MBGUI, AS_AUGU_UpdateState, NULL);
return ret;
}
/**************************************************************************
* 函数描述: 音频模块在gui任务中的进程,负责接受任务间与音频相关的消息
* 入口参数: id -- msg的唯一标识
msg -- 消息的内容
* 出口参数: 无
* 返回值: true/false
* 注释:
***************************************************************************/
BOOLEAN AudioNormalTaskMsgCallBack(ROCK_MSG_ID id, void *msg)
{
switch (id)
{
case AS_GUGUI_STARTCONSOLE:
{//4后台播放必要的初始化工作
if (Audio_State_Stop != AudioPlayState)
RockOSSendMsg(MBAUDIO, AS_GUAU_Stop, (void*)Audio_Stop_Force);
AudioConsoleStart(msg);
RockOSSendMsg(MBAUDIO, AS_GUGU_FileValidate, msg);
}
break;
case AS_GUGUI_SHUTCONSOLE:
{//4停止后台播放反初始化
AudioConsoleShutDown();
}
break;
case AS_AUGU_UpdateFrequence:
{
if (AudioWinShow)
WindowSendMessage(pAudioWin, WM_UIUpdate, (WMPARAM)id, msg);
}
break;
case AS_AUGU_UpdateAll:
{
//if(AudioWinShow)
WindowSendMessage(pAudioWin, WM_UIUpdate, (WMPARAM)id, msg);
}
break;
case AS_AUGU_ReportErr:
{
if (((FALSE == AudioFindValidateFile) && AudioAllFileScaned(AudioFileInfo.TotalFiles, AudioFileScanFlag)) || (Audio_Err_OpenFile == (UINT32)msg))
{
/*dialog*/
WindowDestroy(pAudioWin);
//break;
}
//if(AudioWinShow)
{
WINDOW* DialogWin = WindowFindByIDAll(WID_AudioDialog);
if (DialogWin)
WindowDestroy(DialogWin);
WindowCreateDilog(WindowGetFocusWin(),
0,
WID_AudioDialog,
50, 70,
170, 100,
SID_Box_Play_Error,//SID_Txt_Warn,
BID_DilogBack76_70,
NULL,
WinDilogProcMap,
NULL);
}
RockOSSendMsg(MBAUDIO, AS_AUGU_NEXTFILE, (void*)(AudioPlayInfo.PlayDirect << 8));
}
break;
case AS_AUGU_UpdateTime:
//if(AudioWinShow)
{
//浏览播放时间到,播下一曲。原来用系统timer,误差太大,不可靠,改由这里控制
if ((Audio_Try == pAudioRegKey->RepeatMode) && ((AUDIOTRYTIME + 1)*1000 <= pAudioRegKey->CurrentTime))
RockOSSendMsg(MBAUDIO, AS_GUAU_Stop, Audio_Stop_Normal);
}
//No break;
case AS_AUGU_UpdateState:
if (AudioWinShow)
{
//考虑到部分vbr时间获取不准确,在播放结束后强制刷一次时间,保证显示上一致
if (Audio_State_Stop == AudioPlayState)
pAudioRegKey->CurrentTime = pAudioRegKey->TotalTime;
WindowSendMessage(pAudioWin, WM_UIUpdate, (WMPARAM)id, msg);
}
break;
default:
return FALSE;
}
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -