📄 malib.c
字号:
/*==============================================================================
// Copyright(c) 2002 YAMAHA CORPORATION
//
// Title : MAMIL.C
//
// Description : MA-3 SMAF/Phrase/Audio Error Check Module.
//
// Version : 0.8.0.3 2002.12.12
//
//============================================================================*/
#include "malib.h"
#include "mammfcnv.h"
#define MALIB_PHRASE_DATA_NOERROR 0x0000
#define MALIB_PHRASE_DATA_SIZE 0x0001
#define MALIB_PHRASE_DATA_CLASS 0x0002
#define MALIB_PHRASE_DATA_TYPE 0x0004
#define MALIB_PHRASE_DATA_VERSION 0x0008
#define MALIB_PHRASE_DATA_TIMEBASE 0x0010
#define MALIB_PHRASE_DATA_CHUNK 0x0020
#define MALIB_PHRASE_DATA_CRC 0x0040
#define MALIB_PHRASE_DATA_SHORTLEN 0x0080
#define MALIB_MA3AUDERR_ARGUMENT MASMW_ERROR_ARGUMENT
#define MALIB_MA3AUDERR_CHUNK_SIZE MASMW_ERROR_CHUNK_SIZE
#define MALIB_MA3AUDERR_CHUNK MASMW_ERROR_CHUNK
#define MALIB_MA3AUDERR_C_CLASS MASMW_ERROR_CONTENTS_CLASS
#define MALIB_MA3AUDERR_C_TYPE MASMW_ERROR_CONTENTS_TYPE
#define MALIB_MA3AUDERR_FILE MASMW_ERROR_FILE
#define MALIB_MA3AUDERR_SHORT_LENGTH MASMW_ERROR_SHORT_LENGTH
#define MALIB_MAX_PHRASE_VOICES 4
#define MALIB_MIN_PHRASE_DATA_LENGTH 1
#define MALIB_SIZE_OF_CHUNKHEADER 8
#define MALIB_SIZE_OF_CRC 2
#define MALIB_SIZE_OF_MIN_CNTI 5
#define MALIB_CNTI_TYPE_PHRASE 0xF0
#define MALIB_PHRASE_VERSION 1
#define MALIB_PHRASE_TIMEBASE 20
#define MALIB_VOICE_TYPE_UNKNOWN 0
#define MALIB_VOICE_TYPE_MA2 1
#define MALIB_VOICE_TYPE_MA3 2
#define MALIB_CHKMODE_ENABLE 1
#define MALIB_CHKMODE_CNTIONLY 2
#define MALIB_MAX_STREAM_FS_4BIT 24000
#define MALIB_MAX_STREAM_FS_8BIT 12000
/* CRC converting table */
static const UINT16 gwCRCTbl[256] = {
0x0000U,0x1021U,0x2042U,0x3063U,0x4084U,0x50A5U,0x60C6U,0x70E7U,
0x8108U,0x9129U,0xA14AU,0xB16BU,0xC18CU,0xD1ADU,0xE1CEU,0xF1EFU,
0x1231U,0x0210U,0x3273U,0x2252U,0x52B5U,0x4294U,0x72F7U,0x62D6U,
0x9339U,0x8318U,0xB37BU,0xA35AU,0xD3BDU,0xC39CU,0xF3FFU,0xE3DEU,
0x2462U,0x3443U,0x0420U,0x1401U,0x64E6U,0x74C7U,0x44A4U,0x5485U,
0xA56AU,0xB54BU,0x8528U,0x9509U,0xE5EEU,0xF5CFU,0xC5ACU,0xD58DU,
0x3653U,0x2672U,0x1611U,0x0630U,0x76D7U,0x66F6U,0x5695U,0x46B4U,
0xB75BU,0xA77AU,0x9719U,0x8738U,0xF7DFU,0xE7FEU,0xD79DU,0xC7BCU,
0x48C4U,0x58E5U,0x6886U,0x78A7U,0x0840U,0x1861U,0x2802U,0x3823U,
0xC9CCU,0xD9EDU,0xE98EU,0xF9AFU,0x8948U,0x9969U,0xA90AU,0xB92BU,
0x5AF5U,0x4AD4U,0x7AB7U,0x6A96U,0x1A71U,0x0A50U,0x3A33U,0x2A12U,
0xDBFDU,0xCBDCU,0xFBBFU,0xEB9EU,0x9B79U,0x8B58U,0xBB3BU,0xAB1AU,
0x6CA6U,0x7C87U,0x4CE4U,0x5CC5U,0x2C22U,0x3C03U,0x0C60U,0x1C41U,
0xEDAEU,0xFD8FU,0xCDECU,0xDDCDU,0xAD2AU,0xBD0BU,0x8D68U,0x9D49U,
0x7E97U,0x6EB6U,0x5ED5U,0x4EF4U,0x3E13U,0x2E32U,0x1E51U,0x0E70U,
0xFF9FU,0xEFBEU,0xDFDDU,0xCFFCU,0xBF1BU,0xAF3AU,0x9F59U,0x8F78U,
0x9188U,0x81A9U,0xB1CAU,0xA1EBU,0xD10CU,0xC12DU,0xF14EU,0xE16FU,
0x1080U,0x00A1U,0x30C2U,0x20E3U,0x5004U,0x4025U,0x7046U,0x6067U,
0x83B9U,0x9398U,0xA3FBU,0xB3DAU,0xC33DU,0xD31CU,0xE37FU,0xF35EU,
0x02B1U,0x1290U,0x22F3U,0x32D2U,0x4235U,0x5214U,0x6277U,0x7256U,
0xB5EAU,0xA5CBU,0x95A8U,0x8589U,0xF56EU,0xE54FU,0xD52CU,0xC50DU,
0x34E2U,0x24C3U,0x14A0U,0x0481U,0x7466U,0x6447U,0x5424U,0x4405U,
0xA7DBU,0xB7FAU,0x8799U,0x97B8U,0xE75FU,0xF77EU,0xC71DU,0xD73CU,
0x26D3U,0x36F2U,0x0691U,0x16B0U,0x6657U,0x7676U,0x4615U,0x5634U,
0xD94CU,0xC96DU,0xF90EU,0xE92FU,0x99C8U,0x89E9U,0xB98AU,0xA9ABU,
0x5844U,0x4865U,0x7806U,0x6827U,0x18C0U,0x08E1U,0x3882U,0x28A3U,
0xCB7DU,0xDB5CU,0xEB3FU,0xFB1EU,0x8BF9U,0x9BD8U,0xABBBU,0xBB9AU,
0x4A75U,0x5A54U,0x6A37U,0x7A16U,0x0AF1U,0x1AD0U,0x2AB3U,0x3A92U,
0xFD2EU,0xED0FU,0xDD6CU,0xCD4DU,0xBDAAU,0xAD8BU,0x9DE8U,0x8DC9U,
0x7C26U,0x6C07U,0x5C64U,0x4C45U,0x3CA2U,0x2C83U,0x1CE0U,0x0CC1U,
0xEF1FU,0xFF3EU,0xCF5DU,0xDF7CU,0xAF9BU,0xBFBAU,0x8FD9U,0x9FF8U,
0x6E17U,0x7E36U,0x4E55U,0x5E74U,0x2E93U,0x3EB2U,0x0ED1U,0x1EF0U
};
typedef struct _tagMalibVoiceInfo
{
UINT8 bBankNo;
UINT8 bProgNo;
UINT8 bType;
UINT8 bSize;
UINT8* pbVoice;
} MALIB_VOCINFO, *MALIB_PVOCINFO;
/* SMAF/Phrase Information */
typedef struct _tagMalibPhrInfo
{
UINT8 bPhrNum; /* Phrase Number(ID) (0..3) */
UINT16 wLoopNum; /* Loop Count */
UINT8 bCntiClass; /* Contents Class */
UINT8 bCntiType; /* Contents Type */
UINT8 bCodeType; /* Contents Code Type */
UINT8 bCopyStatus; /* Copy Status */
UINT8 bCopyCount; /* Copy Count */
UINT8* pbCntiOption; /* Pointer to Contents info Chunk */
UINT8* pbOptionChunk; /* Pointer to Option Data Chunk */
UINT8* pbInfoChunk; /* Pointer to Info Chunk body */
UINT8* pbVoiceChunk; /* Pointer to Voice Chunk body */
UINT8* pbSequenceChunk; /* Pointer to Sequence Chunk body */
UINT32 dwCntiOptionSize; /* The size of Contents info Chunk */
UINT32 dwOptionDataSize; /* The size of Option Data Chunk */
UINT32 dwInfoChunkSize; /* The size of Info Chunk body */
UINT32 dwVoiceChunkSize; /* The size of Voice Chunk body */
UINT32 dwSequenceChunkSize; /* The size of Sequence Chunk body */
UINT32 dwPlayTime; /* total Play back time (tick) */
UINT32 dwTimer;
UINT32 dwCurrentTime;
UINT32 dwDataPosition;
SINT32 (*CallbackFunc)(UINT8 id); /* pointer to the callback function */
MALIB_VOCINFO VocInfo[MALIB_MAX_PHRASE_VOICES];
} MALIB_PHRINFO, *MALIB_PPHRINFO;
/* work area for SMAF/Phrase Format Check */
typedef struct _tagMalibPhrCheck
{
UINT8 bMode; /* Check Mode */
UINT16 wErrStatus; /**/
UINT8* pbBuffer; /* Pointer to Data */
UINT32 dwSize; /* The size of Data (in Byte) */
UINT8* pbPhrase; /* Pointer to Phrase Header */
UINT32 dwPhraseSize; /* The size of Phrase Data */
UINT8* pbVoice; /* Pointer to Voice Chunk Header */
UINT32 dwVoiceSize; /* The size of Voice Chunk Data */
MALIB_PPHRINFO pPhrInfo;
} MALIB_PHRCHECK, *MALIB_PPHRCHECK;
typedef struct _MALIB_MAAUDCNV_INFO
{
UINT8 bSMAFType; /* SMAF Type */
UINT8 bCodeType; /* Code Type */
UINT8 bOptionType; /* Option Type */
UINT8* pConti; /* Top of CNTI */
UINT8* pInfo; /* Top of OPDA */
UINT32 dwSize; /* Size of OPDA */
UINT32 dFs; /* [Hz] */
UINT32 dFormat; /* */
UINT8* pSource; /* Top of Data */
UINT32 dSizeOfSource; /* Size of Data */
} MALIB_MAAUD_INFO, *MALIB_PMAAUD_INFO;
static MALIB_PHRCHECK sPhrase_Check;
static MALIB_PHRINFO sPhrase_Info;
static MALIB_MAAUD_INFO sAudio_Check;
/*=============================================================================
// Function Name : UINT8 _get1b(UINT8** ppBuffer)
//
// Description : Get 1Byte
//
// Argument : ppBuffer ... Pointer which contains the address of data
//
// Return : get value
//
=============================================================================*/
static UINT8 _get1b(
UINT8** ppBuffer
)
{
UINT8 b8;
b8 = **ppBuffer;
(*ppBuffer)++;
return b8;
}
/*=============================================================================
// Function Name : UINT32 _get4b(UINT8** ppBuffer)
//
// Description : Get 4Bytes
//
// Argument : ppBuffer ... Pointer which contains the address of data
//
// Return : get value
//
=============================================================================*/
static UINT32 _get4b(
UINT8** ppBuffer
)
{
UINT32 dw32;
dw32 = (UINT32)(((UINT32)*(*ppBuffer + 0) << 24) | \
((UINT32)*(*ppBuffer + 1) << 16) | \
((UINT32)*(*ppBuffer + 2) << 8) | \
((UINT32)*(*ppBuffer + 3) << 0));
(*ppBuffer) += 4;
return dw32;
}
/*=============================================================================
// Function Name : void malib_PhrChk_InitPhraseInfo(PPHRINFO pPhrInfo)
//
// Description : Initialize PHRINFO structure
//
// Argument : pPhrInfo ... Pointer to PHRINFO structure
//
// Return :
//
=============================================================================*/
static void malib_PhrChk_InitPhraseInfo(
MALIB_PPHRINFO pPhrInfo
)
{
UINT8 i;
pPhrInfo->bPhrNum = 0;
pPhrInfo->bCntiClass = 0;
pPhrInfo->bCntiType = 0;
pPhrInfo->bCodeType = 0;
pPhrInfo->bCopyStatus = 0;
pPhrInfo->bCopyCount = 0;
pPhrInfo->pbCntiOption = NULL;
pPhrInfo->pbOptionChunk = NULL;
pPhrInfo->pbInfoChunk = NULL;
pPhrInfo->pbVoiceChunk = NULL;
pPhrInfo->pbSequenceChunk = NULL;
pPhrInfo->dwCntiOptionSize = 0L;
pPhrInfo->dwOptionDataSize = 0L;
pPhrInfo->dwInfoChunkSize = 0L;
pPhrInfo->dwVoiceChunkSize = 0L;
pPhrInfo->dwSequenceChunkSize = 0L;
pPhrInfo->dwPlayTime = 0L;
pPhrInfo->dwTimer = 0L;
pPhrInfo->dwCurrentTime = 0L;
pPhrInfo->dwDataPosition = 0L;
for(i = 0; i < MALIB_MAX_PHRASE_VOICES; i++)
{
pPhrInfo->VocInfo[i].bBankNo = 0;
pPhrInfo->VocInfo[i].bProgNo = 0;
}
}
/*=============================================================================
// Function Name : void malib_PhrChk_Initialize(UINT8* pBuffer, UINT32 dwSize)
//
// Description : Initialize PHRCHECK structure
//
// Argument : pBuffer ... Pointer to data.
// dwSize ... The Size of data(in Byte).
// Return : pointer to work space
//
=============================================================================*/
static MALIB_PPHRCHECK malib_PhrChk_Initialize(
UINT8* pBuffer,
UINT32 dwSize
)
{
sPhrase_Check.bMode = MALIB_CHKMODE_ENABLE;
sPhrase_Check.wErrStatus = MALIB_PHRASE_DATA_NOERROR;
sPhrase_Check.pbBuffer = pBuffer;
sPhrase_Check.dwSize = dwSize;
sPhrase_Check.pbPhrase = pBuffer;
sPhrase_Check.dwPhraseSize = dwSize;
sPhrase_Check.pbVoice = pBuffer;
sPhrase_Check.dwVoiceSize = dwSize;
sPhrase_Check.pbPhrase = NULL;
sPhrase_Check.dwPhraseSize = 0L;
sPhrase_Check.pPhrInfo = &sPhrase_Info;
malib_PhrChk_InitPhraseInfo(sPhrase_Check.pPhrInfo);
return (&sPhrase_Check);
}
/*=============================================================================
// Function Name : UINT32 PhrChk_CompareID(UINT8* pId, UINT8* pBuffer, UINT32 dwMask)
//
// Description : Compare ID
//
// Argument : pId ... ID
// pBuffer ... Pointer to the data
// dwMask ... Mask
//
// Return : 0 Match ID
// !0 Not Match ID
//
=============================================================================*/
static UINT32 PhrChk_CompareID(
UINT8* pId,
UINT8* pBuffer,
UINT32 dwMask
)
{
UINT32 dw32;
UINT32 dwId;
dwId = (UINT32)(((UINT32)pId[0] << 24) | \
((UINT32)pId[1] << 16) | \
((UINT32)pId[2] << 8) | \
((UINT32)pId[3] << 0));
dw32 = (UINT32)(((UINT32)pBuffer[0] << 24) | \
((UINT32)pBuffer[1] << 16) | \
((UINT32)pBuffer[2] << 8) | \
((UINT32)pBuffer[3] << 0));
dwId &= dwMask;
dw32 &= dwMask;
if(dwId != dw32) {
return (1L);
}
return (0L);
}
/*=============================================================================
// Function Name : UINT16 makeCRC(UINT32 dwSize, UINT8* pBuffer)
//
// Description : Caluclate CRC
//
// Argument : dwSize ... Data size (in Byte)
// pBuffer ... Pointer to the data
//
// Return : CRC
//
=============================================================================*/
UINT16 makeCRC(
UINT32 dwSize,
UINT8* pBuffer
)
{
UINT16 res;
UINT8 data0;
res = 0xFFFFU;
while(--dwSize >= 2L) {
data0 = *pBuffer++;
res = (UINT16)((res << 8) ^ gwCRCTbl[(UINT8)(res >> 8) ^ data0]);
}
return (UINT16)(~res & 0xFFFFU);
}
/*=============================================================================
// Function Name : UINT16 malib_MakeCRC(UINT32 dwSize, UINT8* pBuffer)
//
// Description : Caluclate CRC
//
// Argument : dwSize ... Data size (in Byte)
// pBuffer ... Pointer to the data
//
// Return : CRC
//
=============================================================================*/
UINT16 malib_MakeCRC(
UINT32 dwSize,
UINT8* pBuffer
)
{
return (makeCRC(dwSize, pBuffer));
}
/*=============================================================================
// Function Name : void UINT32 PhrChk_OverallChunkCheck
//
// Description : Check SMAF/Phrase data
//
// Argument : pPhrChk ... Pointer to the checking result
//
// Return : 0 NoError
// !0 Error
//
=============================================================================*/
static UINT32 PhrChk_OverallChunkCheck(
MALIB_PPHRCHECK pPhrChk
)
{
UINT16 wGetCRC;
UINT16 wCalCRC;
UINT32 dwSize;
UINT8* pHead;
static UINT8 bChunkName[5] = "MMMD";
/* Check Size */
if(pPhrChk->dwSize < MALIB_SIZE_OF_CHUNKHEADER + MALIB_SIZE_OF_CRC) {
pPhrChk->wErrStatus |= MALIB_PHRASE_DATA_SIZE;
return (1L);
}
/* Check Header ID */
pHead = pPhrChk->pbBuffer;
if(PhrChk_CompareID(bChunkName, pPhrChk->pbBuffer, 0xFFFFFFFF) != 0L) {
pPhrChk->wErrStatus |= MALIB_PHRASE_DATA_CHUNK;
return (1L);
}
pPhrChk->pbBuffer += 4L;
/* Get Chunk Size */
dwSize = _get4b(&(pPhrChk->pbBuffer));
/* Compare Chunk Size and SMAF size */
if((UINT32)(dwSize + MALIB_SIZE_OF_CHUNKHEADER) != pPhrChk->dwSize) {
pPhrChk->wErrStatus |= MALIB_PHRASE_DATA_SIZE;
return (1L);
}
/* Check CRC */
if(pPhrChk->bMode & MALIB_CHKMODE_ENABLE) {
wCalCRC = makeCRC((UINT32)(pPhrChk->dwSize), pHead);
wGetCRC = (UINT16)(((UINT16)pHead[pPhrChk->dwSize - 2L] << 8) | \
((UINT16)pHead[pPhrChk->dwSize - 1L] << 0));
if(wCalCRC != wGetCRC) {
pPhrChk->wErrStatus |= MALIB_PHRASE_DATA_CRC;
return (1L);
}
}
/* Update */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -