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

📄 mammfcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
    Name        : MTR_Check
    Description : Score Track Chunk Check
    Parameter   : struct *MTR  ... Pointer to Score Track Chunk Information
                : UINT8  bType ... SMAF Type
    Return      :  >0 ... Error
                :   0 ... Success
*******************************************************************************/
static UINT8 MTR_Check(
    PMTRINFO MTR,
    UINT8  bType
)
{
    UINT32 index;
    UINT32 result;
    UINT32 dwSize;
    UINT8  *pBuf;
    UINT16 wNextID;
    SINT32 slNextSize;

    MTR->pPhrase = 0;
    MTR->pSetup  = 0;
    MTR->pSeq    = 0;
    MTR->pWave   = 0;

    if (bType == SMAF_TYPE_MA3) {
        if ((MTR->pMTR[0] != 0x01) && (MTR->pMTR[0] != 0x02)) {
            return SMAF_ERR_CHUNK;              /* MA-3   Format Type Error!! */
        }
    }
    else {
        if (MTR->pMTR[0] != 0x00) {
            return SMAF_ERR_CHUNK;              /* MA-1/2 Foramt Type Error!! */
        }
    }
    if (MTR->pMTR[1] != 0) {
        return SMAF_ERR_CHUNK;                  /* Sequense Type Error!!      */
    }
    if (MTR->pMTR[2] != MTR->pMTR[3]) {
        return SMAF_ERR_CHUNK;                  /* Time Base Error!!          */
    }
    result = (UINT32)_get_timebase(MTR->pMTR[2]);
    if (result == 0) {
        return SMAF_ERR_CHUNK;                  /* Time Base Error!!          */
    }
    MTR->bTimeBase = (UINT8)result;

    if (bType == SMAF_TYPE_MA3)
        index = 20;
    else
        index = 6;

    dwSize = MTR->dwSize;
    pBuf   = MTR->pMTR;
    while ((dwSize - index) > SIZE_OF_CHUNKHEADER) {
        slNextSize = NextChunk( 3, &pBuf[index], (dwSize - index), &wNextID);
        if (slNextSize < 0) {
            return SMAF_ERR_CHUNK;
        }
        index += SIZE_OF_CHUNKHEADER;
        switch((UINT8)(wNextID & 0x00FF)){
            case 0x09:                          /* Seek & Phrase Info Chunk   */
                MTR->pPhrase      = &pBuf[index];
                MTR->dwPhraseSize = (UINT32)slNextSize;
                break;
            case 0x0A:                          /* Setup Data Chunk           */
                MTR->pSetup       = &pBuf[index];
                MTR->dwSetupSize  = (UINT32)slNextSize;
                break;
            case 0x0B:                          /* Sequense Data Chunk        */
                MTR->pSeq         = &pBuf[index];
                MTR->dwSeqSize    = (UINT32)slNextSize;
                break;
            case 0x0C:                          /* Stream PCM Wave Data Chunk */
                MTR->pWave        = &pBuf[index];
                MTR->dwWaveSize   = (UINT32)slNextSize;
                break;
            case 0xFF:                          /* Unknown Chunk              */
                break;
            default:
                return SMAF_ERR_CHUNK;
        }
        index += slNextSize;
    }
    if (MTR->pSeq == 0) {
        return SMAF_ERR_SHORT_LENGTH;
    }
    else
        return F_TRUE;
}


/*******************************************************************************
    Name        : MspI_Check
    Description : Get Seek & Phrase Information
    Parameter   : struct  *MTR ... Pointer to Score Track Chunk Information
    Return      : Nothing
*******************************************************************************/
static void MspI_Check(
    PMTRINFO MTR
)
{
    UINT8  i;
    UINT8  *pBuf;
    UINT32 dwSize;
    UINT16 tag;

    for (i = 0; i < 8; i++) {
        MTR->Phrase[i].dwSTp = 0xFFFFFFFF;
        MTR->Phrase[i].dwSPp = 0xFFFFFFFF;
        MTR->Phrase[i].dwSTt = 0xFFFFFFFF;
        MTR->Phrase[i].dwSPt = 0xFFFFFFFF;
    }
    if (MTR->pPhrase == 0)
        return;
    pBuf   = MTR->pPhrase;
    dwSize = MTR->dwPhraseSize;

    while( dwSize >= 8 ) {
        tag = (UINT16)((pBuf[0] << 8)+ pBuf[1]);/* TAG                        */
        pBuf += 3;                              /* Pointer Adjustment         */
        switch( tag ) {
            case 0x7374:                        /* Start Point                */
                MTR->Phrase[0].dwSTp = _get4b(&pBuf);
                dwSize -= 8;
                break;
            case 0x7370:                        /* Stop Point                 */
                MTR->Phrase[0].dwSPp = _get4b(&pBuf);
                dwSize -= 8;
                break;
            case 0x5041:                        /* Phrase A                   */
                if (dwSize >= 12) {
                    MTR->Phrase[1].dwSTp = _get4b(&pBuf);
                    MTR->Phrase[1].dwSPp = _get4b(&pBuf);
                }
                else
                    dwSize = 0;
                break;
            case 0x5042:                        /* Phrase B                   */
                if (dwSize >= 12) {
                    MTR->Phrase[2].dwSTp = _get4b(&pBuf);
                    MTR->Phrase[2].dwSPp = _get4b(&pBuf);
                }
                else
                    dwSize = 0;
                break;
            case 0x5045:                        /* Ending                     */
                if (dwSize >= 12) {
                    MTR->Phrase[3].dwSTp = _get4b(&pBuf);
                    MTR->Phrase[3].dwSPp = _get4b(&pBuf);
                }
                else
                    dwSize = 0;
                break;
            case 0x5049:                        /* Intro                      */
                if (dwSize >= 12) {
                    MTR->Phrase[4].dwSTp = _get4b(&pBuf);
                    MTR->Phrase[4].dwSPp = _get4b(&pBuf);
                }
                else
                    dwSize = 0;
                break;
            case 0x504B:                        /* Kanso                      */
                if (dwSize >= 12) {
                    MTR->Phrase[5].dwSTp = _get4b(&pBuf);
                    MTR->Phrase[5].dwSPp = _get4b(&pBuf);
                }
                else
                    dwSize = 0;
                break;
            case 0x5053:                        /* Sabi                       */
                if (dwSize >= 12) {
                    MTR->Phrase[6].dwSTp = _get4b(&pBuf);
                    MTR->Phrase[6].dwSPp = _get4b(&pBuf);
                }
                else
                    dwSize = 0;
                break;
            case 0x5052:                        /* Refrain                    */
                if (dwSize >= 12) {
                    MTR->Phrase[7].dwSTp = _get4b(&pBuf);
                    MTR->Phrase[7].dwSPp = _get4b(&pBuf);
                }
                else
                    dwSize = 0;
                break;
            default:
                dwSize = 0;
                break;
        }
        pBuf ++;                                /* ','                        */
    }
}


/*******************************************************************************
    Name        : ST_SP_Check
    Description : st/sp Position Check
    Parameter   : struct *pPhrase ... Pointer to st,sp structure
                : UINT32 SeqSize  ... Size of Sequence data
    Return      :  >0 ... Error
                :   0 ... Success
*******************************************************************************/
static UINT8 ST_SP_Check(
    PPHRA  pPhrase,
    UINT32 SeqSize
)
{
    UINT8  result;
    UINT32 dwSt, dwSp;

    result = 0;
    dwSt   = pPhrase->dwSTp;
    dwSp   = pPhrase->dwSPp;
    if (pPhrase->dwSTp == 0xFFFFFFFF)
        dwSt = 0;
    if (pPhrase->dwSPp == 0xFFFFFFFF)
        dwSp = SeqSize;

    if ((dwSt >= dwSp) || (dwSt > SeqSize) || (dwSp > SeqSize))
        result = SMAF_ERR_CHUNK;

#if ERROR_CHECK_STRENGTH
    if (result) {
        return result;
    }
#else
    if (result) {
        pPhrase->dwSTp = 0;
        pPhrase->dwSPp = SeqSize;
    }
#endif
    return F_TRUE;
}


/*******************************************************************************
    Name        : Ev_Set
    Description : Set Event Information to Event Block
    Parameter   : UINT32 cmd  ... Command #
                : UINT32 prm1 ... Parameter 1
                : UINT32 prm2 ... Parameter 2
                : UINT32 prm3 ... Parameter 3
                : UINT32 size ... Sequence Data Size
                : struct *pEv ... Pointer to Event List Block
    Return      : Nothing
*******************************************************************************/
static void Ev_Set(
    UINT32 cmd,
    UINT32 prm1,
    UINT32 prm2,
    UINT32 prm3,
    UINT32 size,
    PEVLIST pEv
)
{
    pEv->dwEvNo = cmd;
    pEv->dwVal1 = prm1;
    pEv->dwVal2 = prm2;
    pEv->dwVal3 = prm3;
    pEv->dwSize = size;
}


/*******************************************************************************
    Name        : Get_EvList
    Description : Get New(Empty) Event List Block
    Parameter   : Nothing
    Return      :   0 ... Fail
                :  !0 ... Success(Pointer to Got Event List)
*******************************************************************************/
static PEVLIST Get_EvList( void )
{
    void  *pEv;

    pEv = Play_Info.pEmptyEv;
    if (pEv != 0)
        Play_Info.pEmptyEv = ((PEVLIST)pEv)->pNext;
    return (PEVLIST)pEv;
}


/*******************************************************************************
    Name        : Get_OffList
    Description : Get New(Empty) Note OFF List Block
    Parameter   : Nothing
    Return      :   0 ... Fail
                :  !0 ... Success(Pointer to Got Note OFF List)
*******************************************************************************/
static POFFLIST Get_OffList( void )
{
    void *pOff;

    pOff = Play_Info.pEmptyOFF;
    if (pOff != 0)
        Play_Info.pEmptyOFF = ((POFFLIST)pOff)->pNext;
    return (POFFLIST)pOff;
}


/*******************************************************************************
    Name        : Set_EvList
    Description : Set Event List Block (Action Time Order)
    Parameter   : struct *pEv ... Pointer to Event List Block
    Return      : Nothing
*******************************************************************************/
static void Set_EvList(
    PEVLIST pEv
)
{
    void **Next;

    Next = &(Play_Info.pNextEv);
    while (*Next != 0) {
        if (((PEVLIST)*Next)->dwTime > pEv->dwTime)
            break;
        Next = &(((PEVLIST)*Next)->pNext);
    }
    pEv->pNext = *Next;
    *Next = (void *)pEv;
}


/*******************************************************************************
    Name        : Set_OffList
    Description : Set Note OFF List Block (Note OFF Time Order)
    Parameter   : struct *pOff ... Pointer to Note OFF List Block
    Return      : Nothing
*******************************************************************************/
static void Set_OffList(
    POFFLIST pOff
)
{
    void **Next;

    Next = &(Play_Info.pNextOFF);
    while (*Next != 0) {
        if (((POFFLIST)*Next)->dwTime > pOff->dwTime)
            break;
        Next = &(((POFFLIST)*Next)->pNext);
    }
    pOff->pNext = *Next;
    *Next = (void *)pOff;
}


/*******************************************************************************
    Name        : Search_EOS
    Description : Search EOS Event Block (For EP Change)
    Parameter   : Nothing
    Return      :   0 ... Fail
                :  !0 ... Success(Pointer to Event List Block)
*******************************************************************************/
static PEVLIST Search_EOS( void )
{
    void **Next;
    PEVLIST pEv;

    pEv  = 0;
    Next = &(Play_Info.pNextEv);
    while (*Next != 0) {
        pEv = (PEVLIST)*Next;
        if (pEv->dwEvNo == MMF_EVENT_EOS) {
            *Next = pEv->pNext;
            break;
        }
        Next = &(pEv->pNext);
    }
    return pEv;
}


/*******************************************************************************

⌨️ 快捷键说明

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