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

📄 audiocontrol.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:
* 函数描述:  开始播放
* 入口参数:  无
* 出口参数:  无
* 返回值:    无
* 注释:      加入媒体库和资源管理器后需修改
***************************************************************************/

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