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

📄 malib.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/*==============================================================================
//	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 + -