X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Fexternals.h;h=4832fac85ce2496c538cf93b2a1c7f54ba45e6ca;hp=92683a95d09db40bfd47a6a4aeaf1f3f7557c6ec;hb=3bd31caf9e9f5ddab2bf4fbdb5a129f4972c45f3;hpb=6d866bb7894b252fc430a24a97769511d5ead1ca diff --git a/plugins/dfsound/externals.h b/plugins/dfsound/externals.h index 92683a95..4832fac8 100644 --- a/plugins/dfsound/externals.h +++ b/plugins/dfsound/externals.h @@ -21,6 +21,14 @@ // generic defines ///////////////////////////////////////////////////////// +#ifdef __GNUC__ +#define noinline __attribute__((noinline)) +#define unlikely(x) __builtin_expect((x), 0) +#else +#define noinline +#define unlikely(x) x +#endif + #define PSE_LT_SPU 4 #define PSE_SPU_ERR_SUCCESS 0 #define PSE_SPU_ERR -60 @@ -35,44 +43,27 @@ // spu defines //////////////////////////////////////////////////////////////////////// -// sound buffer sizes -// 400 ms complete sound buffer -#define SOUNDSIZE 70560 -// 137 ms test buffer... if less than that is buffered, a new upload will happen -#define TESTSIZE 24192 - // num of channels #define MAXCHAN 24 -// ~ 1 ms of data -#define NSSIZE 45 +// note: must be even due to the way reverb works now +#define NSSIZE ((44100 / 50 + 16) & ~1) /////////////////////////////////////////////////////////// // struct defines /////////////////////////////////////////////////////////// -// ADSR INFOS PER CHANNEL -typedef struct -{ - int AttackModeExp; - long AttackTime; - long DecayTime; - long SustainLevel; - int SustainModeExp; - long SustainModeDec; - long SustainTime; - int ReleaseModeExp; - unsigned long ReleaseVal; - long ReleaseTime; - long ReleaseStartTime; - long ReleaseVol; - long lTime; - long lVolume; -} ADSRInfo; +enum ADSR_State { + ADSR_ATTACK = 0, + ADSR_DECAY = 1, + ADSR_SUSTAIN = 2, + ADSR_RELEASE = 3, +}; +// ADSR INFOS PER CHANNEL typedef struct { - unsigned char State:2; + unsigned char State:2; // ADSR_State unsigned char AttackModeExp:1; unsigned char SustainModeExp:1; unsigned char SustainIncrease:1; @@ -104,33 +95,21 @@ typedef struct int iSBPos; // mixing stuff int spos; int sinc; + int sinc_inv; - unsigned char * pStart; // start ptr into sound mem unsigned char * pCurr; // current pos in sound mem unsigned char * pLoop; // loop ptr in sound mem - unsigned int bStop:1; // is channel stopped (sample _can_ still be playing, ADSR Release phase) unsigned int bReverb:1; // can we do reverb on this channel? must have ctrl register bit, to get active - unsigned int bIgnoreLoop:1; // ignore loop bit, if an external loop address is used unsigned int bRVBActive:1; // reverb active flag unsigned int bNoise:1; // noise active flag unsigned int bFMod:2; // freq mod (0=off, 1=sound channel, 2=freq channel) + unsigned int prevflags:3; // flags from previous block - int iActFreq; // current psx pitch - int iUsedFreq; // current pc pitch int iLeftVolume; // left volume int iRightVolume; // right volume - int s_1; // last decoding infos - int s_2; ADSRInfoEx ADSRX; int iRawPitch; // raw pitch (0...3fff) - - int iRVBOffset; // reverb offset - int iRVBRepeat; // reverb repeat - int iRVBNum; // another reverb helper - int iOldNoise; // old noise val for this channel - - int SB[32+32]; } SPUCHAN; /////////////////////////////////////////////////////////// @@ -142,8 +121,6 @@ typedef struct int VolLeft; int VolRight; - int iLastRVBLeft; - int iLastRVBRight; int iRVBLeft; int iRVBRight; @@ -179,97 +156,103 @@ typedef struct int MIX_DEST_B1; // (offset) int IN_COEF_L; // (coef.) int IN_COEF_R; // (coef.) + + int dirty; // registers changed + + // normalized offsets + int nIIR_DEST_A0, nIIR_DEST_A1, nIIR_DEST_B0, nIIR_DEST_B1, + nACC_SRC_A0, nACC_SRC_A1, nACC_SRC_B0, nACC_SRC_B1, + nIIR_SRC_A0, nIIR_SRC_A1, nIIR_SRC_B0, nIIR_SRC_B1, + nACC_SRC_C0, nACC_SRC_C1, nACC_SRC_D0, nACC_SRC_D1, + nMIX_DEST_A0, nMIX_DEST_A1, nMIX_DEST_B0, nMIX_DEST_B1; + // MIX_DEST_xx - FB_SRC_x + int nFB_SRC_A0, nFB_SRC_A1, nFB_SRC_B0, nFB_SRC_B1; } REVERBInfo; -/////////////////////////////////////////////////////////// -// SPU.C globals /////////////////////////////////////////////////////////// -#ifndef _IN_SPU - // psx buffers / addresses -extern unsigned short regArea[]; -extern unsigned short spuMem[]; -extern unsigned char * spuMemC; -extern unsigned char * pSpuIrq; -extern unsigned char * pSpuBuffer; - -// user settings - -extern int iVolume; -extern int iXAPitch; -extern int iUseTimer; -extern int iSPUIRQWait; -extern int iDebugMode; -extern int iRecordMode; -extern int iUseReverb; -extern int iUseInterpolation; -extern int iDisStereo; -// MISC - -extern int iSpuAsyncWait; +#define SB_SIZE (32 + 4) -extern SPUCHAN s_chan[]; -extern REVERBInfo rvb; - -extern unsigned long dwNoiseVal; -extern unsigned short spuCtrl; -extern unsigned short spuStat; -extern unsigned short spuIrq; -extern unsigned long spuAddr; -extern int bEndThread; -extern int bThreadEnded; -extern int bSpuInit; -extern unsigned int dwNewChannel; -extern unsigned int dwChannelOn; - -extern int SSumR[]; -extern int SSumL[]; -extern int iCycle; -extern short * pS; - -extern void (CALLBACK *cddavCallback)(unsigned short,unsigned short); - -#endif +typedef struct +{ + unsigned short spuCtrl; + unsigned short spuStat; + + unsigned int spuAddr; + union { + unsigned char *spuMemC; + unsigned short *spuMem; + }; + unsigned char * pSpuIrq; + + unsigned int cycles_played; + int decode_pos; + int decode_dirty_ch; + unsigned int bSpuInit:1; + unsigned int bSPUIsOpen:1; + + unsigned int dwNoiseVal; // global noise generator + unsigned int dwNoiseCount; + unsigned int dwNewChannel; // flags for faster testing, if new channel starts + unsigned int dwChannelOn; // not silent channels + unsigned int dwChannelDead; // silent+not useful channels + + unsigned char * pSpuBuffer; + short * pS; + + void (CALLBACK *irqCallback)(void); // func of main emu, called on spu irq + void (CALLBACK *cddavCallback)(unsigned short,unsigned short); + void (CALLBACK *scheduleCallback)(unsigned int); + + xa_decode_t * xapGlobal; + unsigned int * XAFeed; + unsigned int * XAPlay; + unsigned int * XAStart; + unsigned int * XAEnd; + + unsigned int * CDDAFeed; + unsigned int * CDDAPlay; + unsigned int * CDDAStart; + unsigned int * CDDAEnd; + + unsigned int XARepeat; + unsigned int XALastVal; + + int iLeftXAVol; + int iRightXAVol; + + SPUCHAN * s_chan; + int * SB; + + int * RVB; + int * SSumLR; + + int pad[29]; + unsigned short regArea[0x400]; +} SPUInfo; /////////////////////////////////////////////////////////// -// XA.C globals +// SPU.C globals /////////////////////////////////////////////////////////// -#ifndef _IN_XA - -extern xa_decode_t * xapGlobal; +#ifndef _IN_SPU -extern uint32_t * XAFeed; -extern uint32_t * XAPlay; -extern uint32_t * XAStart; -extern uint32_t * XAEnd; +extern SPUInfo spu; +extern REVERBInfo rvb; -extern uint32_t XARepeat; -extern uint32_t XALastVal; +void do_samples(unsigned int cycles_to, int do_sync); +void schedule_next_irq(void); -extern uint32_t * CDDAFeed; -extern uint32_t * CDDAPlay; -extern uint32_t * CDDAStart; -extern uint32_t * CDDAEnd; +#define regAreaGet(ch,offset) \ + spu.regArea[((ch<<4)|(offset))>>1] -extern int iLeftXAVol; -extern int iRightXAVol; +#define do_samples_if_needed(c, sync) \ + do { \ + if (sync || (int)((c) - spu.cycles_played) >= 16 * 768) \ + do_samples(c, sync); \ + } while (0) #endif -/////////////////////////////////////////////////////////// -// REVERB.C globals -/////////////////////////////////////////////////////////// - -#ifndef _IN_REVERB - -extern int * sRVBPlay; -extern int * sRVBEnd; -extern int * sRVBStart; -extern int iReverbOff; -extern int iReverbRepeat; -extern int iReverbNum; - -#endif