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 + -
显示快捷键?