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

📄 enhanced_selector_for_ape.c

📁 MP3 整个 SDK
💻 C
字号:
#pragma codeseg(MO_EH_FSL5)

#include "actos.h"
#include "enhanced.h"
#include "debug.h"
#include "codec.h"

WORD    fselFileNo_APE;    //Number of current file no with total APE parts of current and last in ape file
BYTE    Curfilename[12];
BYTE    CurApe_TotalNo;
decInitTime_t  APE_StartTime;
decInitTime_t  APE_EndTime;   

extern WORD fselFileNo; 
#pragma memory=dataseg(MOD_EH_FSL5)
    char    m_szTemp_ape2[12];
//    char    m_szTemp_keyword[12];
    char    APE_Buf[512];
    char    *APE_Ptr;
    int     Buf_Len;
    handle  m_apeFileHandle;
    int     file_block;
    int     cur_block;
#pragma memory=default

#pragma memory=constseg(MOC_EH_FSL5)
    const char RootName_ape2[] = {":"};
    const char IgnoreExt_ape2[4] = {"*  "};
    const char APEExt_ape2[] = "APE";
    const char CUEExt_ape2[] = "CUE";
    const char TALB[]   = "TITLE \"";
    const char TRACK[]  = "TRACK ";
    const char TITLE[]  = " TITLE \"";
    const char INDEX01[]  = " INDEX 01 ";
    const char PERFORMER[]  = " PERFORMER \"";
#pragma memory=default


BOOL _CUE_SeekKeyWord(const char *KeyWord)
{
    const char *KeyWord2 = KeyWord;
    while(1)
    {
        if(*KeyWord2 == 0)
            return TRUE;
        if(*APE_Ptr == *KeyWord2)
            KeyWord2++;
        else if(KeyWord2 != KeyWord)
        {
            KeyWord2 = KeyWord;
            continue;
        }
        APE_Ptr++;
        if(APE_Ptr >= APE_Buf + Buf_Len)
        {
            if( (Buf_Len = _CUE_ReadFile() ) <= 0)
                break;
            else
                APE_Ptr = APE_Buf;
        }
    }
    return FALSE;
}

void _CUE_ReadString(char *strFile,char endsymbol,BYTE maxlen)
{
    BYTE i;
    for(i=1; i<maxlen && *APE_Ptr != endsymbol; i++)
    {
        *strFile++ = *APE_Ptr++;
        if(APE_Ptr >= APE_Buf + Buf_Len)
        {
            if( (Buf_Len = _CUE_ReadFile() ) <= 0)
            {
                APE_Ptr--;
                break;
            }
            else
                APE_Ptr = APE_Buf;
        }
    }
    *strFile = 0;
}
WORD APE_GetTotalParts(handle fp)
{
    int total = 0;
    
    m_apeFileHandle = fp;
    
    cur_block = 0;
    APE_Ptr = APE_Buf;
    
    file_block = (int)FS_GetFileLen(m_apeFileHandle);
    FS_FSeek(0, FS_SEEK_FFROMSTART, m_apeFileHandle);
    Buf_Len = _CUE_ReadFile();
    
    while( _CUE_SeekKeyWord(TRACK) )
    {
        total++;
    }
    return total;
}

int _CUE_ReadFile()
{
    if(cur_block+1 > file_block)
        return 0;
    FS_FRead(APE_Buf, 1 , m_apeFileHandle);
    cur_block++;
    if(cur_block == file_block)
        return FS_GetUnalignedLen(m_apeFileHandle);
    else
        return 512;
}
BOOL GetAPEInfoByNo(char *filename, ID3Info_t *ID3, BYTE mode)
{
    char *_keyword;
    BYTE num;
    
    num = CurApe_TotalNo+fselFileNo-fselFileNo_APE;
    memcpy(m_szTemp_ape2, filename, 8);
    strcpy(m_szTemp_ape2+8, CUEExt_ape2);
    if( (m_apeFileHandle = FS_FOpen(m_szTemp_ape2, FS_OPEN_NORMAL)) )//支持SEEK
    {
        file_block = (int)FS_GetFileLen(m_apeFileHandle);
        
        cur_block = 0;
        APE_Ptr = APE_Buf;
        FS_FSeek(0, FS_SEEK_FFROMSTART, m_apeFileHandle);
        Buf_Len = _CUE_ReadFile();
        
        _CUE_SeekKeyWord(TALB);
        _CUE_ReadString(ID3->TALB_buffer,'\"',ID3->TALB_length);
        
        cur_block = 0;
        APE_Ptr = APE_Buf;
        FS_FSeek(0, FS_SEEK_FFROMSTART, m_apeFileHandle);
        Buf_Len = _CUE_ReadFile();
        
        _keyword = m_szTemp_ape2;
        strcpy(_keyword,TRACK);
        _keyword = _keyword + strlen(TRACK);
        *_keyword++ = num / 10 + '0';
        *_keyword++ = num % 10 + '0';
        *_keyword   = 0;
        
        if(_CUE_SeekKeyWord(m_szTemp_ape2))
        {
            if(!_CUE_SeekKeyWord(TITLE))
            {
                FS_FClose(m_apeFileHandle);
                return FALSE;
            }
            _CUE_ReadString(ID3->TIT2_buffer,'\"',ID3->TIT2_length);
            if(!_CUE_SeekKeyWord(PERFORMER))
            {
                FS_FClose(m_apeFileHandle);
                return FALSE;
            }
            _CUE_ReadString(ID3->TPE1_buffer,'\"',ID3->TPE1_length);
            if(!_CUE_SeekKeyWord(INDEX01))
            {
                FS_FClose(m_apeFileHandle);
                return FALSE;
            }
            _CUE_ReadString(m_szTemp_ape2,0x0d,8);
            APE_StartTime.minute = (m_szTemp_ape2[0]-'0')*10 + m_szTemp_ape2[1]-'0';
            APE_StartTime.second = (m_szTemp_ape2[3]-'0')*10 + m_szTemp_ape2[4]-'0';
            APE_StartTime.Hms    = (m_szTemp_ape2[6]-'0')*10 + m_szTemp_ape2[7]-'0';
        }
        
        cur_block = 0;
        APE_Ptr = APE_Buf;
        FS_FSeek(0, FS_SEEK_FFROMSTART, m_apeFileHandle);
        Buf_Len = _CUE_ReadFile();
        
        _keyword = m_szTemp_ape2;
        strcpy(_keyword,TRACK);
        _keyword = _keyword + strlen(TRACK);
        *_keyword++ = (num+1) / 10 + '0';
        *_keyword++ = (num+1) % 10 + '0';
        *_keyword   = 0;
        if(_CUE_SeekKeyWord(m_szTemp_ape2))
        {
            _CUE_SeekKeyWord(INDEX01);
            _CUE_ReadString(m_szTemp_ape2,0x0d,8);
            APE_EndTime.minute = (m_szTemp_ape2[0]-'0')*10 + m_szTemp_ape2[1]-'0';
            APE_EndTime.second = (m_szTemp_ape2[3]-'0')*10 + m_szTemp_ape2[4]-'0';
            APE_EndTime.Hms    = (m_szTemp_ape2[6]-'0')*10 + m_szTemp_ape2[7]-'0';
            if( GetStartIntTime()>=GetEndIntTime() )
            {
                FS_FClose(m_apeFileHandle);
                return FALSE;
            }
        }
        else
        {
            APE_EndTime.Hms=APE_EndTime.minute=APE_EndTime.second=0;
        }
        FS_FClose(m_apeFileHandle);
        return TRUE;
    }
    APE_EndTime.Hms=APE_EndTime.minute=APE_EndTime.second=APE_StartTime.Hms=APE_StartTime.minute=APE_StartTime.second=0;
    return FALSE;
}
int GetStartIntTime()
{
    char twochar[2];
    twochar[0]=APE_StartTime.second;
    twochar[1]=APE_StartTime.minute;
    return *((int*)twochar);
}
int GetEndIntTime()
{
    char twochar[2];
    twochar[0]=APE_EndTime.second;
    twochar[1]=APE_EndTime.minute;
    return *((int*)twochar);
}

⌨️ 快捷键说明

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