📄 malib.c
字号:
break;
case 0x4D737049: /* Seek&Phrase Info Chunk(MTR)*/
if(state != 3) /* status Check */
return -1;
*chunk = 0x0009;
break;
case 0x4D747375: /* Setup Data Chunk(MTR) */
if(state != 3) /* status Check */
return -1;
*chunk = 0x000A;
break;
case 0x4D747371: /* Sequense Data Chunk(MTR) */
if(state != 3) /* status Check */
return -1;
*chunk = 0x000B;
break;
case 0x4D747370: /* Stream PCM Wave Data Chunk */
if(state != 3) /* status Check */
return -1;
*chunk = 0x000C;
break;
case 0x41737049: /* Seek&Phrase Info Chunk(ATR)*/
if(state != 6) /* status Check */
return -1;
*chunk = 0x000E;
break;
case 0x41747375: /* Setup Data Chunk(ATR) */
if(state != 6) /* status Check */
return -1;
*chunk = 0x000F;
break;
case 0x41747371: /* Sequense Data Chunk(ATR) */
if(state != 6) /* status Check */
return -1;
*chunk = 0x0010;
break;
default:
*chunk = (UINT16)((dwChunkID & 0x000000FF) << 8);
switch(dwChunkID & 0xFFFFFF00){
case 0x4D545200: /* Score Track Chunk */
if(state != 2) /* status Check */
return -1;
*chunk |= 0x0004;
break;
case 0x41545200: /* Audio Track Chunk */
if(state != 2) /* status Check */
return -1;
*chunk |= 0x0005;
break;
case 0x47545200: /* Graphics Data Chunk */
if(state != 2) /* status Check */
return -1;
*chunk |= 0x0006;
break;
case 0x44636800: /* Data Chunk(OPDA) */
if(state != 5) /* status Check */
return -1;
*chunk |= 0x0008;
break;
case 0x4D776100: /* Wave Data Chunk(MTR) */
if(state != 4) /* status Check */
return -1;
*chunk |= 0x000D;
break;
case 0x41776100: /* Wave Data Chunk(ATR) */
if(state != 6) /* status Check */
return -1;
*chunk |= 0x0011;
break;
default: /* Unknown Chunk */
*chunk = 0xFFFF;
break;
}
}
dwChunkSize = ((UINT32)(*(pBuff+4) << 24) | (UINT32)(*(pBuff+5) << 16) |
(UINT32)(*(pBuff+6) << 8 ) | (UINT32)(*(pBuff+7)));
remain -= 4;
if(dwChunkSize > remain) /* Check Chunk Size */
return -1;
return (SINT32)dwChunkSize;
}
/*=============================================================================
// Function Name : UINT8 GetWaveInfo_3(UINT8* fp, UINT32 size, UINT8 mode)
//
// Description : Get data Info from the file
//
// Argument : fp : pointer to the data
// size : size fo the data
// pvI : pointer to work space
//
// Return : 0 : NoError, > 0 : Error
=============================================================================*/
static UINT8 GetWaveInfo_3(
UINT8* fp,
UINT32 size,
MALIB_PMAAUD_INFO pI
)
{
SINT32 dwSize;
UINT16 wNextChunk;
UINT32 dwIndex;
UINT32 dwFs;
UINT8 bFmt;
UINT8* pbWave;
dwIndex = 0;
bFmt = 0xFF;
dwFs = 0;
pbWave = NULL;
dwSize = 0;
while(size > 8)
{
dwSize = NextChunk(3, &fp[dwIndex], size, &wNextChunk);
if(dwSize < 0) return 1;
if(wNextChunk != 0x000C)
{
dwIndex += 8 + dwSize;
size -= 8 + dwSize;
continue;
}
dwIndex += 8;
size -= 8;
while (size > 8)
{
dwSize = NextChunk(4, &fp[dwIndex], size, &wNextChunk);
if(dwSize < 4) return 1;
if ((wNextChunk & 0x00FF) != 0x000D)
{
dwIndex += 8 + dwSize;
size -= 8 + dwSize;
continue;
}
dwSize -= 3;
dwFs = ((UINT32)fp[dwIndex + 9] << 8) + (UINT32)fp[dwIndex + 10];
if (dwFs < 4000) return 1;
switch (fp[dwIndex + 8])
{
case 0x01:
if (dwFs > MALIB_MAX_STREAM_FS_8BIT) return 1;
if ((UINT32)dwSize <= (dwFs / 50)) return 2;
bFmt = 3;
pbWave = &fp[dwIndex + 11];
break;
case 0x11:
if (dwFs > MALIB_MAX_STREAM_FS_8BIT) return 1;
if ((UINT32)dwSize <= (dwFs / 50)) return 2;
bFmt = 2;
pbWave = &fp[dwIndex + 11];
break;
case 0x20:
if (dwFs > MALIB_MAX_STREAM_FS_4BIT) return 1;
if ((UINT32)dwSize <= (dwFs / 100)) return 2;
bFmt = 1;
pbWave = &fp[dwIndex + 11];
break;
default:
return 1;
}
break;
}
break;
}
if (bFmt == 0xFF) return 2;
pI->dFs = dwFs;
pI->dFormat = (UINT32)bFmt;
pI->pSource = pbWave;
pI->dSizeOfSource = dwSize;
return 0;
}
/*=============================================================================
// Function Name : UINT8 GetWaveInfo_2(UINT8* fp, UINT32 size, UINT8 mode)
//
// Description : Get data Info from the file
//
// Argument : fp : pointer to the data
// size : size fo the data
// pvI : pointer to work space
//
// Return : 0 : NoError, > 0 : Error
=============================================================================*/
static UINT8 GetWaveInfo_2(
UINT8* fp,
UINT32 size,
MALIB_PMAAUD_INFO pI
)
{
SINT32 dwSize;
SINT32 dwSizeOfWave;
UINT16 wNextChunk;
UINT32 dwIndex;
UINT32 dwFs;
UINT8 bFmt;
UINT8 bData;
UINT8* pbWave;
dwIndex = 6;
size -= 6;
bFmt = 0;
dwFs = 0;
dwSize = 0;
dwSizeOfWave = 0;
pbWave = NULL;
bData = fp[2];
if (bData == 0x10) dwFs = 4000; /* Mono, ADPCM, 4KHz */
else if (bData == 0x11) dwFs = 8000; /* Mono, ADPCM, 8KHz */
else return 1; /* Error */
bData = fp[3];
if (bData == 0x00) bFmt = 1; /* 4bit */
else return 1; /* Error */
while(size > 8)
{
dwSize = NextChunk(6, &fp[dwIndex], size, &wNextChunk);
if(dwSize < 0) return 1;
if((wNextChunk & 0x00FF) != 0x0011)
{
dwIndex += 8 + dwSize;
size -= 8 + dwSize;
continue;
}
pbWave = &fp[dwIndex + 8];
dwSizeOfWave = dwSize;
size = 0;
}
if ((UINT32)dwSizeOfWave <= (dwFs / 100)) return 2;
pI->dFs = dwFs;
pI->dFormat = (UINT32)bFmt;
pI->pSource = pbWave;
pI->dSizeOfSource = dwSizeOfWave;
return 0;
}
/*=============================================================================
// Function Name : SINT32 malib_smafaudio_checker(UINT8* fp, UINT32 fsize,
// UINT8 mode)
//
// Description : Get data Info from the file
//
// Argument : fp : pointer to the data
// fsize : size fo the data
// mode : error check (0:No, 1:Yes, 2:CheckOnly, 3:OPDA)
// pvI : pointer to work space
//
// Return : >=0 : data length(msec), < 0 : Error
=============================================================================*/
SINT32 malib_smafaudio_checker(
UINT8* fp,
UINT32 fsize,
UINT8 mode,
void* pvI
)
{
SINT32 dwTotalSize;
UINT32 dwIndex;
SINT32 dwSize;
UINT16 wCRC;
UINT16 wNextChunk;
UINT8 bMTRError;
UINT8 bType;
UINT8 bClass;
SINT32 ret;
MALIB_PMAAUD_INFO pI;
if (fsize < 18) return (MALIB_MA3AUDERR_ARGUMENT);
if (pvI == NULL) pI = &sAudio_Check;
else pI = (MALIB_PMAAUD_INFO)pvI;
pI->dwSize = 0;
pI->pConti = 0;
pI->dFs = 0;
dwIndex = 0;
wNextChunk = 0xFFFF;
dwTotalSize = NextChunk(0, &fp[dwIndex], fsize, &wNextChunk);
if ((dwTotalSize < 0) || (wNextChunk != 1)) return (MALIB_MA3AUDERR_FILE);
if (dwTotalSize < 10) return (MALIB_MA3AUDERR_CHUNK_SIZE);
if (mode != 0)
{
wCRC = (UINT16)(((UINT16)fp[dwTotalSize + 6] << 8) +
(UINT16)fp[dwTotalSize + 7]);
if (wCRC != makeCRC(dwTotalSize + 8, fp)) return (MALIB_MA3AUDERR_FILE);
}
dwIndex = 8;
dwSize = NextChunk(1, &fp[dwIndex], dwTotalSize, &wNextChunk);
if ((dwSize < 0) || (wNextChunk != 2)) return (MALIB_MA3AUDERR_FILE);
if (dwSize < 5) return (MALIB_MA3AUDERR_CHUNK_SIZE);
ret = 0;
bClass = fp[16]; /* Contents Class */
bType = fp[17]; /* Contents Type */
pI->bCodeType = fp[18]; /* Contents Code Type */
if(bType <= 0x2F) { /* SMAF Type */
pI->bSMAFType = 0; /* SMAF MA-1/2 */
pI->bOptionType = 0; /* Option Information in CNTI */
}
else {
pI->bOptionType = 1; /* Option Information in OPDA */
if((bType & 0x0F) <= 0x01 )
pI->bSMAFType = 0; /* SMAF MA-1/2 */
else
pI->bSMAFType = 1; /* SMAF MA-3 */
}
if ((bClass != CONTENTS_CLASS_1) && (bClass != CONTENTS_CLASS_2))
return MALIB_MA3AUDERR_C_CLASS;
bType = (UINT8)(fp[17] & 0xF0);
if (bType <= 0x2F) {
if ((bType != CONTENTS_TYPE_1) && (bType != CONTENTS_TYPE_2) &&
(bType != CONTENTS_TYPE_3) && (mode != 3))
ret = MALIB_MA3AUDERR_C_TYPE;
}
else {
if ((bType != CONTENTS_TYPE_4) && (bType != CONTENTS_TYPE_5) &&
(bType != CONTENTS_TYPE_6) && (mode != 3))
ret = MALIB_MA3AUDERR_C_TYPE;
bType = (UINT8)(fp[17] & 0x0F);
if (bType > 3)
ret = MALIB_MA3AUDERR_C_TYPE;
}
pI->pConti = &(fp[16]);
dwIndex = 16 + dwSize;
if ((pI->bOptionType == 0) && (dwSize >= 9)){
pI->pInfo = &(fp[21]);
pI->dwSize = dwSize - 5;
}
else {
pI->pInfo = NULL;
pI->dwSize = 0;
}
dwSize = NextChunk(2, &fp[dwIndex], (UINT32)(dwTotalSize + 8 - dwIndex),
&wNextChunk);
if ((wNextChunk & 0x00FF) == 3) /* Optional Data Chunk */
{
if ((dwSize >= 12) && (pI->bOptionType == 1))
{
pI->pInfo = &(fp[dwIndex + 8]);
pI->dwSize = (UINT32)dwSize;
}
}
bMTRError = 0xFF;
while((UINT32)dwTotalSize > (UINT32)(dwIndex + 8))
{
dwSize = NextChunk(2, &fp[dwIndex], (UINT32)(dwTotalSize + 8 - dwIndex),
&wNextChunk);
if(dwSize < 0) return (MALIB_MA3AUDERR_FILE);
switch((UINT8)(wNextChunk & 0x00FF)){
case 0x04: /* Score Track Chunk */
if (((wNextChunk & 0xFF00) != 0x0500) || (pI->bSMAFType != 1)) {
dwIndex += 8 + dwSize;
break;
}
if (dwSize < 36)
{
dwIndex = dwTotalSize;
bMTRError = 1;
break;
}
dwIndex += 28;
bMTRError = GetWaveInfo_3(&fp[dwIndex], (dwSize - 20), pI);
dwIndex = dwTotalSize;
break;
case 0x05: /* Audio Track Chunk */
if (((wNextChunk & 0xFF00) != 0x0000) || (pI->bSMAFType != 0)) {
dwIndex += 8 + dwSize;
break;
}
if (dwSize < 14)
{
dwIndex = dwTotalSize;
bMTRError = 1;
break;
}
dwIndex += 8;
bMTRError = GetWaveInfo_2(&fp[dwIndex], dwSize, pI);
dwIndex = dwTotalSize;
break;
case 0x03: /* Optional Data Chunk */
case 0x06: /* Graphics Data Chunk */
case 0x07: /* Master Track Chunk */
case 0xFF: /* Unknown Chunk */
dwIndex += 8 + dwSize;
break;
default:
return (MALIB_MA3AUDERR_FILE);
}
}
if (mode == 3) { pI->dFs = 0; return 0; }
if (bMTRError != 0) {
if (bMTRError == 1) return (MALIB_MA3AUDERR_CHUNK);
else return (MALIB_MA3AUDERR_SHORT_LENGTH);
}
if (ret) return ret;
if (pI->dFs == 0) return (MASMW_ERROR);
switch(pI->dFormat) {
case 0x01: /* 4bit ADPCM mono */
return ((pI->dSizeOfSource * 2000 + (pI->dFs - 1)) / pI->dFs);
case 0x02:
case 0x03: /* 8bit PCM mono */
return ((pI->dSizeOfSource * 1000 + (pI->dFs - 1)) / pI->dFs);
default:
return (MASMW_ERROR);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -