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

📄 malib.c

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