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

📄 vgsnd.h

📁 adc 3208 上面实现图片旋转的实例
💻 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 + -