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

📄 audiocontrol.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:

    }
    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 + -