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

📄 mahvsw.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************
 *
 *		Copyright (C) 2003	YAMAHA CORPORATION. All rights reserved.
 *
 *		Module		: mahvsw.c
 *
 *		Description	: MA HV Sequence Wrapper
 *
 *		Version		: 2.0.0 	2003.07.14
 *
 ****************************************************************************/
#include "masndseq.h"
#include "masnddrv.h"

/****************************************************************************
 *	macro
 ****************************************************************************/
#define	MAHVSW_MAKEDWORD(a, b, c, d)	(UINT32)(((UINT32)(a) << 24) | \
						((UINT32)(b) << 16) | ((UINT32)(c) << 8) | (UINT32)(d))

/****************************************************************************
 *	define
 ****************************************************************************/
#define	MAHVSW_MAX_CALLBACK			(3)
#define	MAHVSW_MAX_VOICE			(16)
#define	MAHVSW_MAX_SCRIPT			(64)
#define	MAHVSW_NOTE_OFF				(191)
#define	MAHVSW_MIN_NOTE				(192)
#define	MAHVSW_MAX_NOTE				(MAHVSW_MIN_NOTE + MAHVSW_MAX_SCRIPT)
#define	MAHVSW_SIZE_OF_CHUNKHEADER	(8)

/****************************************************************************
 *	function
 ****************************************************************************/
static SINT32 CallBack_Dummy0(UINT8);
static SINT32 CallBack_Dummy1(UINT8);
static SINT32 CallBack_Dummy2(UINT8);

/****************************************************************************
 *	typedef
 ****************************************************************************/
typedef struct _tagMAHVSWHOOK
{
	SINT32	sdFuncId;
	SINT32	sdFileId;
	SINT32	(*pfnCallbackFunc)(UINT8);
} MAHVSWHOOK, *PMAHVSWHOOK;

typedef struct _tagMAHVSWDATA
{
	UINT8*	pbData;
	UINT32	dSize;
} MAHVSWDATA, *PMAHVSWDATA;

typedef struct _tagMAHVSWINFO
{
	SINT32		sdFuncId;						/*	*/
	SINT32		sdFileId;						/*	*/
	SINT32		sdHvFuncId;						/*	HV func ID				*/
	SINT32		sdHvFileId;						/*	HV file ID				*/
	UINT32		dVolume;						/*	volume		default:100	*/
	UINT32		dHvVolume;						/*	HV volume	default:127	*/
	SINT32		sdKey;							/*	key			default:0	*/
	SINT32		sdKeyCon;						/*	key control 0:disable 1:enable	*/
	MAHVSWHOOK	sHook[MAHVSW_MAX_CALLBACK];		/*	original callback function	*/
	MAHVSWDATA	sData[MAHVSW_MAX_SCRIPT];
	SINT32		sdDefaultHvLanguage;			/*	Default Language		*/
} MAHVSWINFO, *PMAHVSWINFO;

/****************************************************************************
 *	gloval values
 ****************************************************************************/
static MAHVSWINFO	gHvswInfo;

/****************************************************************************
 *	gloval tables
 ****************************************************************************/
static const SINT32 gsdHookId[MASMW_NUM_SRMCNV] = {
	-1, 0, -1, -1, -1, 1, 2, -1, -1, -1, -1, -1, -1
};

static SINT32	(*gpfnCallback[MAHVSW_MAX_CALLBACK])(UINT8) = {
	CallBack_Dummy0,
	CallBack_Dummy1,
	CallBack_Dummy2
};

/****************************************************************************
 *	IsHookFunc
 *
 *	Function:
 *			examine whether hook or not hook callback function.
 *	Argument:
 *			sdFuncId	... Function number.
 *	Return:
 *			>=0	success.
 *			<0	error.
 *
 ****************************************************************************/
static SINT32	IsHookFunc(SINT32 sdFuncId)
{
	if(sdFuncId < 0)					return (-1);
	if(MASMW_NUM_SRMCNV <= sdFuncId)	return (-1);

	return (gsdHookId[sdFuncId]);
}

/****************************************************************************
 *	MixVolume
 *
 *	Function:
 *			Mix master & HV volume.
 *	Argument:
 *			None
 *	Return:
 *			Mixed Volume(0..127)
 *
 ****************************************************************************/
static UINT32 MixVolume(void)
{
	UINT32	dVolume		= gHvswInfo.dVolume;
	UINT32	dHvVolume	= gHvswInfo.dHvVolume;

	if(dVolume > 127)	dVolume		= 127;
	if(dHvVolume > 127)	dHvVolume	= 127;

	return (MaSndDrv_Mix40LogVol(dVolume, dHvVolume));
}

/****************************************************************************
 *	GetLanguageType
 *
 *	Function:
 *			Get HV languate type.
 *	Argument:
 *			pbData	pointer to HV script.
 *			None	HV script size.
 *	Return:
 *			>=0	success.
 *			<0	error.
 *
 ****************************************************************************/
static SINT32 GetLanguageType(UINT8* pbData, UINT32 dSize)
{
	SINT32	sdHvType;

	if(pbData == NULL)	return (MASMW_ERROR_ARGUMENT);
	if(dSize < 4)		return (MASMW_ERROR_ARGUMENT);

	sdHvType = MASMW_HVTYPE_NONE;

	if(	(pbData[0] == 'H')	&&
		(pbData[1] == 'V')	&&
		(pbData[2] == '#')) {

		switch(pbData[3]) {
		case 'J' :
			sdHvType = MASMW_HVTYPE_JAPANESE;
			break;
		case 'K' :
			sdHvType = MASMW_HVTYPE_KOREAN;
			break;
		}
	}

	MASNDSEQ_DBGMSG(("Language Type %d \n", sdHvType));
	return (sdHvType);
}

/****************************************************************************
 *	GetFisrtLanguageType
 *
 *	Function:
 *			Get HV languate type.
 *	Argument:
 *			pbData	pointer to data buffer.
 *			None	data buffer size.
 *	Return:
 *			>=0	success.
 *			<0	error.
 *
 ****************************************************************************/
static SINT32 GetFirstLanguageType(UINT8* pbData, UINT32 dSize)
{
	SINT32	sdLangType;
	UINT32	dId;
	UINT32	dChunkId;
	UINT32	dChunkSize;

	if(pbData == NULL)								return (MASMW_ERROR_ARGUMENT);
	if(dSize < (UINT32)MAHVSW_SIZE_OF_CHUNKHEADER)	return (MASMW_ERROR_ARGUMENT);

	while(dSize >= (UINT32)MAHVSW_SIZE_OF_CHUNKHEADER) {
		dChunkId	= MAHVSW_MAKEDWORD(pbData[0], pbData[1], pbData[2], pbData[3]);
		dChunkSize	= MAHVSW_MAKEDWORD(pbData[4], pbData[5], pbData[6], pbData[7]);

		/*	Check chunk size	*/
		if(dSize < (UINT32)(MAHVSW_SIZE_OF_CHUNKHEADER + dChunkSize)) {
			return (MASMW_ERROR_CHUNK_SIZE);
		}

		pbData	+= (UINT32)MAHVSW_SIZE_OF_CHUNKHEADER;
		dSize	-= (UINT32)MAHVSW_SIZE_OF_CHUNKHEADER;

		if((dChunkId & 0xFFFFFF00) == MAHVSW_MAKEDWORD('M', 's', 'c', 0)) {
			dId = (dChunkId & 0x000000FF);
			if(dId < MAHVSW_MAX_SCRIPT) {
				sdLangType = GetLanguageType(pbData, dChunkSize);
				return (sdLangType);
			}
		}

		pbData	+= dChunkSize;
		dSize	-= dChunkSize;
	}

	return (MASMW_ERROR);
}

/****************************************************************************
 *	LoadHvScript
 *
 *	Function:
 *			Get HV scripts .
 *	Argument:
 *			pbData	pointer to data buffer.
 *			None	data buffer size.
 *	Return:
 *			>=0	success.
 *			<0	error.
 *
 ****************************************************************************/
static SINT32 LoadHvScript(UINT8* pbData, UINT32 dSize)
{
	UINT32	dId;
	UINT32	dChunkId;
	UINT32	dChunkSize;

	if(pbData == NULL)								return (MASMW_ERROR_ARGUMENT);
	if(dSize < (UINT32)MAHVSW_SIZE_OF_CHUNKHEADER)	return (MASMW_ERROR_ARGUMENT);

	while(dSize >= (UINT32)MAHVSW_SIZE_OF_CHUNKHEADER) {
		dChunkId	= MAHVSW_MAKEDWORD(pbData[0], pbData[1], pbData[2], pbData[3]);
		dChunkSize	= MAHVSW_MAKEDWORD(pbData[4], pbData[5], pbData[6], pbData[7]);

		/*	Check chunk size	*/
		if(dSize < (UINT32)(MAHVSW_SIZE_OF_CHUNKHEADER + dChunkSize)) {
			return (MASMW_ERROR_CHUNK_SIZE);
		}

		if((dChunkId & 0xFFFFFF00) == MAHVSW_MAKEDWORD('M', 's', 'c', 0)) {
			dId = (dChunkId & 0x000000FF);
			if(dId < MAHVSW_MAX_SCRIPT) {
				gHvswInfo.sData[dId].pbData	= (pbData + MAHVSW_SIZE_OF_CHUNKHEADER);
				gHvswInfo.sData[dId].dSize	= dChunkSize;
			}
		}

		pbData	+= dChunkSize + (UINT32)MAHVSW_SIZE_OF_CHUNKHEADER;
		dSize	-= dChunkSize + (UINT32)MAHVSW_SIZE_OF_CHUNKHEADER;
	}

	return (MASMW_SUCCESS);
}

/****************************************************************************
 *	MaHvsw_Initialize
 *
 *	Function:
 *			Initialize MAHVSWINFO structure.
 *	Argument:
 *			None
 *	Return:
 *			None
 *
 ****************************************************************************/
static void	MaHvsw_Initialize(void)
{
	UINT32			i;
	PMAHVSWDATA		pData;

	/*	for target format	*/
	gHvswInfo.sdFuncId		= -1;
	gHvswInfo.sdFileId		= -1;

	/*	for HV	*/
	gHvswInfo.sdHvFuncId	= -1;
	gHvswInfo.sdHvFileId	= -1;
	gHvswInfo.dVolume		= 100;
	gHvswInfo.dHvVolume		= 127;
	gHvswInfo.sdKey			= 0;
	gHvswInfo.sdKeyCon		= 0;

	/*	initialize HV script information	*/
	for(i = 0; i < MAHVSW_MAX_SCRIPT; i++) {
		pData = &(gHvswInfo.sData[i]);
		pData->pbData	= NULL;
		pData->dSize	= 0;
	}
}

/****************************************************************************
 *	MaHvsw_HvNoteOn
 *
 *	Function:
 *			Play HV.
 *	Argument:
 *			dId		HV Sequence Number(0..63)
 *			dEvent	Event Number
 *	Return:
 *			0	success.
 *			<0	error code.
 *
 ****************************************************************************/
static SINT32	MaHvsw_HvNoteOn(UINT32 dId)
{
	UINT8		bVolume;
	SINT8		sbKey;
	SINT32		sdRet;
	SINT32		sdFuncId = gHvswInfo.sdHvFuncId;
	SINT32		sdFileId;
	PMAHVSWDATA	psData = &(gHvswInfo.sData[dId]);

	if((sdFuncId < 0L) || (psData->pbData == NULL) || (psData->dSize == 0L)) {
		return (MASMW_ERROR);
	}
	/*	load HV script	*/
	sdRet = __MaSound_Load(sdFuncId, psData->pbData, psData->dSize, 1, NULL, NULL);
	if(sdRet < MASMW_SUCCESS) {
		return (sdRet);
	}
	/*	open HV script	*/
	sdFileId = sdRet;
	sdRet = __MaSound_Open(sdFuncId, sdFileId, 0, NULL);
	if(sdRet < MASMW_SUCCESS) {
		__MaSound_Unload(sdFuncId, sdFileId, NULL);
		return (sdRet);
	}
	/*	standby HV script	*/
	sdRet = __MaSound_Standby(sdFuncId, sdFileId, NULL);
	if(sdRet < MASMW_SUCCESS) {
		__MaSound_Close(sdFuncId, sdFileId, NULL);
		__MaSound_Unload(sdFuncId, sdFileId, NULL);
		return (sdRet);
	}
	/*	set volume	*/
	bVolume = (UINT8)MixVolume();
	__MaSound_Control(sdFuncId, sdFileId, MASMW_SET_VOLUME, &bVolume, NULL);
	/*	set key control	*/
	if(gHvswInfo.sdKeyCon) {
		/*	enable key control	*/
		sbKey = (SINT8)(gHvswInfo.sdKey);
		__MaSound_Control(sdFuncId, sdFileId, MASMW_SET_KEYCONTROL, &sbKey, NULL);
	}
	/*	start HV script	*/
	sdRet = __MaSound_Start(sdFuncId, sdFileId, 1, NULL);
	if(sdRet < MASMW_SUCCESS) {
		__MaSound_Close(sdFuncId, sdFileId, NULL);
		__MaSound_Unload(sdFuncId, sdFileId, NULL);
		return (sdRet);
	}

	/*	remember HVS file id	*/
	gHvswInfo.sdHvFileId = sdFileId;

	return (MASMW_SUCCESS);
}

/****************************************************************************
 *	MaHvsw_HvNoteOff
 *
 *	Function:
 *			Stop HV.
 *	Argument:
 *			none
 *	Return:
 *			0	success.
 *			<0	error code.
 *
 ****************************************************************************/
static SINT32	MaHvsw_HvNoteOff(void)
{
	SINT32	sdRet;
	SINT32	sdFuncId = gHvswInfo.sdHvFuncId;
	SINT32	sdFileId = gHvswInfo.sdHvFileId;

	/*	check func & file id	*/
	if((sdFuncId < 0L) || (sdFileId < 0L)) {
		return (MASMW_ERROR_ID);

⌨️ 快捷键说明

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