X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fdfsound%2Fexternals.h;h=5ec941525c234a4963471cee79f11853ac1c2092;hp=dd582ffff79cfab6ae24b81abfc876e97add9c59;hb=HEAD;hpb=fb552464f06137102fd9ca69a05492265bbdcea7 diff --git a/plugins/dfsound/externals.h b/plugins/dfsound/externals.h index dd582fff..6dbbac67 100644 --- a/plugins/dfsound/externals.h +++ b/plugins/dfsound/externals.h @@ -15,12 +15,31 @@ * * ***************************************************************************/ +#ifndef __P_SOUND_EXTERNALS_H__ +#define __P_SOUND_EXTERNALS_H__ + #include ///////////////////////////////////////////////////////// // generic defines ///////////////////////////////////////////////////////// +//#define log_unhandled printf +#define log_unhandled(...) + +#ifdef __GNUC__ +#define noinline __attribute__((noinline)) +#define unlikely(x) __builtin_expect((x), 0) +#else +#define noinline +#define unlikely(x) x +#endif +#if defined(__GNUC__) && !defined(_TMS320C6X) +#define preload __builtin_prefetch +#else +#define preload(...) +#endif + #define PSE_LT_SPU 4 #define PSE_SPU_ERR_SUCCESS 0 #define PSE_SPU_ERR -60 @@ -38,37 +57,24 @@ // num of channels #define MAXCHAN 24 -// ~ FRAG_MSECS ms of data // note: must be even due to the way reverb works now -#define FRAG_MSECS 2 -#define NSSIZE ((44100 * FRAG_MSECS / 1000 + 1) & ~1) +#define NSSIZE ((44100 / 50 + 32) & ~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; @@ -83,40 +89,33 @@ typedef struct /////////////////////////////////////////////////////////// -// Tmp Flags - -// used for debug channel muting -#define FLAG_MUTE 1 - -// used for simple interpolation -#define FLAG_IPOL0 2 -#define FLAG_IPOL1 4 - -/////////////////////////////////////////////////////////// - // MAIN CHANNEL STRUCT typedef struct { int iSBPos; // mixing stuff int spos; int sinc; + int sinc_inv; 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 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 bJump:1; // last decoded block jumped - - int iLeftVolume; // left volume - int iRightVolume; // right volume + unsigned int prevflags:3; // flags from previous block + unsigned int bIgnoreLoop:1; // Ignore loop + unsigned int bStarting:1; // starting after keyon + union { + struct { + int iLeftVolume; // left volume + int iRightVolume; // right volume + }; + int iVolume[2]; + }; ADSRInfoEx ADSRX; int iRawPitch; // raw pitch (0...3fff) - - int SB[32+4]; } SPUCHAN; /////////////////////////////////////////////////////////// @@ -128,8 +127,6 @@ typedef struct int VolLeft; int VolRight; - int iRVBLeft; - int iRVBRight; int FB_SRC_A; // (offset) int FB_SRC_B; // (offset) @@ -166,103 +163,131 @@ typedef struct 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; + int FB_SRC_A0, FB_SRC_A1, FB_SRC_B0, FB_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; - -#define regAreaGet(ch,offset) \ - regArea[((ch<<4)|(offset))>>1] - -// user settings - -extern int iVolume; -extern int iXAPitch; -extern int iSPUIRQWait; -extern int iDebugMode; -extern int iRecordMode; -extern int iUseReverb; -extern int iUseInterpolation; -// MISC - -extern int had_dma; - -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 bSpuInit; -extern unsigned int dwNewChannel; -extern unsigned int dwChannelOn; -extern unsigned int dwPendingChanOff; -extern unsigned int dwChannelDead; - -extern int SSumR[]; -extern int SSumL[]; -extern int iCycle; -extern short * pS; - -extern void (CALLBACK *cddavCallback)(unsigned short,unsigned short); +typedef union +{ + int SB[28 + 4 + 4]; + struct { + int sample[28]; + union { + struct { + int pos; + int val[4]; + } gauss; + int simple[5]; // 28-32 + } interp; + int sinc_old; + }; +} sample_buf; + +typedef struct +{ + unsigned short spuCtrl; + unsigned short spuStat; -#endif + unsigned int spuAddr; -/////////////////////////////////////////////////////////// -// XA.C globals -/////////////////////////////////////////////////////////// + unsigned int cycles_played; + unsigned int cycles_dma_end; + int decode_pos; + int decode_dirty_ch; + unsigned int bSpuInit:1; + unsigned int bSPUIsOpen:1; + unsigned int bMemDirty:1; // had external write to SPU RAM + + unsigned int dwNoiseVal; // global noise generator + unsigned int dwNoiseCount; + unsigned int dwNewChannel; // flags for faster testing, if new channel starts + unsigned int dwChannelsAudible; // not silent channels + unsigned int dwChannelDead; // silent+not useful channels + + unsigned int XARepeat; + unsigned int XALastVal; + + int iLeftXAVol; + int iRightXAVol; + + int cdClearSamples; // extra samples to clear the capture buffers + struct { // channel volume in the cd controller + unsigned char ll, lr, rl, rr; // see cdr.Attenuator* in cdrom.c + } cdv; // applied on spu side for easier emulation + + unsigned int last_keyon_cycles; -#ifndef _IN_XA + union { + unsigned char *spuMemC; + unsigned short *spuMem; + }; + unsigned char * pSpuIrq; -extern xa_decode_t * xapGlobal; + unsigned char * pSpuBuffer; + short * pS; -extern uint32_t * XAFeed; -extern uint32_t * XAPlay; -extern uint32_t * XAStart; -extern uint32_t * XAEnd; + SPUCHAN * s_chan; + REVERBInfo * rvb; -extern uint32_t XARepeat; -extern uint32_t XALastVal; + int * SSumLR; -extern uint32_t * CDDAFeed; -extern uint32_t * CDDAPlay; -extern uint32_t * CDDAStart; -extern uint32_t * CDDAEnd; + void (CALLBACK *irqCallback)(int); + //void (CALLBACK *cddavCallback)(short, short); + void (CALLBACK *scheduleCallback)(unsigned int); -extern int iLeftXAVol; -extern int iRightXAVol; + const 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 short regArea[0x400]; + + sample_buf sb[MAXCHAN]; + int interpolation; + +#if P_HAVE_PTHREAD || defined(WANT_THREAD_CODE) + sample_buf * sb_thread; + sample_buf sb_thread_[MAXCHAN]; #endif +} SPUInfo; + +#define regAreaGet(offset) \ + spu.regArea[((offset) - 0xc00) >> 1] +#define regAreaGetCh(ch, offset) \ + spu.regArea[(((ch) << 4) | (offset)) >> 1] /////////////////////////////////////////////////////////// -// REVERB.C globals +// SPU.C globals /////////////////////////////////////////////////////////// -#ifndef _IN_REVERB +#ifndef _IN_SPU + +extern SPUInfo spu; + +void do_samples(unsigned int cycles_to, int force_no_thread); +void schedule_next_irq(void); +void check_irq_io(unsigned int addr); +void do_irq_io(int cycles_after); -extern int * sRVBPlay; -extern int * sRVBEnd; -extern int * sRVBStart; +#define do_samples_if_needed(c, no_thread, samples) \ + do { \ + if ((no_thread) || (int)((c) - spu.cycles_played) >= (samples) * 768) \ + do_samples(c, no_thread); \ + } while (0) #endif + +void FeedXA(const xa_decode_t *xap); +void FeedCDDA(unsigned char *pcm, int nBytes); + +#endif /* __P_SOUND_EXTERNALS_H__ */