📄 masnddrv.c
字号:
}
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 + -