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

📄 mp3_initial.c

📁 瑞芯微RK2608固件源代码
💻 C
字号:
//////////////////////////////////////////////////////////////////////////
//  Copyright (C),2004-2005, Fuzhou Rockchip Co.,Ltd.
//  File name :     mp3_initial.c
//  Author:         Jiliu Huang
//  Description:    
//  Others:         
//  Function list:  
//  History:        
//           <author>      <time>     <version>       <desc>
//           Jiliu Huang  05/09/17      1.0           ORG
//
/////////////////////////////////////////////////////////////////////////
#define _IN_MP3INITIAL

#include <Creg.h>
#include "Memap.h"
#include "Macro.h"
#include "Global.h"
#include "MsgDef.h"
#include "Resource.h"
#include "Mp3DecodeGlobal.h"

#include "Config.h"
#include "Message.h"
#include "id3_rock.h"

//extern  short filemp3iden(short startpointer,long* mp3filesampling,short* mp3filebitrate);
extern short filemp3iden(int *startpointer,unsigned long* mp3filesampling,unsigned int* mp3filebitrate);
    //-------------------------------------------------------
    //only for test
extern  unsigned char FileOpenErrString[]   ;//__attribute__((section(".wma_data,\"aw\"")))= "FILE OPEN ERROR!";
extern  unsigned char FileSizeErrString[]   ;//__attribute__((section(".wma_data,\"aw\"")))= "FILE SIZE ERROR!";
extern  unsigned char FileFormatErrString[] ;//    __attribute__((section(".wma_data,\"aw\"")))= "FILE FORMAT ERROE!";

//******************************************************************************
/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".mp3_text,\"ax\"")))
void ParseMp3Id3(unsigned int * Id3Part,unsigned int size)
{
  
    unsigned int i,k=size;
	  while(k>=0)
	  {
	   if(Id3Part[k] != 0x0020 && Id3Part[k] != 0x0000)break;
	   //else Id3Info.id3_album[k] = 0x0000;//rock@20061026 解决ID3显示为空的问题
	   k--;
	  }
		 Id3Part[k+1] = 0x0000;
  
		if((Id3Part[0]!=0xFF)&&(Id3Part[0]!=0xFE)){
		  TxtGbk2Unicode(Id3Part, Id3Part,1);
		  Id3Part[size]=0;
		}else{
			for(i=0;i<size;i++)
			{
			Id3Part[i] = Id3Part[2 + 2*i] + (Id3Part[3 + 2*i]<<8);
			}
			Id3Part[size]=0;
		}
}


/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".mp3_text,\"ax\"")))
void Mp3DisplayModeInit(void)
{
    int i;
    
    //ScrollStringDispDisable();
    
    if (Fun2MsgArray[0] == MSG_FUNCTION2_LRC) {
        Fun2MsgArray[0] = MSG_FUNCTION2_NONE;
        Fun2ModuleChange();
    }
    
    MusicDispFlag &= ((~MUSIC_DISPFLAG_PATH) & (~MUSIC_DISPFLAG_FILENAME) & (~MUSIC_DISPFLAG_SPECTRUM) & (~MUSIC_DISPFLAG_ID3) & (~MUSIC_DISPFLAG_LRC));
    
    if (MusicPlayInfo.DispState == MUSIC_DISPLAY) {
        MusicDispFlag |= (MUSIC_DISPFLAG_PATH | MUSIC_DISPFLAG_FILENAME | MUSIC_DISPFLAG_SPECTRUM);
        
        AVI_MP3_DECODE_DISABLE;
        for(i = 21; i >= 0; i--) *(StroboscopeArray + i) = 0;
        AVI_MP3_DECODE_ENABLE;
        
    } else {
        if (Mp3PlayFlag.bc.bMp3LrcHave == 1) {
            memcpy(SysFile2Info.Path , SysFile1Info.Path ,(3 + MAX_DIR_DEPTH*12 + 1) );
            memcpy(SysFile2Info.Fdt.Name , /*SysFile1Info.Fdt.Name*/Mp3LrcFileName ,8);
            SysFile2Info.Fdt.Name [8] = 'L';
            SysFile2Info.Fdt.Name [9] ='R';
            SysFile2Info.Fdt.Name [10] ='C';
            PostFun2Message(MSG_FUNCTION2_LRC,MSG_FUNCTION2_LRC_INIT,0,0,0/*,0,0,0*/); 
        } else {
            MusicPlayInfo.DispState = MusicPlayInfo.DispMode;
            MusicDispFlag |= MUSIC_DISPFLAG_SPECTRUM;
        }
        
        if (Mp3PlayFlag.bc.bMp3Id3Have == 1) {
            MusicDispFlag |= MUSIC_DISPFLAG_ID3;
        } else {
            MusicDispFlag |= (MUSIC_DISPFLAG_PATH | MUSIC_DISPFLAG_FILENAME);
        }
    }
}

/*------------------------------------------------------------------------------
Function:
Input:
Output:
------------------------------------------------------------------------------*/
__attribute__((section(".mp3_text,\"ax\"")))
void MP3DecodeHead(void)
{    
    int            i,j;
    int            FindFileResult;
    short          mp3fileyesno;
    unsigned int   FileNameLen;
    unsigned short wordreadout;
    unsigned long  Id3Size;
    unsigned long  nums_while;
    SYS_FILE_INFO  SysFileInfoTemp;
    
{//-------------------------Mp3 Variable Init----------------------------------
    MusicPlayInfo.Bitrate = 128;
    MusicPlayInfo.Freq = 44100;
    Mp3PlayStatus = MusicPlayInfo.PlayState;
    
    Mp3CurrTimeSec = 0;
    Mp3TotalTimeSec = 0;
    Mp3PlayFlag.word = 0;
    
    MusicPlayInfo.AB = MUSIC_DECODE_ABOFF;
    MusicPlayInfo.DispState = MusicPlayInfo.DispMode;
    
    if(MusicDisplayInterface == 1) {
        MusicDisplayInterface = 0;
        MusicDispFlag = (MUSIC_DISPFLAG_BACKGROUND | MUSIC_DISPFLAG_HOLD | MUSIC_DISPFLAG_BATT |
                         MUSIC_DISPFLAG_FILENUM | MUSIC_DISPFLAG_BITRATE | MUSIC_DISPFLAG_EQ | MUSIC_DISPFLAG_AB |
                         MUSIC_DISPFLAG_CUR_TIME | MUSIC_DISPFLAG_GUAGE | MUSIC_DISPFLAG_VOL | 
                         MUSIC_DISPFLAG_MODE | MUSIC_DISPFLAG_STATUS | MUSIC_DISPFLAG_ORDER);
    } else {
        MusicDispFlag = (/*MUSIC_DISPFLAG_BACKGROUND | MUSIC_DISPFLAG_HOLD | MUSIC_DISPFLAG_BATT |*/
                         MUSIC_DISPFLAG_FILENUM | MUSIC_DISPFLAG_BITRATE | /*MUSIC_DISPFLAG_EQ |*/MUSIC_DISPFLAG_AB |
                         MUSIC_DISPFLAG_CUR_TIME | MUSIC_DISPFLAG_GUAGE | /*MUSIC_DISPFLAG_VOL |*/
                         MUSIC_DISPFLAG_MODE | MUSIC_DISPFLAG_STATUS/* | MUSIC_DISPFLAG_ORDER*/);
    }
}

{//------------------------Check Mp3 File Head---------------------------------
    if ((hMainFile = FileOpen(SysFile1Info.Path, SysFile1Info.Fdt.Name, "R")) == NOT_OPEN_FILE) {
        MP3FileFormatError = 1;
        PostFun1Message(MSG_FUNCTION1_MUSIC_MP3,MSG_FUNCTION1_MP3_NONE,0,0,0/*,0,0,0*/);
        return;
    }
    wordreadout = FileRead((unsigned char *)MP3DecodeTempReadoutBuf, 512,hMainFile);
    Id3Size = 0;
    if((MP3DecodeTempReadoutBuf[0] == 0x0049) && (MP3DecodeTempReadoutBuf[1] == 0x0044))
    {
        Id3Size = (((unsigned long)(MP3DecodeTempReadoutBuf[6]) & 0x007f) << 21/*0x200000*/)
                + (((unsigned long)(MP3DecodeTempReadoutBuf[7]) & 0x007f) << 10/*0x400*/)
                + (((unsigned long)(MP3DecodeTempReadoutBuf[8]) & 0x007f) << 7/*0x80*/)
                +  ((unsigned long)(MP3DecodeTempReadoutBuf[9]) & 0x007f) + 10;
    }
    
    FileSeek(Id3Size, SEEK_SET, hMainFile);
    
    nums_while = 0;
    do {
        for(i=0; i<6; i++){
            if (512 > (wordreadout = FileRead((unsigned char *)MP3DecodeTempReadoutBuf, 512,hMainFile)))
                break;
            for(j = 0; j < 256; j += 1)
                ApplicationInputBufferStart[(i<<8)+j] = ((MP3DecodeTempReadoutBuf[j<<1] << 8)| (MP3DecodeTempReadoutBuf[(j << 1) + 1] ));
        }
        
        mp3fileyesno = filemp3iden(ApplicationInputBufferStart,&MusicPlayInfo.Freq,&MusicPlayInfo.Bitrate);
        nums_while ++ ;
        
		
        if (((Id3Size == 0) && (nums_while > 65535)) || (nums_while > 655) || (wordreadout < 512)/* || (times == 2)*/) {
            FileClose(hMainFile);
            MP3FileFormatError = 1;
            PostFun1Message(MSG_FUNCTION1_MUSIC_MP3,MSG_FUNCTION1_MP3_NONE,0,0,0/*,0,0,0*/);
            return; 
        }
    } while(mp3fileyesno != 0xff);
    
    MusicPlayInfo.FirstBitrate = MusicPlayInfo.Bitrate;
    if(MusicPlayInfo.FirstBitrate == 0) MusicPlayInfo.FirstBitrate = 128;
    GetLongFileName(SysFile1Info.LongFileName);
    GetDirLongPath(SysFile1Info.LongPath);
}

{//----------------------------Check ID3 Have----------------------------------
    FileSeek(0, SEEK_SET, hMainFile);
    for(i = 0; i < 8; i++) {
        if (512 > (wordreadout = FileRead((unsigned char*)MP3DecodeTempReadoutBuf, 512,hMainFile))) {
            FileClose(hMainFile);
            MP3FileFormatError = 1;
            PostFun1Message(MSG_FUNCTION1_MUSIC_MP3,MSG_FUNCTION1_MP3_NONE,0,0,0/*,0,0,0*/);
            return; 
        }
        for(j = 0; j < wordreadout/* >> 1*/; j += 1)        // 修正ID3信息显示错误
            ApplicationInputBufferStart[(i<<9)+j] = MP3DecodeTempReadoutBuf[j];
    }
    Find_ID3_TAG(&Id3Info,(short *)ApplicationInputBufferStart);
    //---------hjl 2006-12-21 16:45--------------------------------------------------
    ParseMp3Id3(Id3Info.id3_title,Id3Info.id3_title_size);
    ParseMp3Id3(Id3Info.id3_singer,Id3Info.id3_singer_size);
    ParseMp3Id3(Id3Info.id3_album,Id3Info.id3_album_size);
    //-----------------------------------------------------------

    //GetLongFileName(SysFile1Info.LongFileName);   // hjl 2006-12-21 16:23 移至FileModule.c中获取。

    FileSeek(0, SEEK_SET, hMainFile);
    MP3FileOffSet = 0;
    
    if(Id3Info.id3_check == 1) {
        Mp3PlayFlag.bc.bMp3Id3Have = 1;
//        Id3Info.id3_title[ID3_TAG_SIZE-1]=0;
//        Id3Info.id3_album[ID3_TAG_SIZE-1]=0;//rock@20061026 解决ID3显示为空的问题
//        Id3Info.id3_singer[ID3_TAG_SIZE-1]=0;
//        TxtGbk2Unicode(Id3Info.id3_title,Id3Info.id3_title, 1);
//        TxtGbk2Unicode(Id3Info.id3_album,Id3Info.id3_album, 1);
//        TxtGbk2Unicode(Id3Info.id3_singer,Id3Info.id3_singer, 1);
    }
}

{//-------------------------Check Lrc File Have--------------------------------
//    SysFileInfoTemp.Path[0] = '.';
//    SysFileInfoTemp.Path[1] = 0; 
    
    SysFileInfoTemp.TotalFiles = GetTotalFiles(SysFile1Info.Path,"LRC");
    Mp3LrcFileName[0] = 0 ;
    for(i = 0 ; i < MAX_FILENAME_LEN; i++) {
        if(SysFile1Info.LongFileName[i] == 0) break;
    }
    FileNameLen = i - 4;
    
    unsigned long FileIndex = 0;             
    FindFileResult = FindFirst(&SysFileInfoTemp.Fdt, &FindDataFunction2, SysFile1Info.Path, "LRC");
    if (FindFileResult == RETURN_OK){
        for (SysFileInfoTemp.CurrentFileNum = 1; 
             SysFileInfoTemp.CurrentFileNum <= SysFileInfoTemp.TotalFiles; 
             SysFileInfoTemp.CurrentFileNum++) 
        {
            if(FindFileResult != RETURN_OK){
                break;
            }
            GetLongFileName(SysFileInfoTemp.LongFileName);
        
            for (i = 0; i < FileNameLen; i++) {
                unsigned int char1,char2;
                char1 = SysFileInfoTemp.LongFileName[i];
                char2 = SysFile1Info.LongFileName[i];
                if(char1>96 && char1<123)char1 -= 32;
                if(char2>96 && char2<123)char2 -= 32;
                if (char1 != char2) {
                    break;
                }
            }
            if( i == FileNameLen ) {
                memcpy(Mp3LrcFileName , SysFileInfoTemp.Fdt.Name ,8);   //把歌词文件名临时存放在LrcFileName中.           
                if (Fun2MsgArray[0] == MSG_FUNCTION2_NONE) {
                    Mp3PlayFlag.bc.bMp3LrcHave = 1;
                    MusicPlayInfo.DispState = LRC_DISPLAY;
                }
                break;
            }else{
                FindFileResult = FindNext(&SysFileInfoTemp.Fdt, &FindDataFunction2, "LRC");   
            }
        }
    }
}
{//-------------------------Mp3 Variable Init----------------------------------
    
    MP3FileOffSetA = 0;
    MP3FileOffSetB = 0;
    MusicPlayInfo.TimeGuageVal = 0;
    
    Mp3DisplayModeInit();
    
    MP3TimeCount = (unsigned long)(MP3FileOffSet % (((unsigned long)(MusicPlayInfo.FirstBitrate) *125)/20));
    MP3TimeGuageCount = (unsigned long)(MP3FileOffSet % (SysFile1Info.Fdt.FileSize / TIME_GUAGE_CONST));
    Mp3TotalTimeSec = (unsigned long)(SysFile1Info.Fdt.FileSize / ((unsigned long)(MusicPlayInfo.FirstBitrate)*125));
    
    PostFun1Message(MSG_FUNCTION1_MUSIC_MP3,MSG_FUNCTION1_MP3_START,0,0,0/*,0,0,0*/);
}
}
//******************************************************************************

⌨️ 快捷键说明

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