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

📄 mammfcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			pswPNode[dEmpty] = (SINT16)dIndex;
			dIndex = dEmpty;
			dEmpty ++;
		}
		else {
			dNode --;
			bTemp = Decode_Getbits(psHuf);
			if (psHuf->dReadSize >= psHuf->dMtsqSize)
				return MMF_HUFFMAN_TREE_FAILURE;

			if (pswLeft[dIndex] == -1)
				pswLeft[dIndex]	= (SINT16)bTemp;
			else {
				pswRight[dIndex]= (SINT16)bTemp;
				while ((pswRight[dIndex] != -1) && (dIndex != 0))
					dIndex = (UINT32)pswPNode[dIndex];
			}
		}
	}

	for (i = 0; i < 256; i++) {
		if (pswLeft[i]	== -1)
			pswLeft[i]	= 0;
		if (pswRight[i]	== -1)
			pswRight[i]	= 0;
	}
	return MMF_HUFFMAN_TREE_SUCCESS;
}


/*********************************************************************************
 *	Decode_init
 *
 *	Description:
 *			make MA-3 huffman decode tree
 *	Argument:
 *			psHuf			pointer to huffman information structure
 *	Return:
 *			!0				success(sequence data size)
 *			0				error
 ********************************************************************************/
static UINT32			Decode_init(
	PHUFFMANINFO		psHuf
)
{
	UINT32				dSeqSize;

	if (psHuf->dMtsqSize <= 5) {
		return MMF_HUFFMAN_TREE_FAILURE;
	}

	dSeqSize = get_4byte(psHuf->psBuffer);
	psHuf->psBuffer += 4;
	psHuf->dReadSize = 4;
	psHuf->sbBitC = 0;
	psHuf->bByte  = 0;
	if (Decode_tree(psHuf) == MMF_HUFFMAN_TREE_FAILURE)
		return MMF_HUFFMAN_TREE_FAILURE;
	else
		return dSeqSize;
}


/*********************************************************************************
 *	decode_byte3L
 *
 *	Description:
 *			get 1 byte (from compressed data)
 *	Argument:
 *			psHuf			pointer to huffman information structure
 *	Return:
 *			UINT8			success(read data)
 *			0				error code
 ********************************************************************************/
static UINT8			decode_byte3L(
	PHUFFMANINFO		psHuf
)
{
	UINT32				bData, bIndex;

	bIndex = 256;
	while (bIndex >= 256) {
		if (--psHuf->sbBitC < 0) {
			psHuf->dReadSize ++;
			if (psHuf->dReadSize > psHuf->dMtsqSize)
				return 0;
			psHuf->sbBitC	= 7;
			psHuf->bByte	= *(psHuf->psBuffer++);
		}
		bData = (UINT8)(psHuf->bByte & abBitMaskTable1[psHuf->sbBitC]);
		if (bData)
			bIndex = psHuf->swRight[bIndex];
		else
			bIndex = psHuf->swLeft[bIndex];
	}
	return (UINT8)bIndex;
}


/*********************************************************************************
 *	decode_byte3
 *
 *	Description:
 *			get 1 byte (from compressed data)
 *	Argument:
 *			nothing
 *	Return:
 *			UINT8			success(read data)
 ********************************************************************************/
static UINT8			decode_byte3( void )
{
	PHUFFMANINFO		psHuf;
	UINT32				bData, bIndex;

	psHuf = &(gsSmaf_Info.sLoad_Info[1].sHuffman_Info);
	psHuf->dReadSize ++;
	bIndex = 256;
	while (bIndex >= 256) {
		if (--psHuf->sbBitC < 0) {
			psHuf->sbBitC	= 7;
			psHuf->bByte	= *(psHuf->psBuffer++);
		}
		bData = (UINT8)(psHuf->bByte & abBitMaskTable1[psHuf->sbBitC]);
		if (bData)
			bIndex = psHuf->swRight[bIndex];
		else
			bIndex = psHuf->swLeft[bIndex];
	}
	return (UINT8)bIndex;
}


/*********************************************************************************
 *	get_byte3L
 *
 *	Description:
 *			get 1 byte (from normal data)
 *	Argument:
 *			psHuf			pointer to huffman information structure
 *	Return:
 *			UNIT8			success(read data)
 *			0				error code
 ********************************************************************************/
static UINT8			get_byte3L(
	PHUFFMANINFO		psHuf
)
{
	psHuf->dReadSize ++;
	if (psHuf->dReadSize > psHuf->dMtsqSize) {
		return 0;
	}
	return *(psHuf->psBuffer++);
}


/*********************************************************************************
 *	get_byte3
 *
 *	Description:
 *			get 1 byte (from normal data)
 *	Argument:
 *			nothing
 *	Return:
 *			UINT8			success(read data)
 ********************************************************************************/
static UINT8			get_byte3( void )
{
	PHUFFMANINFO		psHuf;

	psHuf = &(gsSmaf_Info.sLoad_Info[1].sHuffman_Info);
	psHuf->dReadSize ++;
	return *(psHuf->psBuffer++);
}


/*********************************************************************************
 *	get_flex3L
 *
 *	Description:
 *			MA-3 sequence data check
 *	Argument:
 *			psLoad			pointer to load information structure
 *			pdRead			pointer to size of flex data
 *	Return:
 *			>=0				success
 *			< 0				error code
 ********************************************************************************/
static SINT32			get_flex3L(
	PLOADINFO			psLoad,
	UINT32*				pdRead
)
{
	UINT32				dTemp, dRead;
	UINT8				bTemp;

	dRead = 1;
	bTemp = psLoad->pfnGetByte( &(psLoad->sHuffman_Info) );
	dTemp = (UINT32)(bTemp & 0x7F);
	while (bTemp & 0x80) {
		if (dRead >= 4)
			return MMF_FUNC_ERROR;
		dRead ++;
		bTemp = psLoad->pfnGetByte( &(psLoad->sHuffman_Info) );
		dTemp = (dTemp << 7) + (UINT32)(bTemp & 0x7F);
	}
	if (dTemp >= MMF_PLAY_TIME_MAX)
		return MMF_FUNC_ERROR;
	*pdRead = dRead;
	return (SINT32)dTemp;
}


/*********************************************************************************
 *	get_flex3
 *
 *	Description:
 *			MA-3 sequence data check
 *	Argument:
 *			nothing
 *	Return:
 *			UINT32			flex value
 ********************************************************************************/
static UINT32			get_flex3( void )
{
	UINT32				dTemp;
	UINT8				bTemp;

	bTemp = gsSmaf_Info.sPlay_Info.pfnGetByte();
	dTemp = (UINT32)(bTemp & 0x7F);
	while (bTemp & 0x80) {
		bTemp = gsSmaf_Info.sPlay_Info.pfnGetByte();
		dTemp = (dTemp << 7) + (UINT32)(bTemp & 0x7F);
	}
	return dTemp;
}


/*********************************************************************************
 *	get_flex5L
 *
 *	Description:
 *			MA-3 sequence data check
 *	Argument:
 *			psLoad			pointer to load information structure
 *			pdRead			pointer to size of flex data
 *	Return:
 *			>=0				success(flex data value)
 *			< 0				error
 ********************************************************************************/
static SINT32			get_flex5L(
	UINT8*				pbBuf,
	UINT32*				pdRead
)
{
	UINT32				dTemp, dRead;
	UINT8				bTemp;

	dRead = 1;
	bTemp = pbBuf[0];
	dTemp = (UINT32)(bTemp & 0x7F);
	while (bTemp & 0x80) {
		if (dRead >= 4)
			return MMF_FUNC_ERROR;
		dRead ++;
		bTemp = pbBuf[dRead - 1];
		dTemp = (dTemp << 7) + (UINT32)(bTemp & 0x7F);
	}
	if (dTemp >= MMF_PLAY_TIME_MAX)
		return MMF_FUNC_ERROR;
	*pdRead = dRead;
	return (SINT32)dTemp;
}


/*********************************************************************************
 *	SeqData_Check3
 *
 *	Description:
 *			MA-3 sequence data check
 *	Argument:
 *			psLoad			pointer to load information structure
 *			bSmafType		SMAF type
 *	Return:
 *			0				success
 *			< 0				error code
 ********************************************************************************/
static SINT32			SeqData_Check3(
	PLOADINFO			psLoad,
	UINT8				bSmafType
)
{
	PTRACKINFO			psTrk;
	PPHRASEINFO			psPhr;
	PHUFFMANINFO		psHuf;
	UINT32				dIndex, fdPhrase, dSize, dPast, dGate, dReadSize, i;
	UINT32				dStartTick, dStopTick;
	SINT32				sdTemp;
	UINT8				bTemp;

	if (bSmafType == MMF_SMAF_TYPE_MA3) {			/* MA-3		*/
		psTrk		= &(psLoad->sTrack_Info[5]);
		dStartTick	= MMF_STSP_TIME_NULL;
		dStopTick	= MMF_STSP_TIME_NULL;
	}
	else {											/* MA-5		*/
		psTrk		= &(psLoad->sTrack_Info[6]);
		dStartTick	= psTrk->dStartTick;
		dStopTick	= psTrk->dStopTick;
		psTrk->dStartTick	= MMF_STSP_TIME_NULL;
		psTrk->dStopTick	= MMF_STSP_TIME_NULL;
	}

	psPhr	= &(psLoad->sPhrase_Info[0]);
	psHuf	= &(psLoad->sHuffman_Info);
	fdPhrase= 0;
	dIndex	= 0;
	dPast	= 0;
	dGate	= 0;
	dSize	= psHuf->dSeqSize;

	if (psHuf->dSeqSize == 0) {
		return MMF_ERR_SLENGTH;
	}

	for (i = 0; i < MMF_MAX_PHRASE_INFO; i++) {
		if (psPhr[i].dStartPoint != MMF_STSP_OFFSET_NULL)
			fdPhrase = 1;
	}

/* scanning sequence data to EOS or stop point	*/
	while (dSize >= dIndex) {

		if (psTrk->dStartPoint	== dIndex)
			psTrk->dStartTick	=  dPast;
		if (psTrk->dStopPoint	== dIndex)			/* stop point		*/
			psTrk->dStopTick	=  dPast;
		if (fdPhrase) {
			for (i = 0; i < MMF_MAX_PHRASE_INFO; i++) {
				if (psPhr[i].dStartPoint== dIndex)
					psPhr[i].dStartTick	=  dPast;
				if (psPhr[i].dStopPoint	== dIndex)
					psPhr[i].dStopTick	=  dPast;
			}
		}

		if ((psTrk->dStopTick != MMF_STSP_TIME_NULL) || (dSize == dIndex))
			break;

		sdTemp = get_flex3L(psLoad, &dReadSize);	/* Duration			*/
		if (sdTemp < 0) {
			return MMF_ERR_CHUNK;
		}
		dPast	+= (UINT32)sdTemp;
		if (dPast >= MMF_PLAY_TIME_MAX) {
			return MMF_ERR_LLENGTH;
		}

		if ((UINT32)sdTemp >= dGate)
			dGate = 0;
		else
			dGate -= (UINT32)sdTemp;
		dIndex += dReadSize;

		bTemp = psLoad->pfnGetByte(psHuf);
		dIndex ++;

		switch (bTemp & 0xF0) {
		case 0x90 :
			psLoad->pfnGetByte(psHuf);
			dIndex ++;
		case 0x80 :
			psLoad->pfnGetByte(psHuf);
			dIndex ++;
			sdTemp = get_flex3L(psLoad, &dReadSize);
			if (sdTemp < 0) {
				return MMF_ERR_CHUNK;
			}
			dIndex += dReadSize;
			if ((UINT32)sdTemp > dGate)
				dGate = sdTemp;
			break;
		case 0xA0 :
		case 0xB0 :
		case 0xE0 :
			bTemp = psLoad->pfnGetByte(psHuf);
			dIndex ++;
		case 0xC0 :
		case 0xD0 :
			bTemp = psLoad->pfnGetByte(psHuf);
			dIndex ++;
			break;
		default :
			switch (bTemp) {
			case 0xF0 :
				sdTemp = get_flex3L(psLoad, &dReadSize);
				if (sdTemp < 0) {
					return MMF_ERR_CHUNK;
				}
				for (i = 0; i < (UINT32)sdTemp; i++)
					bTemp = psLoad->pfnGetByte(psHuf);
				if (bTemp != 0xF7) {
					return MMF_ERR_CHUNK;
				}
				dIndex += (UINT32)sdTemp + dReadSize;
				break;
			case 0xFF :
				bTemp = psLoad->pfnGetByte(psHuf);
				dIndex ++;
				switch (bTemp) {
				case 0x00 :
					break;
				case 0x2F :
					bTemp = psLoad->pfnGetByte(psHuf);
					dIndex ++;
					if (bTemp != 0x00) {
						return MMF_ERR_CHUNK;
					}
					dGate = 0;
					psTrk->dStopTick = dPast;
					dIndex = dSize;
					break;
				default :
					return MMF_ERR_CHUNK;
				}
				break;
			default :
				return MMF_ERR_CHUNK;
			}
			break;
		}
		if ((dSize < dIndex) || (psHuf->dReadSize > psHuf->dMtsqSize)) {
			return MMF_ERR_CHUNK;
		}
	}

	if (bSmafType == MMF_SMAF_TYPE_MA3) {			/* MA-3		*/
/* check start point				*/
		if (psTrk->dStartTick == MMF_STSP_TIME_NULL) {
			if (psTrk->dStartPoint != MMF_STSP_OFFSET_NULL) {
				return MMF_ERR_CHUNK;
			}
			psTrk->dStartPoint	= 0;
			psTrk->dStartTick	= 0;
		}
/* check stop point				*/
		if (psTrk->dStopTick == MMF_STSP_TIME_NULL) {
			if (psTrk->dStopPoint != MMF_STSP_OFFSET_NULL) {
				return MMF_ERR_CHUNK;
			}
			psTrk->dStopPoint	= dSize;
			psTrk->dStopTick	= dPast + dGate;
		}
/* adjust phrase information	*/
		for (i = 0; i < MMF_MAX_PHRASE_INFO; i++) {
			if (psPhr[i].dStartPoint <= psTrk->dStartPoint)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -