⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audioconsle.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -