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

📄 masnddrv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	}
	else if ( dFormat <= 3 )	/* 8bit PCM */
	{
		if ( dMnSt == 0 )	/* 8bit PCM Mono */
			psStreamParam->wEndPoint	= MASNDDRV_STMPCM_ENDPOINT;
		else				/* 8bit PCM Stereo */
			psStreamParam->wEndPoint	= MASNDDRV_STMPCM_ST_ENDPOINT;
	}
	else	/* 16bit PCM */
	{
		if ( dMnSt == 0 )	/* 16bit PCM Mono */
			psStreamParam->wEndPoint	= MASNDDRV_STM16PCM_ENDPOINT;
		else				/* 16bit PCM Stereo */
			psStreamParam->wEndPoint	= MASNDDRV_STM16PCM_ST_ENDPOINT;
	}
	psStreamParam->bSaId		= (UINT8)dSaId;
	psStreamParam->bVoVolume	= (UINT8)dVoVolume;
	psStreamParam->wPitch		= (UINT16)GetMa5WtPitch( psStreamInfo->dFrequency, 128, 0, 60 );

	return MASMW_SUCCESS;
}
/*--------------------------------------------------------------------------*/

/****************************************************************************
 *	MaSndDrv_UpdateSequence
 *
 *	Description:
 *			Update sequence data.
 *	Arguments:
 *			sdCtrlId	control id number
 *			pbBuf		pointer to the buffer
 *			dBufSize	size of the buffer
 *	Return:
 *			>=0			size of written data
 *			< 0			error code
 *
 ****************************************************************************/
SINT32 MaSndDrv_UpdateSequence
(
	SINT32	sdCtrlId,					/* control id */
	UINT8 *	pbBuf,						/* pointer to the buffer */
	UINT32	dBufSize					/* size of the buffer */
)
{
	UINT32	dTimeOut;					/* time out count */
	UINT32	dReadPtr;
	UINT32	dNum;						/* number of packet data */
	UINT32	dRegIndex;					/* register index number */
	SINT32	sdMessage;					/* message */
	SINT32	sdResult;					/* result of function */
	UINT8  *pbPacketBuf;
	PMASNDDRVSEQBUFINFO	psSeqbufInfo;
	static const UINT8 bStopPacket[4] = { 0x80,
										 (UINT8)(MAC_SEQ_STOP & 0x7F), 
										 (UINT8)(MAC_SEQ_STOP >> 7) | 0x80, 
										 0x81
										};

	MASNDDRV_DBGMSG(("MaSndDrv_UpdateSequence\n"));

	switch ( sdCtrlId )
	{
	  case MASNDDRV_UPDATE_FIFO: /* Software Buffer */
	  	if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_DELAYED].bStatus == MASNDDRV_STATUS_IDLE )
	  		return 0;
	  	
	  	MASMW_ASSERT( pbBuf != NULL );
	  	MASMW_ASSERT( dBufSize != 0 );
	  	
	  	psSeqbufInfo = &gpMaSndDrvInfo->sSeqbufInfo;
	  	
		psSeqbufInfo->pbBufPtr  = pbBuf;
		psSeqbufInfo->dBufSize = dBufSize;

		if ( psSeqbufInfo->bQueueFlag == 1 )
		{
			dReadPtr = psSeqbufInfo->dQueueWPtr - psSeqbufInfo->dQueueSize;

			if ( dBufSize < psSeqbufInfo->dQueueSize )
			{
				machdep_memcpy( psSeqbufInfo->pbBufPtr, &(psSeqbufInfo->bQueue[dReadPtr]), dBufSize );

				psSeqbufInfo->dQueueSize -= dBufSize;
				
				return (SINT32)dBufSize;
			}
			else
			{
				machdep_memcpy( psSeqbufInfo->pbBufPtr, &(psSeqbufInfo->bQueue[dReadPtr]), psSeqbufInfo->dQueueSize );

				psSeqbufInfo->pbBufPtr   += psSeqbufInfo->dQueueSize;
				psSeqbufInfo->dBufSize  -= psSeqbufInfo->dQueueSize;
				psSeqbufInfo->dWroteSize = psSeqbufInfo->dQueueSize;

				psSeqbufInfo->dQueueSize = 0;
				psSeqbufInfo->bQueueFlag = 0;
				psSeqbufInfo->dQueueWPtr = 0;
			}
		}
		else
		{
			psSeqbufInfo->dWroteSize = 0;
		}
		
		if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_DELAYED].dEosFlag == 1 )
		{
			if ( psSeqbufInfo->bQueueFlag == 0 )
			{
				gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_DELAYED].dEosFlag = 0;
				sdResult = MaDevDrv_EndofSequence();
				if ( sdResult < 0 )
				{
					return MASMW_ERROR;
				}
			}
			return (SINT32)psSeqbufInfo->dWroteSize;
		}


		dTimeOut = 1024;
		do
		{
			sdResult = gpMaSndDrvInfo->pfnSrmCnv[MASMW_SEQTYPE_DELAYED]();
		}
		while ( ( sdResult > 0 ) && ( psSeqbufInfo->bQueueFlag == 0 ) && ( --dTimeOut !=0 ) );

		if ( ( sdResult == 0 ) || ( dTimeOut == 0 ) )
		{
			sdMessage = MaSound_ReceiveMessage( MASMW_SEQTYPE_DELAYED, 0, MASMW_END_OF_DATA );

			if ( sdMessage == MASMW_END_OF_SEQUENCE )
			{
				sdResult = SendDelayedPacket( (UINT8 *)&bStopPacket[0], 4 );
				if ( sdResult < 0 )
				{
					return MASMW_ERROR;
				}
				else if ( sdResult == 1 )
				{
					gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_DELAYED].dEosFlag = 1;
				}
				else
				{
					sdResult = MaDevDrv_EndofSequence();
					if ( sdResult < 0 )
					{
						return MASMW_ERROR;
					}
				}
			}
			else
			{
				sdResult = SendDelayedPacket( (UINT8 *)&bStopPacket[0], 4 );
				if ( sdResult < 0 )
				{
					return MASMW_ERROR;
				}
			}
		}

		if ( sdResult >= 0 )
		{
			sdResult = (SINT32)psSeqbufInfo->dWroteSize;
		}

		break;

	  case MASNDDRV_UPDATE_TIMER2A: /* Timer #2A */
	  
	  	if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_DIRECT].bStatus == MASNDDRV_STATUS_PLAYING )
	  	{
			sdResult = gpMaSndDrvInfo->pfnSrmCnv[MASMW_SEQTYPE_DIRECT]();
		}
		else
		{
			sdResult = MASMW_SUCCESS;
		}

		break;

	  case MASNDDRV_UPDATE_TIMER2B: /* Timer #2B */

		if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bStatus == MASNDDRV_STATUS_PLAYING )
		{

			sdResult = gpMaSndDrvInfo->pfnSrmCnv[MASMW_SEQTYPE_HV]();

			if ( sdResult > 0 )
			{
				pbPacketBuf = gpMaSndDrvInfo->bPacketBuf[MASMW_SEQTYPE_HV];
				sdResult = pfnHvFunc[gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvType].Generate( &(pbPacketBuf[2]) );
				switch ( sdResult )
				{
				  case MASNDDRV_HV_FRAME_ON:
				  	dRegIndex = MAC_HV_BASE;
				  	
				  	/* LED & Motor Sync. setting (C_Address:#532) */
				  	pbPacketBuf[34] = (UINT8)( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvLedMtrSync & 0x03 );
				  	/* set channel number */
				  	if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvChannel != MASNDDRV_HV_EXCHANNEL )
				  	{
						/* not ex channel */
						
						/* clear EXCH bit (C_Address:#533) */
						pbPacketBuf[35] = (UINT8)( pbPacketBuf[35] & 0x3F );
						
						/* set channel number (C_Address:#536) */
						pbPacketBuf[38] = (UINT8)( ( pbPacketBuf[38] & 0x70 )
													| gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvChannel );
					}
				  	break;

				  case MASNDDRV_HV_FRAME_OFF:
				  	dRegIndex = MAC_HV_CTRL;
				  	
				  	if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvChannel != MASNDDRV_HV_EXCHANNEL )
				  	{
						/* not ex channel */

						/* set channel number (C_Address:#536) */
						pbPacketBuf[2] = (UINT8)( ( pbPacketBuf[2] & 0x70 )
													| gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvChannel );
					}
				  	break;

				  case MASNDDRV_HV_FRAME_NORMAL:
				  	dRegIndex = MAC_HV_FORMANT_0;

				  	/* LED & Motor Sync. setting (C_Address:#532) */
				  	pbPacketBuf[26] = (UINT8)( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvLedMtrSync & 0x03 );
				  	/* set channel number */
				  	if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvChannel != MASNDDRV_HV_EXCHANNEL )
				  	{
						/* not ex channel */
						
						/* clear EXCH bit (C_Address:#533) */
						pbPacketBuf[27] = (UINT8)( pbPacketBuf[27] & 0x3F );
					}
				  	break;

				  case MASNDDRV_HV_FRAME_CHANGE:
				  	dRegIndex = MAC_HV_BASE;

				  	/* LED & Motor Sync. setting (C_Address:#532) */
				  	pbPacketBuf[34] = (UINT8)( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvLedMtrSync & 0x03 );
				  	/* set channel number */
				  	if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bHvChannel != MASNDDRV_HV_EXCHANNEL )
				  	{
						/* not ex channel */
						
						/* clear EXCH bit (C_Address:#533) */
						pbPacketBuf[35] = (UINT8)( pbPacketBuf[35] & 0x3F );
					}
				  	break;

				  default:
				  	return 0;
				}

				dNum = 0;
				MAKE_ADDRESS_PART( dNum, dRegIndex );
				dNum += (UINT32)sdResult;
				pbPacketBuf[dNum-1] = (UINT8)(pbPacketBuf[dNum-1] | 0x80);

				sdResult = MaDevDrv_SendDirectPacket( &(pbPacketBuf[0]), dNum );
			}
			else if ( sdResult == 0 )
			{
				return 0;
			}
		}
		else if ( gpMaSndDrvInfo->sSndDrvInfo[MASMW_SEQTYPE_HV].bStatus == MASNDDRV_STATUS_WAITING )
		{
			
			sdResult = gpMaSndDrvInfo->pfnSrmCnv[MASMW_SEQTYPE_HV]();
		}
		else
		{
			sdResult = 0;
		}

	  	break;

	  default:
	  	sdResult = 1;
	}

	return sdResult;
}
/****************************************************************************
 *	MaSndDrv_Nop
 *
 *	Description:
 *			Nop operation.
 *	Arguments:
 *			sdSeqId		sequence id (0..2)
 *			sdDeltaTime	delta time [tick]
 *			dType		NOP type (0..1)
 *			dP2			unused
 *			dP3			unused
 *	Return:
 *			0			success
 *			< 0			error code
 *
 ****************************************************************************/
static SINT32 MaSndDrv_Nop
(
	SINT32	sdSeqId,					/* sequence id */
	SINT32	sdDeltaTime,				/* delta time */
	UINT32	dType,						/* NOP type */
	UINT32	dP2,						/* unused */
	UINT32	dP3							/* unused */
)
{
	UINT32	dNum;						/* number of packet data */
	UINT32	dRegIndex;					/* register index number */
	SINT32	sdResult;					/* result of function */
	UINT8  *pbPacketBuf;
	
	(void)dP2;							/* for unused warning message */
	(void)dP3;
	
	MASNDDRV_DBGMSG((" MaSndDrv_Nop: id=%ld dt=%ld tp=%ld\n", sdSeqId, sdDeltaTime, dType));

	/* check arguments */

	MASMW_ASSERT( dType <= MASNDDRV_MAX_NOPTYPE );

	/* Make packet data */
	pbPacketBuf = gpMaSndDrvInfo->bPacketBuf[sdSeqId];
	dNum = MakeDeltaTime( &pbPacketBuf[0], sdDeltaTime );			/* timer part */

	dRegIndex = ( dType == 0 ) ? MAC_NOP : MAC_NOP2;

	pbPacketBuf[dNum++] = (UINT8)(  dRegIndex       & 0x7F );		/* address part */
	pbPacketBuf[dNum++] = (UINT8)( (dRegIndex >> 7) | 0x80 );
	pbPacketBuf[dNum++] = (UINT8)0x80;								/* data part */

	if ( sdDeltaTime < 0 )				/* direct command */
	{
		sdResult = MaDevDrv_SendDirectPacket( &(pbPacketBuf[0]), dNum );
	}
	else								/* delayed command */
	{
		sdResult = SendDelayedPacket( &(pbPacketBuf[0]), dNum );
	}

	return sdResult;
}
/****************************************************************************
 *	MaSndDrv_NoteOn
 *
 *	Description:
 *			Note On prcessing
 *	Argument:
 *			sdSeqId		sequence id (0..1)
 *			sdDeltaTime	delta time [tick]
 *			dCh			channel number (0..15)
 *			dKey		key number (0..127)
 *			dVelocity	velocity (0..127)
 *	Return:
 *			0			success
 *			< 0			error code
 *
 ****************************************************************************/
static SINT32 MaSndDrv_NoteOn
(
	SINT32	sdSeqId,					/* sequnce id */
	SINT32	sdDeltaTime,				/* delta time */
	UINT32	dCh,						/* channel number */
	UINT32	dKey,						/* key number */
	UINT32	dVelocity					/* velocity */
)
{
	UINT32	dSlotNo;					/* slot number */
	UINT32	dOldSlotNo;
	UINT32	dInfoSlotNo;
	UINT32	dOldCh;						/* old channel number */
	UINT32	dVoVol;						/* voice volume */
	UINT32	dNum;						/* number of packet data */
	UINT32	dRegIndex;					/* register index */
	UINT32	dOldRegIndex;
	UINT32	dPitch;						/* pitch */
	UINT32	dMode;						/* dva mode */
	UINT32	dParam;
	SINT32	sdResult;					/* result of function */
	SINT32	sdLpfParam;
	UINT8  *pbAlParam;					/* pointer to AL voice parameter */
	UINT8	bEvType;					/* event type bit0:1-new note 0-continue, bit1:melody, drum */
	UINT8  *pbPacketBuf;
	PMASNDDRVCHINFO	psChInfo;
	MASNDDRVVINFO	VoiceInfo;			/* voice information */
	
	
	MASNDDRV_DBGMSG((" MaSndDrv_NoteOn: id=%ld dt=%ld ch=%ld key=%ld vel=%ld\n", 
					   sdSeqId, sdDeltaTime, dCh, dKey, dVelocity));

	/* check arguments */

	MASMW_ASSERT( dKey <= MASNDDRV_MAX_KEY );
	MASMW_ASSERT( dVelocity <= MASNDDRV_MAX_VELOCITY );
	
	dKey &= MASNDDRV_MASK_KEY;
	dVelocity &= MASNDDRV_MASK_VOLUME;
	
	pbPacketBuf	= gpMaSndDrvInfo->bPacketBuf[sdSeqId];
	psChInfo 	= &gpMaSndDrvInfo->sChInfo[dCh];

	/* get voice information */

	sdResult = GetVoiceInfo( sdSeqId

⌨️ 快捷键说明

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