📄 mammfcnv.c
字号:
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 + -