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

📄 maphrcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			(gApiInfo[bSlave].slave == 0)	&&				/*	Not have slaves	*/
			(pMaster->dwPlayTime == pSlave->dwPlayTime))	/*	same playtime	*/
		{
			gApiInfo[bSlave].master_channel = phr_id;
			gApiInfo[phr_id].slave |= (UINT32)(1L << bSlave);
			MAPHRCNV_DBGMSG(("Successful : Register bind[%02X %08lX] \n", 
				gApiInfo[bSlave].master_channel,gApiInfo[phr_id].slave));
		} else if(gApiInfo[bSlave].master_channel == phr_id) {
			MAPHRCNV_DBGMSG(("Successful : Already bind[%08lX] \n", bSlave));
		} else {
			MAPHRCNV_DBGMSG(("Error : Register bind \n"));
			return (MASMW_ERROR);
		}
	}
	/*	Cancel bind	*/
	else {
		MAPHRCNV_DBGMSG(("Cancel bind [%08lX] \n", gApiInfo[phr_id].slave));
		for(i = 0; i < MAX_PHRASE_CHANNEL; i++) {
			if(gApiInfo[phr_id].slave & (UINT32)(0x01 << i)) {
				if(gApiInfo[i].status != ID_STATUS_READY)	return (MASMW_ERROR);
			}
		}
		for(i = 0; i < MAX_PHRASE_CHANNEL; i++) {
			if(gApiInfo[phr_id].slave & (UINT32)(0x01 << i)) {
				gApiInfo[i].master_channel = -1;
			}
		}

		gApiInfo[phr_id].slave = 0L;
	}

	return (MASMW_SUCCESS);
}

/***** Phrase Wrapper - static ***********************************************/

/*==============================================================================
//	void	InitApiInfo(int ch)
//
//	description	:	Initialize APIINFO
//
//	argument	:	ch ...	channel(0..3)
//
//	return		:
//
//============================================================================*/
static void	InitApiInfo(int ch)
{
	PAPIINFO	pAi;

	if((ch < 0) || (MAX_PHRASE_DATA <= ch)) return;

	pAi = &(gApiInfo[ch]);
	pAi->status			= ID_STATUS_NODATA;
	pAi->file_id		= -1L;
	pAi->vol			= 100;
	pAi->pan			= 64;
	pAi->loop			= 0;
	pAi->master_channel	= -1;
	pAi->slave			= 0L;
	pAi->length			= 0L;
	pAi->pos			= 0L;
	if (ch == 4)
		pAi->gdwRamAddr = 0xFFFFFFFF;
	else {
		if (gPhrRamSize != 0)
			pAi->gdwRamAddr = (UINT32)(gPhrRamAdrs + (0x400 * ch));
		else
			pAi->gdwRamAddr = 0xFFFFFFFF;
	}

}

/*==============================================================================
//	UINT32	SetMasterChannel(int ch, int master_channel)
//
//	description	:	set master channel
//
//	argument	:	ch				...	channel(0..3)
//					master_channel	... channel(0..3)
//
//	return		:
//============================================================================*/
static UINT32	SetMasterChannel(int ch, int master_channel)
{
	if(gdwSlave & (0x01 << ch))					return(1L);
	if(gApiInfo[ch].slave != 0L)				return(1L);

	gApiInfo[ch].master_channel = master_channel;
	gdwSlave |= (UINT32)(1L << ch);

	return (0L);
}

/*==============================================================================
//	SINT32 CallBack(int ch, UINT8 id)
//
//	description	:
//
//	argument	:	ch				...	channel(0..3)
//					id				...	event
//
//	return		:
//					0 meanes no error.
//============================================================================*/
static SINT32	CallBack(int ch, UINT8 id)
{
	struct event	eve;

	/*---	check channel ----------------------------------------------------*/
	if((ch < 0) || (MAX_PHRASE_CHANNEL <= ch))	return (SINT32)(-1L);

	eve.ch		= ch;
	eve.mode	= 0x80;

	switch(id)
	{
	case 0x7F :
		gApiInfo[ch].status = ID_STATUS_READY;
		eve.mode = -0x01;
		break;
	case 0x7E :
		eve.mode = -0x02;
		break;
	case 0x00 :
	case 0x01 :
	case 0x02 :
	case 0x03 :
	case 0x04 :
	case 0x05 :
	case 0x06 :
	case 0x07 :
	case 0x08 :
	case 0x09 :
	case 0x0A :
	case 0x0B :
	case 0x0C :
	case 0x0D :
	case 0x0E :
	case 0x0F :
		eve.mode = (int)id;
		break;
	}

	if((eve.mode != 0x80) && (gEvHandler != NULL)) {
		gEvHandler(&eve);
	}

	return (0L);
}

/*==============================================================================
//	SINT32 CallBack_Service1(UINT8 id)
//
//	description	:
//
//	argument	:	id				... event
//
//	return		:
//					0 meanes no error.
//============================================================================*/
static SINT32 CallBack_Service1(UINT8 id)
{
	return (CallBack(0, id));
}

/*==============================================================================
//	SINT32 CallBack_Service2(UINT8 id)
//
//	description	:
//
//	argument	:	id				... event
//
//	return		:
//					0 meanes no error.
//============================================================================*/
static SINT32 CallBack_Service2(UINT8 id)
{
	return (CallBack(1, id));
}

/*==============================================================================
//	SINT32 CallBack_Service3(UINT8 id)
//
//	description	:
//
//	argument	:	id				... event
//
//	return		:
//					0 meanes no error.
//============================================================================*/
static SINT32 CallBack_Service3(UINT8 id)
{
	return (CallBack(2, id));
}

/*==============================================================================
//	SINT32 CallBack_Service4(UINT8 id)
//
//	description	:
//
//	argument	:	id				... event
//
//	return		:
//					0 meanes no error.
//============================================================================*/
static SINT32 CallBack_Service4(UINT8 id)
{
	return (CallBack(3, id));
}


/***** Common Function *******************************************************/

/*==============================================================================
//	int	ResourceCreate(void)
//
//	description	:	call MaSndDrv_Create().
//
//	argument	:
//
//	return		:
//					0 meanes no error.
//============================================================================*/
static SINT32 ResourceCreate(void)
{
	UINT32	Ram;
	UINT32	Size;

	gdwPhrId = MaSndDrv_Create(	(UINT8)1,
	            (UINT8)PHRASE_TIMEBASE, /* 20msec */
	            (UINT8)0x15,  /* Durum setting ... MA-1/2 Compatible mode */
	                          /* DVA setting ... Compulsion mono mode */
	                          /* Melody setting ... Standard mode */
	            (UINT8)16,    /* Resource mode */
	            (UINT8)0,     /* Number of Streams */
	                   MaPhrCnv_Convert,  /* Call back function */
	                   &gPhrRamAdrs,      /* Starting sddress of RAM */
	                   &gPhrRamSize);     /* Size of RAM */

	if (gdwPhrId < 0L) {
		gdwPhrId = -1L;
		gPhrRamAdrs = 0xFFFFFFFF;
		gPhrRamSize = 0;
		return (-1);
	}

	gSeqID = MaSndDrv_Create(
				(UINT8)MASMW_SEQTYPE_AUDIO,		/* AudioMode                     */
				(UINT8)MASMW_AUDIO_BASETIME,	/* Timer Setting                 */
				(UINT8)0,						/* Option : ---                  */
				(UINT8)1,						/* ResMode                       */
				(UINT8)1,						/* Num of Stream                 */
				MaAudCnv_Convert,				/* Callback Fn                   */
				&Ram,							/* Top Address of Reseved RAM    */
				&Size);							/* Size of Reserved RAM          */

	if (gSeqID < 0L) {
		MaSndDrv_Free(gdwPhrId);
		gdwPhrId = -1L;
		gSeqID = -1L;
		gPhrRamAdrs = 0xFFFFFFFF;
		gPhrRamSize = 0;
		return (-1);
	}

	MAPHRCNV_DBGMSG(("  ResourceCreate [%d %d]\n", gdwPhrId, gSeqID));

	return (0);
}

/*==============================================================================
//	int	ResourceFree(void)
//
//	description	:	call MaSndDrv_Free().
//
//	argument	:
//
//	return		:
//					0 meanes no error.
//============================================================================*/
static SINT32 ResourceFree(void)
{

	MaSndDrv_Free(gdwPhrId);
	gdwPhrId = -1L;
	MaSndDrv_Free(gSeqID);
	gSeqID = -1L;

	gPhrRamAdrs = 0xFFFFFFFF;
	gPhrRamSize = 0;

	return (0);
}


/***** Phrase Wrapper - API **************************************************/

/*==============================================================================
//	int	Phrase_Initialize(void)
//
//	description	:	Initialize SMAF/Phrase Sequencer.
//
//	argument	:
//
//	return		:
//					0 meanes no error.
//============================================================================*/
int	Phrase_Initialize(void)
{
	int	ch;
	UINT8 i;

	MAPHRCNV_DBGMSG(("Phrase_Initialize\n"));

	/*---	check SMAF/Phrase stream converter ID ----------------------------*/
	if (gbCreateStatus & MASK_STATUS_PHRASE)	return (-1);

	/*---	MA-3 Sequence Create ---------------------------------------------*/
	if (gbCreateStatus == 0) {
		if (ResourceCreate() < 0L) {
			return (-1);
		}
	}
	gbCreateStatus |= MASK_STATUS_PHRASE;

	/*---	Initialize global values -----------------------------------------*/
	gbPlayStatus = 0x00;
	gbPauseStatus = 0x00;
	gdwCtrlStatus = CTRL_CLEAR_ALL;
	gdwPhrStatus = 0;

	for(ch = 0; ch < MAX_PHRASE_DATA; ch++) {
		InitApiInfo(ch);
	}

	for(i = 0; i < MASMW_NUM_CHANNEL; i++) {
		InitChInfo(i);
	}

	gEvHandler = NULL;
	gdwSlave = 0L;


	/*	set System On & Master Volume	*/
	gdwCtrlStatus |= (CTRL_SYSTEM_ON | CTRL_MASTER_VOLUME);

	MaSndDrv_SetVolume(gdwPhrId, 0x7F);

	return (0);
}

/*==============================================================================
//	int	Phrase_GetInfo(struct info* dat)
//
//	description	:	Get device information.
//
//	argument	:	dat		...	pointer to device information
//
//	return		:
//					0 meanes no error.
//============================================================================*/
int	Phrase_GetInfo(struct info* dat)
{
	MAPHRCNV_DBGMSG(("Phrase_GetInfo[0x%X] \n", dat));

	if(dat == NULL)	return (-1);

	dat->MakerID		= 0x00430000;			/*	YAMAHA	*/
	dat->DeviceID		= 0x06;					/*	MA-3	*/
	dat->VersionID		= 1;
	dat->MaxVoice		= 4;
	dat->MaxChannel		= 4;
	dat->SupportSMAF	= 0x01;					/*	SMAF/Phrase ver1	*/
	dat->Latency		= (long)(20 * 1000);	/*	20msec	*/

	return (0);
}

/*==============================================================================
//	int	Phrase_CheckData(unsigned char* data, unsigned long len)
//
//	description	:	Check SMAF/Phrase data.
//
//	argument	:	data	...	pointer to data.
//					len		...	the size of data(in byte).
//
//	return		:
//					0 meanes no error.
//============================================================================*/
int	Phrase_CheckData(UINT8* data, UINT32 len)
{
	MAPHRCNV_DBGMSG(("Phrase_CheckData [0x%X 0x%X] \n", data, len));

	/*---	check SMAF/Phrase stream converter ID ----------------------------*/
	if(!(gbCreateStatus & MASK_STATUS_PHRASE) || (gdwPhrId == -1L))	return (-1);

	/*---	check arugment ---------------------------------------------------*/
	if((data == NULL) || (len == 0L)) return (-1);

	/*---	check data -------------------------------------------------------*/
	if(MaPhr_Load(MAX_PHRASE_CHANNEL, (UINT8*)data, (UINT32)len, 2, NULL, NULL) < 0L)
		return (-1);

	return (0);
}

/*==============================================================================
//	int	Phrase_SetData(int ch, unsigned char* data, unsigned long len, int check)
//
//	description	:	Check SMAF/Phrase data.
//
//	argument	:	ch		...	channel(0..3)
//					data	...	pointer to data.
//					len		...	the size of data(in byte).
//					check	...	error check enable(1) or disable(0)
//
//	return		:
//					0 meanes no error.
//============================================================================*/
int	Phrase_SetData(int ch, unsigned char* data, unsigned long len, int check)
{
	MAPHRCNV_DBGMSG(("Phrase_SetData [%d 0x%X 0x%X %d] \n", ch, data, len, check));


	/*---	check SMAF/Phrase stream converter ID ----------------------------*/
	if(!(gbCreateStatus & MASK_STATUS_PHRASE) || (gdwPhrId == -1L))	return (-1);

	/*---	check channel ----------------------------------------------------*/
	if((ch < 0) || (MAX_PHRASE_CHANNEL <= ch))	return (-1);

	/*---	check arugment ---------------------------------------------------*/
	if((data == NULL) || (len == 0L)) return (-1);

	/*---	check status (Is status NODATA?) ---------------------------------*/
	if(gApiInfo[ch].status != ID_STATUS_NODATA) return (-1);

	/*---	check data -------------------------------------------------------*/
	if (MaPhr_Load((

⌨️ 快捷键说明

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