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

📄 mp3_decode.c

📁 瑞芯微RK2608固件源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        if (MusicPlayInfo.Mode == MUSIC_DECODE_ONE) {
        //返回到资源管理器,选择当前歌曲
            Fun1MsgArray[0] = MSG_FUNCTION1_NONE;
            Fun1ModuleChange();
            Mp3ToBrowser(TO_CURRENT_FILE);
            return;
        }
        
        if ((MusicPlayInfo.RepMode == MUSIC_REPMODE_NORMAL) && (SysFile1Info.PlayedFileNum >= SysFile1Info.TotalFiles)) {
            Fun1MsgArray[0] = MSG_FUNCTION1_NONE;
            Fun1ModuleChange();
            
            if (MusicPlayInfo.Range == MSG_FIND_FILE_ALL) {
            //返回到资源管理器,选择第一首歌曲
                Mp3ToBrowser(TO_DEV_FIRST_FILE);
            } else {
            //返回到资源管理器,选择当前歌曲
                Mp3ToBrowser(TO_CURRENT_FILE);
            }
            return;
        }
        
        FileClose(hMainFile);
        if (Sys2InitFlag.bc.bLrcModuleInitEnable == 0) {
            Fun2MsgArray[0] = MSG_FUNCTION2_NONE;
            Fun2ModuleChange();
        }
        //ScrollStringDispDisable();
        PostFun1Message(MSG_FUNCTION1_FILE_FIND,MSG_FIND_MUSIC_FILE,MSG_FIND_FILE_NEXT,MusicPlayInfo.Range,MusicPlayInfo.Order/*,0,0,0*/);
    }
}
/*------------------------------------------------------------------------------
Function: MP3????????????
Input   : ??
Output  : ??
------------------------------------------------------------------------------*/
__attribute__((section(".mp3_text,\"ax\"")))
void MP3DecodeErrorProc(void)
{
    ClearPcmData();
    
    MP3DecodeErrorTimes ++;
    
    if(MP3DecodeBadFrameCount < 8) {
        MP3DecodeBadFrameCount = 0;
    }
}

__attribute__((section(".mp3_text,\"ax\"")))
void MP3DecodePlay(void)
{
    unsigned long MP3DecodeRerurnVal;
    unsigned int i,j;
    
    if((MusicPlayInfo.AB == MUSIC_DECODE_AB) && (MP3FileOffSet >= MP3FileOffSetB))
    {   /*AB End Position Check!*/
        MP3FileOffSet = MP3FileOffSetA;
        FileSeek(MP3FileOffSet, SEEK_SET, hMainFile);
        Mp3PlayFlag.bc.bMP3DecodeInit = 1;
        
        if (MP3DecodeBadFrameCount >= 8) {
            MusicCodecMute(1);
        }
        MP3DecodeBadFrameCount = 0;
    }
    
    if(Mp3PlayFlag.bc.bMP3DecodeInit)
    {
        Mp3PlayFlag.bc.bMP3DecodeInit = 0;
        
        MP3Obj.head_pkptr = (short *)(ApplicationInputBufferStart);
        MP3FrameParams.alloc=&alloc_table;
        MP3Obj.head_pack_state = 0;
        MP3Obj.head_totbit = 0;
        MP3DecodeInputBufWordsUsed = 0;
        MP3DecodeInputBufWordsRemaining = 0;
        MP3Obj.main_init=1;
        Mp3PlayFlag.bc.bMP3DecodeError = 0;
        MP3_Init_MP3(&MP3Obj);
    
        MusicPlayInfo.TimeGuageVal = (unsigned int)(MP3FileOffSet* TIME_GUAGE_CONST / SysFile1Info.Fdt.FileSize);
        
        MP3TimeGuageCount = (unsigned long)(MP3FileOffSet % (SysFile1Info.Fdt.FileSize / TIME_GUAGE_CONST));
        MusicDispFlag |= MUSIC_DISPFLAG_GUAGE;
        
        MP3TimeCount = (unsigned long)(MP3FileOffSet % (((unsigned long)(MusicPlayInfo.FirstBitrate) *125)/20));
        //GetMp3CurTime();
        Mp3CurrTimeSec = (unsigned long)(MP3FileOffSet / ((unsigned long)(MusicPlayInfo.FirstBitrate) *125));
    }
    //----------------------------------------------------------------------------------------------
    //MP3 Decode Main Loop 20051020
    if(Mp3PlayFlag.bc.bMP3DecodeEnable)
    {
        Mp3PlayFlag.bc.bBufferIndex = ~Mp3PlayFlag.bc.bBufferIndex;
        pMP3DecodeOutputBuf = FirstPCMOutAddress + Mp3PlayFlag.bc.bBufferIndex * PCM_OUT_BUF_LENGTH;
        
        MP3DecodeInputBufWordsUsed = MP3Obj.head_pkptr - (short *)(ApplicationInputBufferStart);
        if(MP3DecodeInputBufWordsUsed>MP3DecodeInputBufWordsRemaining) Mp3PlayFlag.bc.bMP3DecodeError = 1; //2005-10-9 fsh
        if(Mp3PlayFlag.bc.bMP3DecodeError == 1) MP3DecodeInputBufWordsUsed = 40;
        MP3DecodeInputBufWordsRemaining = MP3DecodeInputBufWordsRemaining - MP3DecodeInputBufWordsUsed;
        //----------------------------------------------------------------------
        for(i=0; i<MP3DecodeInputBufWordsRemaining; i++)
            ApplicationInputBufferStart[i] = ApplicationInputBufferStart[i + MP3DecodeInputBufWordsUsed];
            
        for( ; i < APPLICATION_INPUT_BUF_LENGTH; i++ )
            ApplicationInputBufferStart[i] = 0;
        //----------------------------------------------------------------------
        
        while(MP3DecodeInputBufWordsRemaining < MP3_DECODE_MAX_FRAME_LENGTH)/*MP3_DECODE_MAX_FRAME_LENGTH = 868*/
        {
            MP3DecodeRerurnVal = FileRead((unsigned char*)MP3DecodeTempReadoutBuf,512,hMainFile);
            MP3FileOffSet += MP3DecodeRerurnVal;
            MP3TimeCount += MP3DecodeRerurnVal;
            MP3TimeGuageCount += MP3DecodeRerurnVal;

            Byte2Word(ApplicationInputBufferStart+MP3DecodeInputBufWordsRemaining, MP3DecodeTempReadoutBuf, MP3DecodeRerurnVal >> 1);
            
            MP3DecodeInputBufWordsRemaining += (MP3DecodeRerurnVal >> 1); 
            
            if(MP3DecodeRerurnVal < 512)
            {   /*File End!*/
                PostFun1Message(MSG_FUNCTION1_MUSIC_MP3,MSG_FUNCTION1_MP3_END,0,0,0/*,0,0,0*/);
                MusicPlayInfo.TimeGuageVal ++;
                MusicDispFlag |= MUSIC_DISPFLAG_GUAGE;
                Mp3PlayFlag.bc.bMP3DecodeEnable = 0;
                break;
            }
        }
        
        MP3Obj.head_pkptr   = (short *)(ApplicationInputBufferStart);
        MP3Obj.head_totbit -= (MP3DecodeInputBufWordsUsed << 4);
        
        if(Mp3PlayFlag.bc.bMP3DecodeError == 1) 
        {
            Mp3PlayFlag.bc.bMP3DecodeError = 0;
            
            MP3Obj.head_pack_state = 0;
            MP3Obj.head_totbit = 0;
            MP3_Init_MP3(&MP3Obj);
        }
        if(MP3DecodeErrorTimes >= 100)
        {
            MP3DecodeErrorTimes =0;
            PostFun1Message(MSG_FUNCTION1_MUSIC_MP3,MSG_FUNCTION1_MP3_END,0,0,0/*,0,0,0*/);
            return;            
        }   
        
        MP3_FrameDecode(pMP3DecodeOutputBuf, &MP3FrameParams, &MP3Obj);
        switch(MP3FrameParams.MP3_ErrCode)
        {       
        case 0: 
            if(MP3DecodeBadFrameCount < 8)
            {
                if(++MP3DecodeBadFrameCount == 8)
                {
                    MusicCodecMute(0);
                }
            }
            FillPcmData();
            MP3DecodeErrorTimes = 0;
            if(MusicPlayInfo.Eq == MUSIC_DECODE_EQ_3D) 
            {   
                Mp3Dsurround(pPCMOutputBuf, PCMOutBufferLength ) ;//
            }

            if ((DisplayFlag == DISP_MUSIC) && (SystemInfo.bc.bBackLightStatus != 2) && (MusicPlayInfo.DispState != LRC_DISPLAY) && (StroboscopeCount >= 2))
            {   //100ms
                StroboscopeCount = 0;
                specline10((long *)pPCMOutputBuf,(short*)StroboscopeArray);
                MusicDispFlag |= MUSIC_DISPFLAG_SPECTRUM;
            }
            
            MP3DecodeRerurnVal = MP3_Decode_Freq_Tbl[MP3FrameParams.header.version][MP3FrameParams.header.sampling_frequency]; 
            
            if(MP3FrameParams.mpeg2_5==2) MP3DecodeRerurnVal = MP3DecodeRerurnVal >> 1; 
                
            if( MusicPlayInfo.Freq != MP3DecodeRerurnVal)
            {   /*Sampling Frequence*/
                MusicPlayInfo.Freq = MP3DecodeRerurnVal;
                Mp3SamplingFreqSet(MusicPlayInfo.Freq);
                Mp3CpuFreqSet(MusicPlayInfo.Freq);
            }
            
            if((MusicPlayInfo.Bitrate != MP3FrameParams.Bitrate ))
            {   /* Bitrate */
                MusicPlayInfo.Bitrate = MP3FrameParams.Bitrate;
                if(BitrateCount >= 8)
                {   //400ms
                    BitrateCount = 0;
                    MusicDispFlag |= MUSIC_DISPFLAG_BITRATE;
                }
            }
            break;
            
        case 1:
            MP3DecodeErrorProc();
            break;
        case 2:
            MP3Obj.main_init=1;
            MP3DecodeErrorProc();
            break;
            
      /*case 3:
        case 4:
        case 5:
        case 6:*/
        default:
            Mp3PlayFlag.bc.bMP3DecodeInit = 1;
            Mp3PlayFlag.bc.bMP3DecodeError = 1;
            MP3DecodeErrorProc();
            break;
        } 
    }
}
/*------------------------------------------------------------------------------
Function: MP3????????????
Input   : ??
Output  : ??
------------------------------------------------------------------------------*/
__attribute__((section(".mp3_text,\"ax\"")))
#if 0
void MP3DecodeTimeUpdate(void)
{
    unsigned long TempL;
    //----------------------------------------------------------------------------------------------
    //Time Update 20051020
    TempL = SysFile1Info.Fdt.FileSize / TIME_GUAGE_CONST;
    if(MP3TimeGuageCount >= TempL)
    {   /*Time Guage*/
        MP3TimeGuageCount -= TempL;
        MusicPlayInfo.TimeGuageVal ++;
        MusicDispFlag |= MUSIC_DISPFLAG_GUAGE;
    }
    
    TempL = (unsigned long)((MusicPlayInfo.FirstBitrate * 125)/20);
    if(MP3TimeCount >= TempL)
    {   //50ms
        MP3TimeCount -= TempL;
        BitrateCount ++ ;
        StroboscopeCount ++;
        if((++DecodeCount) >= 20) {
            DecodeCount = 0;
            Mp3CurrTimeSec ++;
            MusicDispFlag |= (MUSIC_DISPFLAG_CUR_TIME | MUSIC_DISPFLAG_FREE_TIME);
        }
    }
    
    if((MusicPlayInfo.Mode == MUSIC_DECODE_BROWSE) && (Mp3CurrTimeSec >= 10))
        PostFun1Message(MSG_FUNCTION1_MUSIC_MP3,MSG_FUNCTION1_MP3_END,0,0,0/*,0,0,0*/);
}
#else
void MP3DecodeTimeUpdate(void)
{
    unsigned long TempL;
    //----------------------------------------------------------------------------------------------
    //Time Update 20051020
    TempL = (MP3FileOffSet*TIME_GUAGE_CONST)/SysFile1Info.Fdt.FileSize;
    
    if(TempL != MusicPlayInfo.TimeGuageVal){
        MusicPlayInfo.TimeGuageVal = TempL;
        MusicDispFlag |= MUSIC_DISPFLAG_GUAGE;
    }
    
    TempL = (unsigned long)(MP3FileOffSet / ((unsigned long)(MusicPlayInfo.FirstBitrate) *125));
    
    if((Mp3CurrTimeSec != TempL)/* && (TempL <= Mp3Total)*/)
    {
        Mp3CurrTimeSec = TempL;
        MusicDispFlag |= (MUSIC_DISPFLAG_CUR_TIME | MUSIC_DISPFLAG_FREE_TIME);
    }

    if((MusicPlayInfo.Mode == MUSIC_DECODE_BROWSE) && (Mp3CurrTimeSec >= 10))
        PostFun1Message(MSG_FUNCTION1_MUSIC_MP3,MSG_FUNCTION1_MP3_END,0,0,0/*,0,0,0*/);
}
#endif
//******************************************************************************


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -