📄 vgsnd.h
字号:
#ifndef __VR0SND_H__
#define __VR0SND_H__
#include "VGSDKpv.h"
#undef DG_BIT( _BIT_ )
#define DG_BIT( _BIT_ ) (0x1<<(_BIT_))
#define DG_LOW( _ADDR_ ) (_ADDR_)
#define DG_HIGH( _ADDR_ ) ((_ADDR_) | DG_BIT(1))
#define DG_SND_CHANNEL_PARAMTER_REGISTER (SND_BASE_ADDRESS)
#define DG_SND_CONTROL_REGISTER (SND_BASE_ADDRESS | DG_BIT(10))
#define DG_SND_STATUS (DG_SND_CONTROL_REGISTER | DG_BIT(2))
#define DG_SND_STATUS_LOW DG_LOW(DG_SND_STATUS)
#define DG_SND_STATUS_HIGH DG_HIGH(DG_SND_STATUS)
#define DG_SND_NOTE (DG_SND_CONTROL_REGISTER | DG_BIT(3))
#define DG_SND_NOTE_LOW DG_LOW(DG_SND_NOTE)
#define DG_SND_NOTE_HIGH DG_HIGH(DG_SND_NOTE)
#define DG_SND_REVFACTOR (DG_SND_CONTROL_REGISTER | DG_BIT(4))
#define DG_SND_REVBUFSTART (DG_SND_CONTROL_REGISTER | DG_BIT(4) | DG_BIT(1))
#define DG_SND_REVBUFSIZE0 (DG_SND_CONTROL_REGISTER | DG_BIT(5))
#define DG_SND_REVBUFSIZE1 (DG_SND_CONTROL_REGISTER | DG_BIT(5) | DG_BIT(1))
#define DG_SND_REVBUFSIZE2 (DG_SND_CONTROL_REGISTER | DG_BIT(6))
#define DG_SND_REVBUFSIZE3 (DG_SND_CONTROL_REGISTER | DG_BIT(6) | DG_BIT(1))
#define DG_SND_INTMASK (DG_SND_CONTROL_REGISTER | DG_BIT(7))
#define DG_SND_INTMASK_LOW DG_LOW(DG_SND_INTMASK)
#define DG_SND_INTMASK_HIGH DG_HIGH(DG_SND_INTMASK)
#define DG_SND_INTPEND (DG_SND_CONTROL_REGISTER | DG_BIT(8))
#define DG_SND_INTPEND_LOW DG_LOW(DG_SND_INTPEND)
#define DG_SND_INTPEND_HIGH DG_HIGH(DG_SND_INTPEND)
#define DG_SND_CHANNEL_CONTROL (DG_SND_CONTROL_REGISTER | DG_BIT(9))
#define DG_SND_MAIN_CONTROL (DG_SND_CONTROL_REGISTER | DG_BIT(9) | DG_BIT(1))
#define DG_SND_TYPE_OFFSET_0 DG_BIT(0)
#define DG_SND_TYPE_OFFSET_1 DG_BIT(1)
#define DG_SND_TYPE_OFFSET_2 DG_BIT(2)
#define DG_SND_TYPE_OFFSET_3 DG_BIT(3)
#define DG_SND_TYPE_OFFSET_4 DG_BIT(4)
#define DG_SND_TYPE_CURSADDR DG_SND_TYPE_OFFSET_0
#define DG_SND_TYPE_ENVELOPEVOLUME DG_SND_TYPE_OFFSET_1
#define DG_SND_TYPE_ENVELOPESTAGE DG_SND_TYPE_OFFSET_1
#define DG_SND_TYPE_LOOPDIRECTION DG_SND_TYPE_OFFSET_1
#define DG_SND_TYPE_DSADDR DG_SND_TYPE_OFFSET_2
#define DG_SND_TYPE_LOOPBEGIN DG_SND_TYPE_OFFSET_3
#define DG_SND_TYPE_LCHANNELVOLUME DG_SND_TYPE_OFFSET_3
#define DG_SND_TYPE_LOOPEND DG_SND_TYPE_OFFSET_4
#define DG_SND_TYPE_RCHANNELVOLUME DG_SND_TYPE_OFFSET_4
#define DG_SND_TYPE_MODE DG_SND_TYPE_OFFSET_4
#define DG_SND_NOTE_ON vgTRUE
#define DG_SND_NOTE_OFF vgFALSE
#define DG_SND_STATUS_BUSY vgTRUE
#define DG_SND_STATUS_IDLE vgFALSE
#define DG_SND_MODE_LOOPING_SHIFT 0
#define DG_SND_MODE_SUSTAIN_SHIFT 1
#define DG_SND_MODE_ENVELOPE_SHIFT 2
#define DG_SND_MODE_PINGPONG_SHIFT 3
#define DG_SND_MODE_ULAW_SHIFT 4
#define DG_SND_MODE_8BIT_SHIFT 5
#define DG_SND_MODE_TM_SHIFT 6
#define DG_SND_MODE_LOOPING DG_BIT(DG_SND_MODE_LOOPING_SHIFT)
#define DG_SND_MODE_SUSTAIN DG_BIT(DG_SND_MODE_SUSTAIN_SHIFT)
#define DG_SND_MODE_ENVELOPE DG_BIT(DG_SND_MODE_ENVELOPE_SHIFT)
#define DG_SND_MODE_PINGPONG DG_BIT(DG_SND_MODE_PINGPONG_SHIFT)
#define DG_SND_MODE_ULAW DG_BIT(DG_SND_MODE_ULAW_SHIFT)
#define DG_SND_MODE_8BIT DG_BIT(DG_SND_MODE_8BIT_SHIFT)
#define DG_SND_MODE_TM DG_BIT(DG_SND_MODE_TM_SHIFT)
typedef struct tagDgSndChannel
{
// Software Registers
U8 MidiChannel, Note;
U32 Velocity;
// Hardware Channel Register
S32 CurSAddr; // 22.10
S32 dSAddr; // 6.10
S32 dLoop, LoopEnd, LoopBegin; // 22
U8 LoopDir; // 1
S32 EnvVol; // S.7.16
U8 EnvStage; // 4
S16 LChnVol, RChnVol; // 7
U8 Mode; // 7
S32 EnvRate[4]; // S.0.16
U8 EnvTarget[4]; // 7
} _DGSNDCHANNEL;
extern _DGSNDCHANNEL _vgSndChannel[32];
extern float _vgSoundPlayFrequencyFloat;
extern U32 _vgSoundPlayFrequency;
extern U16 _vgSoundMaxChannel;
/////////////////////////////////////////////////////////////////////////////////////////////////
#define vgSNDRead CPURead32
#define vgSNDWrite CPUWrite32
#define vgSndSetStatusBusy vgSndPlayChannel
#define vgSndSetStatusIdle vgSndStopChannel
#define vgSndPlayChannel( chn ) CPUWrite16( DG_SND_STATUS, (U16)(DG_BIT(15) | (U16)(chn)) )
#define vgSndStopChannel( chn ) CPUWrite16( DG_SND_STATUS, (U16)(chn) )
#define vgSndGetStatus() vgSNDRead( DG_SND_STATUS )
#define vgSndSetNoteOn( chn ) CPUWrite16( DG_SND_NOTE, (U16)(DG_BIT(15) | (U16)(chn)) )
#define vgSndSetNoteOff( chn ) CPUWrite16( DG_SND_NOTE, (U16)(chn) )
#define vgSndGetNote() vgSNDRead( DG_SND_NOTE )
#define vgSndSetIntMask( mask ) vgSNDWrite( DG_SND_INTMASK, (mask) )
#define vgSndGetIntMask() vgSNDRead( DG_SND_INTMASK )
#define vgSndClearIntPend( chn ) vgSNDWrite( DG_SND_INTPEND, (1UL<<(chn)) )
#define vgSndSetIntPend( pend ) vgSNDWrite( DG_SND_INTPEND, (pend) )
#define vgSndGetIntPend() vgSNDRead( DG_SND_INTPEND )
void vgSndSetStatus( U8 channel, vgBOOL stats );
void vgSndSetNote( U8 channel, vgBOOL stats );
void vgSndSetDataFile( U8 channel, _DGSNDCHANNEL *sc );
void vgSndSetDataFileNoEnvelope( U8 channel, _DGSNDCHANNEL *sc );
void vgSndSetDataFileByType( U8 channel, _DGSNDCHANNEL *sc, U32 type );
void vgSndSelectRevebeMemory( vgBOOL IsTmem );
void vgSndReverbeEnable( vgBOOL re );
void vgSndSelectWait( vgBOOL cw, vgBOOL aw, vgBOOL mw );
void vgSndSetMaxChannel( U16 maxchan );
void vgSndSetChannelPerClockNumber( U16 clknum );
void vgSndSetReverbeFactor( U16 revmul );
void vgSndSetReverbeBufferAddress( U32 address );
void vgSndSetReverbeBufferSize( U16 size0, U16 size1, U16 size2, U16 size3 );
/*
U32 vgSNDRead( U32 addr );
void vgSNDWrite( U32 addr, U32 data );
void vgSndSetNoteOn( U8 channel );
void vgSndSetNoteOff( U8 channel );
U32 vgSndGetNote( void );
void vgSndSetIntMask( U32 mask );
U32 vgSndGetIntMask( void );
void vgSndClearIntPend( U8 channel );
void vgSndSetIntPend( U32 pend );
U32 vgSndGetIntPend( void );
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct tagDGSNDWAV
{
void *data; // a pointer of sound data that must be in VR0 Memory.
U32 length; // data length
U32 frequency; // frequency of data
U32 channel; // It'll be set by vgSndPlayWav
S8 lvolume, rvolume; // left & right volume
U8 mode; // play mode
U8 dummy; // padding byte for 4-byte align
} _DGSNDWAV;
// Play mode
#define DGWAV_MODE_LOOPING (1<<0) // play & repeat
#define DGWAV_MODE_PINGPONG (1<<3) // play & reverse play
#define DGWAV_MODE_ULAW (1<<4) // u-law encoding
#define DGWAV_MODE_8BIT (1<<5) // signed 8 bit PCM.
void vgSndPlaySound( void ); // Play all channel
void vgSndPauseSound( void ); // Pause all channel
void vgSndStopSound( void ); // Stop all channel
void vgSndSetMaxChannel( U16 maxchan ); // set a number of channel that'll be used (1 - 32)
void vgSndSetPlayFrequency( float vr0clk, float playfrequency ); // set clock of VR0 (Hz) & output frequency of sound (Hz)
/*
U32 vgSndGetStatus( void ); // get channel status
void vgSndPlayChannel( U8 channel ); // play a individual channel
void vgSndStopChannel( U8 channel ); // stop(pause) a individual channel
*/
vgBOOL SndInit( void );
void vgSndClose( void );
vgBOOL vgSndPlayWav( _DGSNDWAV *pwav ); // play wav
vgBOOL vgSndSetWav( char *filename,U32 filelength, U32 frequency, S8 volume, U8 mode, _DGSNDWAV *pwav );
void vgSndForceMono( vgBOOL enb );
extern vgBOOL _vgSoundForceMono;
extern U32 _vgSoundVR0Clk;
#endif /* __VR0SND_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -