- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
GameSound.c
资源名称:SDK_M5661.rar [点击查看]
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:7k
源码类别:
压缩解压
开发平台:
C++ Builder
- #define _GAME_SOUND_H_
- #include <DP8051XP.H>
- #include "TypeDef.h"
- #include "Const.h"
- #include "Common.h"
- #include "Reg5661.h"
- #include "GameSound.h"
- #include "GameSoundChip.h"
- #include "Idma.h"
- #include "IntCodec.h"
- //private variable
- XBYTE gxbCurrentSector;
- XBYTE gxbBufferStatus;
- XBYTE* pxbBufferAddress[2];
- XBYTE gxbBufferSector;
- XBYTE gxbCurrentVolume;
- XBYTE gxbDecodeStatus;
- BYTE InitSound(void * pBuffer0, void* pBuffer1, BYTE nFlags)
- {
- WORD wDspVal;
- unsigned int code cwSampleRate[8]=
- {8000,
- 11025,
- 16000,
- 22050,
- 24000,
- 32000,
- 44100,
- 48000};
- unsigned int code cwFormat[2] = {0x0700,0x0200};
- unsigned int code cwChannel[2] = {0x0001, 0x0002};
- unsigned int code cwBlockSize[2][8] = { {256, 256, 256, 512, 512, 512, 1024, 1024}, //mono
- {256, 512, 512, 1024, 1024, 1024, 2048, 2048}}; //stereo
- unsigned int code cwBitPerSample[2] = {0x0008, 0x0004};
- unsigned int code cwCountMono[2] = { 0x0004, // 8bit MONO PCM
- 0x0008}; // 16bit MONO PCM
- unsigned int code cwCountStereo[2] ={ 0x0002, // 8bit STEREO PCM
- 0x0004}; // 16bit STEREO PCM
- #define FORMAT_FLAG (nFlags&0x01)
- #define CHANNEL_FLAG ((nFlags&0x02)>>1)
- #define SAMPLRATE_FLAG ((nFlags&0x1C)>>2)
- #define BUFFERSIZE_FLAG ((nFlags&0xE0)>>5)
- #define DSP_NUM_CH 0x1FBB
- #define DSP_FORMAT_TAG 0x1FB9
- #define DSP_SMP_RATE 0x1FBA
- #define DSP_BLOCK_SIZE 0x1FB8
- #define DSP_FILE_OFFSET 0x11EB
- #define DSP_COUNT_MONO 0x1FA4
- #define DSP_COUNT_STEREO 0x1FA5
- #define DSP_BIT_PER_SMP 0x1FA6
- // initial
- gxbCurrentSector = 0; // default sector 0
- gxbBufferStatus = 0; // default buffer 0
- gxbDecodeStatus = GAME_SOUND_STOP;
- // load informantion
- pxbBufferAddress[0] = pBuffer0;
- pxbBufferAddress[1] = pBuffer1;
- gxbBufferSector = (1 + BUFFERSIZE_FLAG)*2;
- gxwSampleRate = cwSampleRate[SAMPLRATE_FLAG];
- CdcSetSampleRate(); //tne 2006/12/26 #1
- if(gxwSampleRate>16000)
- obCLKDSPDIVF = 0;
- //MAX3111DWORD(0xaa55aa55);
- //MAX3111DWORD(gxbBufferSector);
- wDspVal = 1;
- IdmaPioDmxW(&wDspVal, 0x1fbc,1,DSP_W16); //bypass HDR
- wDspVal = cwFormat[FORMAT_FLAG];
- IdmaPioDmxW(&wDspVal, DSP_FORMAT_TAG,1,DSP_W16); //format
- wDspVal = cwChannel[CHANNEL_FLAG];
- IdmaPioDmxW(&wDspVal, DSP_NUM_CH,1,DSP_W16); //channel
- wDspVal = gxwSampleRate >> 1;
- IdmaPioDmxW(&wDspVal, DSP_SMP_RATE,1,DSP_W16); //sample rate
- wDspVal = cwBlockSize[CHANNEL_FLAG][SAMPLRATE_FLAG];
- IdmaPioDmxW(&wDspVal, DSP_BLOCK_SIZE,1,DSP_W16); // blocksize
- wDspVal = cwBitPerSample[FORMAT_FLAG];
- IdmaPioDmxW(&wDspVal, DSP_BIT_PER_SMP,1,DSP_W16); // bit per sample
- if(FORMAT_FLAG == 0) // uLaw
- {
- if(CHANNEL_FLAG == 0)
- {
- wDspVal = cwCountMono[0];
- IdmaPioDmxW(&wDspVal, DSP_COUNT_MONO,1,DSP_W16); // count mono
- }
- else
- {
- wDspVal = cwCountStereo[0];
- IdmaPioDmxW(&wDspVal, DSP_COUNT_STEREO,1,DSP_W16); // count stereo
- }
- }
- //wDspVal = 2;
- //IdmaPioDmxW(&wDspVal, 0x11a6,1,DSP_W16); // count stereo
- //wDspVal = 0x0160;
- //IdmaPioDmxW(&wDspVal, 0x1ff3,1,DSP_W16); // bit rate
- return 1;
- }
- BYTE SetSoundVolume(BYTE bVol)
- {
- gxbCurrentVolume = bVol;
- GameSoundChipSetVolume(bVol);
- return 1;
- }
- BYTE GetSoundVolume()
- {
- return gxbCurrentVolume;
- }
- BYTE PlaySound()
- {
- volatile unsigned char code cbStateChange[4] = { 0x00,
- GAME_SOUND_PLAY, // GAME_SOUND_STOP
- GAME_SOUND_PLAY, // GAME_SOUND_PAUSE
- GAME_SOUND_PLAY}; // GAME_SOUND_PLAY
- ClkDspDis();
- MCU_ACCESS_CODEC_I2S_EN(); //Renshuo050216#A
- obALGPAREG = 0x00;
- MCU_ACCESS_CODEC_I2S_DIS(); //Renshuo050216#A
- ClkDspEn();
- gxbDecodeStatus = cbStateChange[gxbDecodeStatus];
- return 1;
- }
- BYTE PauseSound()
- {
- volatile unsigned char code cbStateChange[4] = { 0x00,
- GAME_SOUND_STOP, // GAME_SOUND_STOP
- GAME_SOUND_PAUSE, // GAME_SOUND_PAUSE
- GAME_SOUND_PAUSE}; // GAME_SOUND_PLAY
- gxbDecodeStatus = cbStateChange[gxbDecodeStatus];
- ClkDspDis();
- MCU_ACCESS_CODEC_I2S_EN(); //Renshuo050216#A
- obALGPAREG = 0xb8;
- obDIGCTRL1 |= DAC_FADE_OUT_EN;
- MCU_ACCESS_CODEC_I2S_DIS(); //Renshuo050216#A
- ClkDspEn();
- return 1;
- }
- BYTE ResumeSound()
- {
- volatile unsigned char code cbStateChange[4] = { 0x00,
- GAME_SOUND_STOP, // GAME_SOUND_STOP
- GAME_SOUND_PLAY, // GAME_SOUND_PAUSE
- GAME_SOUND_PLAY}; // GAME_SOUND_PLAY
- gxbDecodeStatus = cbStateChange[gxbDecodeStatus];
- ClkDspDis();
- MCU_ACCESS_CODEC_I2S_EN(); //Renshuo050216#A
- obDIGCTRL2 = CDC_FIFO_CLR; //Renshuo050126#A clear FIFO avoid LR exchange
- obDIGCTRL2 = CDC_EN;
- obALGPAREG = 0x00;
- obDIGCTRL1 &= DAC_FADE_OUT_DISJ;
- MCU_ACCESS_CODEC_I2S_DIS(); //Renshuo050216#A
- ClkDspEn();
- return 1;
- }
- BYTE StopSound()
- {
- //ORD wDspVal;
- volatile unsigned char code cbStateChange[4] = { 0x00,
- GAME_SOUND_STOP, // GAME_SOUND_STOP
- GAME_SOUND_STOP, // GAME_SOUND_PAUSE
- GAME_SOUND_STOP}; // GAME_SOUND_PLAY
- /*
- wDspVal = TRUE;
- IdmaPioDmxW(&wDspVal, DSP_REW_EN_ADDR, 1, DSP_W16);
- while(wDspVal) //wait dsp reset state
- {
- IdmaPioDmxR(DSP_REW_EN_ADDR,&wDspVal,1,DSP_W16); //dsp reset ready
- }
- wDspVal = DSP_FADE_IN_EN|DSP_FADE_FORCE|DSP_FADE_1_UNIT;
- IdmaPioDmxW(&wDspVal,DSP_FADE_ADDR,1,DSP_W16);
- */
- ClkDspDis();
- MCU_ACCESS_CODEC_I2S_EN(); //Renshuo050216#A
- obALGPAREG = 0xb8;
- MCU_ACCESS_CODEC_I2S_DIS(); //Renshuo050216#A
- ClkDspEn();
- gxbDecodeStatus = cbStateChange[gxbDecodeStatus];
- return 1;
- }
- BYTE GetSoundStatus()
- {
- BYTE bRet = gxbDecodeStatus;
- if(gxbDecodeStatus != GAME_SOUND_STOP)
- {
- if(gxbBufferStatus&0x01)
- {
- bRet |= 0x08;
- }
- else
- {
- bRet |= 0x04;
- }
- }
- return bRet;
- }
- //gxbBufferStatus
- // b0: current buffer
- BYTE GameSoundFillDspBuffer()
- {
- if(gxbDecodeStatus == GAME_SOUND_PLAY)
- {
- if(GameSoundChipPollDspBuffer())
- {
- if(gxbCurrentSector >= gxbBufferSector) //current buffer is out
- {
- gxbBufferStatus ^= (0x01); // switch to buffer 1
- gxbCurrentSector = 0; // reset pointer
- }
- /*
- MAX3111DWORD(0xccccdddd);
- MAX3111DWORD(gxbBufferStatus);
- MAX3111DWORD(gxbCurrentSector);
- */
- GameSoundChipFillDspBuffer(pxbBufferAddress[gxbBufferStatus&0x01]+gxbCurrentSector*512);
- gxbCurrentSector ++;
- }
- }
- return 1;
- }
- BYTE CopyBuffer(BYTE * pbSource, BYTE* pbTarget, WORD wLen)
- {
- for( ;wLen>0 ; wLen--)
- {
- *pbTarget = *pbSource;
- pbTarget++;
- pbSource++;
- }
- return 1;
- }
- BYTE GameSoundFillMcuBuffer(BYTE* pbBuffer, WORD wSector)
- {
- NandReadPhySec(wSector,1,SRAM_DATA_ADDR);
- CopyBuffer(gxbFsData, pbBuffer, 512);
- //MAX3111DWORD(0xDDDDDDDD);
- //MAX3111Dump(pbBuffer, 8);
- NandReadPhySec(wSector+1,1,SRAM_DATA_ADDR);
- CopyBuffer(gxbFsData, pbBuffer+512, 512);
- return 1;
- }
- BYTE GameSoundGetBinSector(BYTE bBinNumber, WORD* wSec, WORD* wLen)
- {
- NandReadPhySec(gxwAddrPMI,1,SRAM_DATA_ADDR);
- *wSec = ((WORD)gxbFsData[bBinNumber*4 + 5] << 8) | gxbFsData[bBinNumber*4 + 4];
- *wLen = ((WORD)gxbFsData[bBinNumber*4 + 7] << 8) | gxbFsData[bBinNumber*4 + 6];
- return 1;
- // *wSec = (WORD)((WORD*)(gxbFsData + bBinNumber*4 + 4));
- // *wLen = (WORD)((WORD*)(gxbFsData + bBinNumber*4 + 6));
- }