mawavcnv.c

来自「是一个手机功能的模拟程序」· C语言 代码 · 共 989 行 · 第 1/3 页

C
989
字号

/*********************************************************************************
 *	GetContentsData( SINT32 sdFile_id, PMASMW_CONTENTSINFO pvPtr )
 *
 *	Description:
 *			Get loaded contents information
 *	Argument: 
 *			sdFile_id		file id
 *			PMASMW_CONTENTSINFO pvPtr	pointer to struct MASMW_CONTENTSINFO
 *	Return:
 *			>= 0		contents binary data
 *
 ********************************************************************************/
static SINT32 GetContentsData(SINT32 sdFileID, PMASMW_CONTENTSINFO pvPtr)
{
	MAWAVCNV_DBGMSG(("MaWavCnv/ GetContentsData \n"));

	if ( pvPtr->size < 4 ) return MASMW_ERROR_ARGUMENT;

	if ( pvPtr->tag[0] =='W' )
	{
		*(pvPtr->buf ) = 0;
		*(pvPtr->buf + 1 ) = 0;
		*(pvPtr->buf + 2 ) = 0;
		*(pvPtr->buf + 3 ) = 0;

		switch  ( pvPtr->tag[1] ){
		case '0':		/* Get foramt type */
			*(pvPtr->buf) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dFormatType) & 0xFF);
			*(pvPtr->buf + 1) =(UINT8)((gpWavInfo->DataInfo[sdFileID].dFormatType >> 8) & 0xFF);
			*(pvPtr->buf + 2) = 0;
			*(pvPtr->buf + 3) = 0;
			break;
		case '1':		/* Get channel numbers */
			*(pvPtr->buf) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dChannel) & 0xFF);
			*(pvPtr->buf + 1) = 0;
			*(pvPtr->buf + 2) = 0;
			*(pvPtr->buf + 3) = 0;
			break;
		case '2':		/* Get sample rate */
			*(pvPtr->buf) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dFs) & 0xFF);
			*(pvPtr->buf + 1) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dFs >> 8) & 0xFF);
			*(pvPtr->buf + 2) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dFs >> 16) & 0xFF);
			*(pvPtr->buf + 3) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dFs >> 24) & 0xFF);
			break;
		case '3':		/* Get average transmit rate */
			*(pvPtr->buf) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dSamplesPerSec) & 0xFF);
			*(pvPtr->buf + 1) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dSamplesPerSec >> 8) & 0xFF);
			*(pvPtr->buf + 2) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dSamplesPerSec >> 16) & 0xFF);
			*(pvPtr->buf + 3) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dSamplesPerSec >> 24) & 0xFF);
			break;
		case '4':		/* Get data block size */
			*(pvPtr->buf) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dBlock) & 0xFF);
			*(pvPtr->buf + 1) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dBlock >> 8) & 0xFF);
			*(pvPtr->buf + 2) = 0;
			*(pvPtr->buf + 3) = 0;
			break;
		case '5':		/* Get bits par sample */
			*(pvPtr->buf) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dBit) & 0xFF);
			*(pvPtr->buf + 1) = 0;
			*(pvPtr->buf + 2) = 0;
			*(pvPtr->buf + 3) = 0;
			break;
		case '6':		/* Get wave data size */
			*(pvPtr->buf) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dSize) & 0xFF);
			*(pvPtr->buf + 1) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dSize >> 8) & 0xFF);
			*(pvPtr->buf + 2) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dSize >> 16) & 0xFF);
			*(pvPtr->buf + 3) = (UINT8)((gpWavInfo->DataInfo[sdFileID].dSize >> 24) & 0xFF);
			break;

		default:
			return MASMW_ERROR_ARGUMENT;
		}
		return 4;
	}
	return MASMW_ERROR;
}

/*---------------------------------------------------------------------------*/
/*   Functions                                                               */
/*---------------------------------------------------------------------------*/

/*********************************************************************************
 *	Function Name	:	SINT32	MaWavCnv_Initialize(void)
 *
 *	Description		:	Initialize()
 *
 *	Argument		:	none
 *
 *	Return			: 0 : NoError, < 0 : Error
 *********************************************************************************/
SINT32	MaWavCnv_Initialize(void)
{
	int				nIdx;
	PMAWAVCNV_INFO	pWi;

	MAWAVCNV_DBGMSG(("MaWavCnv_Initialize \n"));

	gpWavInfo = &gWavInfo;

	gpWavInfo->sdSeqID	= -1;
	gpWavInfo->dMasterVol	= 100;
	gpWavInfo->bPanpot	= 64;
	gpWavInfo->bPaused	= 0;
	gpWavInfo->dLoops	= 0;
	gpWavInfo->dRepeat	= 1;
	gpWavInfo->sdSeekTime		= 0;
	gpWavInfo->sdCurrentTime	= 0;
	for(nIdx = 0; nIdx < MAWAVCNV_MAX_LOAD; nIdx++) {
		pWi = &(gpWavInfo->DataInfo[nIdx]);
		pWi->bLoaded	= 0;
		pWi->pbData		= NULL;
		pWi->dSize		= 0L;
	}

	return (MASMW_SUCCESS);
}


/*********************************************************************************
 *	Function Name	:	SINT32	MaWavCnv_End(void)
 *
 *	Description		:	Ending()
 *
 *	Argument		:	none
 *
 *	Return			: 0 : NoError, < 0 : Error
 *********************************************************************************/
SINT32	MaWavCnv_End(void)
{
	MAWAVCNV_DBGMSG(("MaWavCnv_End \n"));

	return (MASMW_SUCCESS);
}


/*********************************************************************************
 *	Function Name	: SINT32	MaWavCnv_Convert(void)
 *
 *	Description		: Time count. 
 *					  MaWavCnv_Convert() is called every WAVE_TIMEBASE[ms].
 *
 *	Argument		: none
 *
 *	Return			: 0
 *********************************************************************************/
static SINT32	MaWavCnv_Convert(void)
{
	SINT32	sdFileID = 1;
	
	switch (gpWavInfo->bPaused)
	{
	case 0:	/* normal */
	case 1: /* Pause request */
		gpWavInfo->sdCurrentTime += WAVE_TIMEBASE;
		if ((UINT32)gpWavInfo->sdCurrentTime >= gpWavInfo->DataInfo[sdFileID].dLength)
		{
			if (gpWavInfo->dRepeat == 0)
			{
				/* Infinity loop */
				MaSndDrv_ControlSequencer(gpWavInfo->sdSeqID, 0);
				MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_OFF, 0, 0, 0);

				/* Call Callback function */
				MaSound_ReceiveMessage(gpWavInfo->sdSeqID, sdFileID, MASMW_REPEAT);

				gpWavInfo->sdSeekTime = 0;
				gpWavInfo->sdCurrentTime = 0;
				MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_PANPOT, 0, gpWavInfo->bPanpot, 0);
				MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_ON, 0, 0, 127);
				MaSndDrv_ControlSequencer(gpWavInfo->sdSeqID, 1);
			}
			else
			{
				/* Looping */
				gpWavInfo->dLoops++;
				if (gpWavInfo->dLoops < gpWavInfo->dRepeat)
				{
					MaSndDrv_ControlSequencer(gpWavInfo->sdSeqID, 0);
					MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_OFF, 0, 0, 0);

					/* Call Callback function */
					MaSound_ReceiveMessage(gpWavInfo->sdSeqID, sdFileID, MASMW_REPEAT);

					gpWavInfo->sdSeekTime = 0;
					gpWavInfo->sdCurrentTime = 0;
					MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_PANPOT, 0, gpWavInfo->bPanpot, 0);
					MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_ON, 0, 0, 127);
					MaSndDrv_ControlSequencer(gpWavInfo->sdSeqID, 1);
				}
				else
				{
					/* finish playing */
					MaSndDrv_ControlSequencer(gpWavInfo->sdSeqID, 0);
					MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_OFF, 0, 0, 0);

					/* Call Callback function */
					MaSound_ReceiveMessage(gpWavInfo->sdSeqID, sdFileID, MASMW_END_OF_SEQUENCE);

					gpWavInfo->sdSeekTime = 0;
					gpWavInfo->dLoops = 0;
					return (0);
				}
			}
		}

		if (gpWavInfo->bPaused == 0) return (0);

		/* Pause request */
		MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_OFF, 0, 0, 0);
		gpWavInfo->sdSeekTime = gpWavInfo->sdCurrentTime;
		gpWavInfo->bPaused = 3;
		break;

	case 2:	/* Restart request */
		MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_SEEK, 0, 0, GetBytePos(sdFileID, gpWavInfo->sdSeekTime));
		MaSndDrv_SetCommand(gpWavInfo->sdSeqID, -1, MASNDDRV_CMD_STREAM_ON, 0, 0, 127);
		gpWavInfo->bPaused = 0;
		break;
	}
	
	return (0);
}


/*********************************************************************************
 *	Function Name	:	SINT32	MaWavCnv_Load(UINT8* file_ptr, UINT32 file_size, UINT32 mode,
 *												SINT32 (*func)(UINT8 id), void* pvExtArgs)
 *
 *	Description		:	Load()
 *
 *	Argument		:	pbFilePtr	: pointer to the data
 *						dFileSize	: size fo the data
 *						dMode		: error check (0:No, 1:Yes, 2:Check)
 *						func		: pointer of rhe callback function
 *						pvExtArgs	: NULL
 *
 *	Return			: >= 0 : File ID, < 0 : Error
 *********************************************************************************/
SINT32	MaWavCnv_Load(UINT8* pbFilePtr, UINT32 dFileSize, UINT32 dMode, SINT32 (*func)(UINT8 id), void* pvExtArgs)
{
	SINT32	sdFileID;
	SINT32	sdRet;

	(void)func;
	(void)pvExtArgs;

	MAWAVCNV_DBGMSG(("MaWavCnv_Load[%08lX %08lX %02X] \n", pbFilePtr, dFileSize, dMode));

	if (pbFilePtr == NULL)	return (MASMW_ERROR);
	if (dFileSize == 0)		return (MASMW_ERROR);

	sdFileID = ((dMode < 2) ? 1 : 0);
	if(sdFileID == 0) {
		/*	load OK!!	*/
		gpWavInfo->DataInfo[0].bLoaded	= 0;
		gpWavInfo->DataInfo[0].pbData	= NULL;
		gpWavInfo->DataInfo[0].dSize	= 0L;
	}
	else {
		/*	Already loaded!!	*/
		if(gpWavInfo->DataInfo[sdFileID].bLoaded == 1) {
			return (MASMW_ERROR);
		}
	}

	/*	Format check	*/
	sdRet = WAVEChecker(sdFileID, pbFilePtr, dFileSize, dMode);
	if(sdRet < 0) return (sdRet);

	/*	Load Successful	*/
	gpWavInfo->DataInfo[sdFileID].bLoaded = 1;

	return (sdFileID);
}


/*********************************************************************************
 *	Function Name	:	SINT32	MaWavCnv_Unload(SINT32 sdFileID, void* pvExtArgs)
 *
 *	Description		:	Unload()
 *
 *	Argument		:	sdFileID		: File ID
 *						pvExtArgs	: NULL
 *
 *	Return			: 0 : NoError, < 0 : Error
 *********************************************************************************/
SINT32	MaWavCnv_Unload(SINT32 sdFileID, void* pvExtArgs)
{
	(void)pvExtArgs;

	MAWAVCNV_DBGMSG(("MaWavCnv_Unload[%d] \n", sdFileID));

	if(	(sdFileID < 0)					||
		(MAWAVCNV_MAX_LOAD <= sdFileID)	||
		(gpWavInfo->DataInfo[sdFileID].bLoaded == 0))
	{
		return (MASMW_ERROR);
	}

	gpWavInfo->DataInfo[sdFileID].bLoaded	= 0;
	gpWavInfo->DataInfo[sdFileID].pbData	= NULL;
	gpWavInfo->DataInfo[sdFileID].dSize		= 0L;

	return (MASMW_SUCCESS);
}


/*********************************************************************************
 *	Function Name	:	MaWavCnv_Open(SINT32 sdFileID, void* pvExtArgs)
 *
 *	Description		:	Open()
 *
 *	Argument		:	sdFileID		: File ID
 *						pvExtArgs	: NULL
 *
 *	Return			: 0 : NoError, < 0 : Error
 *********************************************************************************/
SINT32	MaWavCnv_Open(SINT32 sdFileID, void* pvExtArgs)
{
	SINT32	sdRet = MASMW_SUCCESS;
	UINT32	dRam;
	UINT32	dSize;
	(void)pvExtArgs;

	MAWAVCNV_DBGMSG(("MaWavCnv_Open[%d] \n", sdFileID));

	if(	(sdFileID < 1)					||
		(MAWAVCNV_MAX_LOAD <= sdFileID)	||
		(gpWavInfo->DataInfo[sdFileID].bLoaded == 0))

⌨️ 快捷键说明

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