// generic defines\r
/////////////////////////////////////////////////////////\r
\r
+#ifdef __GNUC__\r
+#define noinline __attribute__((noinline))\r
+#define unlikely(x) __builtin_expect((x), 0)\r
+#else\r
+#define noinline\r
+#define unlikely(x) x\r
+#endif\r
+\r
#define PSE_LT_SPU 4\r
#define PSE_SPU_ERR_SUCCESS 0\r
#define PSE_SPU_ERR -60\r
// spu defines\r
////////////////////////////////////////////////////////////////////////\r
\r
-// sound buffer sizes\r
-// 400 ms complete sound buffer\r
-#define SOUNDSIZE 70560\r
-// 137 ms test buffer... if less than that is buffered, a new upload will happen\r
-#define TESTSIZE 24192\r
-\r
// num of channels\r
#define MAXCHAN 24\r
\r
-// ~ 1 ms of data\r
-#define NSSIZE 45\r
+// ~ FRAG_MSECS ms of data\r
+// note: must be even due to the way reverb works now\r
+#define FRAG_MSECS 2\r
+#define NSSIZE ((44100 * FRAG_MSECS / 1000 + 1) & ~1)\r
\r
///////////////////////////////////////////////////////////\r
// struct defines\r
///////////////////////////////////////////////////////////\r
\r
// ADSR INFOS PER CHANNEL\r
-typedef struct\r
-{\r
- int AttackModeExp;\r
- long AttackTime;\r
- long DecayTime;\r
- long SustainLevel;\r
- int SustainModeExp;\r
- long SustainModeDec;\r
- long SustainTime;\r
- int ReleaseModeExp;\r
- unsigned long ReleaseVal;\r
- long ReleaseTime;\r
- long ReleaseStartTime; \r
- long ReleaseVol; \r
- long lTime;\r
- long lVolume;\r
-} ADSRInfo;\r
-\r
typedef struct\r
{\r
unsigned char State:2;\r
int spos;\r
int sinc;\r
\r
- unsigned char * pStart; // start ptr into sound mem\r
unsigned char * pCurr; // current pos in sound mem\r
unsigned char * pLoop; // loop ptr in sound mem\r
\r
unsigned int bStop:1; // is channel stopped (sample _can_ still be playing, ADSR Release phase)\r
unsigned int bReverb:1; // can we do reverb on this channel? must have ctrl register bit, to get active\r
- unsigned int bIgnoreLoop:1; // ignore loop bit, if an external loop address is used\r
unsigned int bRVBActive:1; // reverb active flag\r
unsigned int bNoise:1; // noise active flag\r
unsigned int bFMod:2; // freq mod (0=off, 1=sound channel, 2=freq channel)\r
+ unsigned int prevflags:3; // flags from previous block\r
\r
- int iActFreq; // current psx pitch\r
- int iUsedFreq; // current pc pitch\r
int iLeftVolume; // left volume\r
int iRightVolume; // right volume\r
- int s_1; // last decoding infos\r
- int s_2;\r
ADSRInfoEx ADSRX;\r
int iRawPitch; // raw pitch (0...3fff)\r
\r
- int iRVBOffset; // reverb offset\r
- int iRVBRepeat; // reverb repeat\r
- int iRVBNum; // another reverb helper\r
- int iOldNoise; // old noise val for this channel \r
-\r
- int SB[32+32];\r
+ int SB[32+4];\r
} SPUCHAN;\r
\r
///////////////////////////////////////////////////////////\r
\r
int VolLeft;\r
int VolRight;\r
- int iLastRVBLeft;\r
- int iLastRVBRight;\r
int iRVBLeft;\r
int iRVBRight;\r
\r
int MIX_DEST_B1; // (offset)\r
int IN_COEF_L; // (coef.)\r
int IN_COEF_R; // (coef.)\r
+\r
+ int dirty; // registers changed\r
+\r
+ // normalized offsets\r
+ int nIIR_DEST_A0, nIIR_DEST_A1, nIIR_DEST_B0, nIIR_DEST_B1,\r
+ nACC_SRC_A0, nACC_SRC_A1, nACC_SRC_B0, nACC_SRC_B1, \r
+ nIIR_SRC_A0, nIIR_SRC_A1, nIIR_SRC_B0, nIIR_SRC_B1,\r
+ nACC_SRC_C0, nACC_SRC_C1, nACC_SRC_D0, nACC_SRC_D1,\r
+ nMIX_DEST_A0, nMIX_DEST_A1, nMIX_DEST_B0, nMIX_DEST_B1;\r
+ // MIX_DEST_xx - FB_SRC_x\r
+ int nFB_SRC_A0, nFB_SRC_A1, nFB_SRC_B0, nFB_SRC_B1;\r
} REVERBInfo;\r
\r
///////////////////////////////////////////////////////////\r
extern unsigned char * pSpuIrq;\r
extern unsigned char * pSpuBuffer;\r
\r
+#define regAreaGet(ch,offset) \\r
+ regArea[((ch<<4)|(offset))>>1]\r
+\r
// user settings\r
\r
extern int iVolume;\r
extern int iXAPitch;\r
-extern int iUseTimer;\r
-extern int iSPUIRQWait;\r
-extern int iDebugMode;\r
-extern int iRecordMode;\r
extern int iUseReverb;\r
extern int iUseInterpolation;\r
// MISC\r
\r
-extern int iSpuAsyncWait;\r
+extern int had_dma;\r
+extern int decode_pos;\r
\r
extern SPUCHAN s_chan[];\r
extern REVERBInfo rvb;\r
\r
-extern unsigned long dwNoiseVal;\r
extern unsigned short spuCtrl;\r
extern unsigned short spuStat;\r
extern unsigned short spuIrq;\r
-extern unsigned long spuAddr;\r
-extern int bEndThread; \r
-extern int bThreadEnded;\r
+extern unsigned int spuAddr;\r
extern int bSpuInit;\r
extern unsigned int dwNewChannel;\r
extern unsigned int dwChannelOn;\r
extern unsigned int dwPendingChanOff;\r
+extern unsigned int dwChannelDead;\r
\r
extern int SSumR[];\r
extern int SSumL[];\r
extern uint32_t * XAStart;\r
extern uint32_t * XAEnd;\r
\r
-extern uint32_t XARepeat;\r
-extern uint32_t XALastVal;\r
-\r
extern uint32_t * CDDAFeed;\r
extern uint32_t * CDDAPlay;\r
extern uint32_t * CDDAStart;\r
extern int * sRVBPlay;\r
extern int * sRVBEnd;\r
extern int * sRVBStart;\r
-extern int iReverbOff;\r
-extern int iReverbRepeat;\r
-extern int iReverbNum; \r
\r
#endif\r