decouple input/frame limiter from GPU plugin
[pcsx_rearmed.git] / plugins / dfsound / externals.h
1 /***************************************************************************\r
2                          externals.h  -  description\r
3                              -------------------\r
4     begin                : Wed May 15 2002\r
5     copyright            : (C) 2002 by Pete Bernert\r
6     email                : BlackDove@addcom.de\r
7  ***************************************************************************/\r
8 /***************************************************************************\r
9  *                                                                         *\r
10  *   This program is free software; you can redistribute it and/or modify  *\r
11  *   it under the terms of the GNU General Public License as published by  *\r
12  *   the Free Software Foundation; either version 2 of the License, or     *\r
13  *   (at your option) any later version. See also the license.txt file for *\r
14  *   additional informations.                                              *\r
15  *                                                                         *\r
16  ***************************************************************************/\r
17 \r
18 #include <stdint.h>\r
19 \r
20 /////////////////////////////////////////////////////////\r
21 // generic defines\r
22 /////////////////////////////////////////////////////////\r
23 \r
24 #define PSE_LT_SPU                  4\r
25 #define PSE_SPU_ERR_SUCCESS         0\r
26 #define PSE_SPU_ERR                 -60\r
27 #define PSE_SPU_ERR_NOTCONFIGURED   PSE_SPU_ERR - 1\r
28 #define PSE_SPU_ERR_INIT            PSE_SPU_ERR - 2\r
29 #ifndef max\r
30 #define max(a,b)            (((a) > (b)) ? (a) : (b))\r
31 #define min(a,b)            (((a) < (b)) ? (a) : (b))\r
32 #endif\r
33 \r
34 ////////////////////////////////////////////////////////////////////////\r
35 // spu defines\r
36 ////////////////////////////////////////////////////////////////////////\r
37 \r
38 // sound buffer sizes\r
39 // 400 ms complete sound buffer\r
40 #define SOUNDSIZE   70560\r
41 // 137 ms test buffer... if less than that is buffered, a new upload will happen\r
42 #define TESTSIZE    24192\r
43 \r
44 // num of channels\r
45 #define MAXCHAN     24\r
46 \r
47 // ~ 1 ms of data\r
48 #define NSSIZE 45\r
49 \r
50 ///////////////////////////////////////////////////////////\r
51 // struct defines\r
52 ///////////////////////////////////////////////////////////\r
53 \r
54 // ADSR INFOS PER CHANNEL\r
55 typedef struct\r
56 {\r
57  int            AttackModeExp;\r
58  long           AttackTime;\r
59  long           DecayTime;\r
60  long           SustainLevel;\r
61  int            SustainModeExp;\r
62  long           SustainModeDec;\r
63  long           SustainTime;\r
64  int            ReleaseModeExp;\r
65  unsigned long  ReleaseVal;\r
66  long           ReleaseTime;\r
67  long           ReleaseStartTime; \r
68  long           ReleaseVol; \r
69  long           lTime;\r
70  long           lVolume;\r
71 } ADSRInfo;\r
72 \r
73 typedef struct\r
74 {\r
75  int            State;\r
76  int            AttackModeExp;\r
77  int            AttackRate;\r
78  int            DecayRate;\r
79  int            SustainLevel;\r
80  int            SustainModeExp;\r
81  int            SustainIncrease;\r
82  int            SustainRate;\r
83  int            ReleaseModeExp;\r
84  int            ReleaseRate;\r
85  int            EnvelopeVol;\r
86  long           lVolume;\r
87  long           lDummy1;\r
88  long           lDummy2;\r
89 } ADSRInfoEx;\r
90               \r
91 ///////////////////////////////////////////////////////////\r
92 \r
93 // Tmp Flags\r
94 \r
95 // used for debug channel muting\r
96 #define FLAG_MUTE  1\r
97 \r
98 // used for simple interpolation\r
99 #define FLAG_IPOL0 2\r
100 #define FLAG_IPOL1 4\r
101 \r
102 ///////////////////////////////////////////////////////////\r
103 \r
104 // MAIN CHANNEL STRUCT\r
105 typedef struct\r
106 {\r
107  // no mutexes used anymore... don't need them to sync access\r
108  //HANDLE            hMutex;\r
109 \r
110  int               bNew;                               // start flag\r
111 \r
112  int               iSBPos;                             // mixing stuff\r
113  int               spos;\r
114  int               sinc;\r
115  int               SB[32+32];                          // Pete added another 32 dwords in 1.6 ... prevents overflow issues with gaussian/cubic interpolation (thanx xodnizel!), and can be used for even better interpolations, eh? :)\r
116  int               sval;\r
117 \r
118  unsigned char *   pStart;                             // start ptr into sound mem\r
119  unsigned char *   pCurr;                              // current pos in sound mem\r
120  unsigned char *   pLoop;                              // loop ptr in sound mem\r
121 \r
122  int               bOn;                                // is channel active (sample playing?)\r
123  int               bStop;                              // is channel stopped (sample _can_ still be playing, ADSR Release phase)\r
124  int               bReverb;                            // can we do reverb on this channel? must have ctrl register bit, to get active\r
125  int               iActFreq;                           // current psx pitch\r
126  int               iUsedFreq;                          // current pc pitch\r
127  int               iLeftVolume;                        // left volume\r
128  int               iLeftVolRaw;                        // left psx volume value\r
129  int               bIgnoreLoop;                        // ignore loop bit, if an external loop address is used\r
130  int               iMute;                              // mute mode\r
131  int               iRightVolume;                       // right volume\r
132  int               iRightVolRaw;                       // right psx volume value\r
133  int               iRawPitch;                          // raw pitch (0...3fff)\r
134  int               iIrqDone;                           // debug irq done flag\r
135  int               s_1;                                // last decoding infos\r
136  int               s_2;\r
137  int               bRVBActive;                         // reverb active flag\r
138  int               iRVBOffset;                         // reverb offset\r
139  int               iRVBRepeat;                         // reverb repeat\r
140  int               bNoise;                             // noise active flag\r
141  int               bFMod;                              // freq mod (0=off, 1=sound channel, 2=freq channel)\r
142  int               iRVBNum;                            // another reverb helper\r
143  int               iOldNoise;                          // old noise val for this channel   \r
144  ADSRInfo          ADSR;                               // active ADSR settings\r
145  ADSRInfoEx        ADSRX;                              // next ADSR settings (will be moved to active on sample start)\r
146 } SPUCHAN;\r
147 \r
148 ///////////////////////////////////////////////////////////\r
149 \r
150 typedef struct\r
151 {\r
152  int StartAddr;      // reverb area start addr in samples\r
153  int CurrAddr;       // reverb area curr addr in samples\r
154 \r
155  int VolLeft;\r
156  int VolRight;\r
157  int iLastRVBLeft;\r
158  int iLastRVBRight;\r
159  int iRVBLeft;\r
160  int iRVBRight;\r
161 \r
162  int FB_SRC_A;       // (offset)\r
163  int FB_SRC_B;       // (offset)\r
164  int IIR_ALPHA;      // (coef.)\r
165  int ACC_COEF_A;     // (coef.)\r
166  int ACC_COEF_B;     // (coef.)\r
167  int ACC_COEF_C;     // (coef.)\r
168  int ACC_COEF_D;     // (coef.)\r
169  int IIR_COEF;       // (coef.)\r
170  int FB_ALPHA;       // (coef.)\r
171  int FB_X;           // (coef.)\r
172  int IIR_DEST_A0;    // (offset)\r
173  int IIR_DEST_A1;    // (offset)\r
174  int ACC_SRC_A0;     // (offset)\r
175  int ACC_SRC_A1;     // (offset)\r
176  int ACC_SRC_B0;     // (offset)\r
177  int ACC_SRC_B1;     // (offset)\r
178  int IIR_SRC_A0;     // (offset)\r
179  int IIR_SRC_A1;     // (offset)\r
180  int IIR_DEST_B0;    // (offset)\r
181  int IIR_DEST_B1;    // (offset)\r
182  int ACC_SRC_C0;     // (offset)\r
183  int ACC_SRC_C1;     // (offset)\r
184  int ACC_SRC_D0;     // (offset)\r
185  int ACC_SRC_D1;     // (offset)\r
186  int IIR_SRC_B1;     // (offset)\r
187  int IIR_SRC_B0;     // (offset)\r
188  int MIX_DEST_A0;    // (offset)\r
189  int MIX_DEST_A1;    // (offset)\r
190  int MIX_DEST_B0;    // (offset)\r
191  int MIX_DEST_B1;    // (offset)\r
192  int IN_COEF_L;      // (coef.)\r
193  int IN_COEF_R;      // (coef.)\r
194 } REVERBInfo;\r
195 \r
196 ///////////////////////////////////////////////////////////\r
197 // SPU.C globals\r
198 ///////////////////////////////////////////////////////////\r
199 \r
200 #ifndef _IN_SPU\r
201 \r
202 // psx buffers / addresses\r
203 \r
204 extern unsigned short  regArea[];                        \r
205 extern unsigned short  spuMem[];\r
206 extern unsigned char * spuMemC;\r
207 extern unsigned char * pSpuIrq;\r
208 extern unsigned char * pSpuBuffer;\r
209 \r
210 // user settings\r
211 \r
212 extern int        iVolume;\r
213 extern int        iXAPitch;\r
214 extern int        iUseTimer;\r
215 extern int        iSPUIRQWait;\r
216 extern int        iDebugMode;\r
217 extern int        iRecordMode;\r
218 extern int        iUseReverb;\r
219 extern int        iUseInterpolation;\r
220 extern int        iDisStereo;\r
221 // MISC\r
222 \r
223 extern int iSpuAsyncWait;\r
224 \r
225 extern SPUCHAN s_chan[];\r
226 extern REVERBInfo rvb;\r
227 \r
228 extern unsigned long dwNoiseVal;\r
229 extern unsigned short spuCtrl;\r
230 extern unsigned short spuStat;\r
231 extern unsigned short spuIrq;\r
232 extern unsigned long  spuAddr;\r
233 extern int      bEndThread; \r
234 extern int      bThreadEnded;\r
235 extern int      bSpuInit;\r
236 extern unsigned long dwNewChannel;\r
237 \r
238 extern int      SSumR[];\r
239 extern int      SSumL[];\r
240 extern int      iCycle;\r
241 extern short *  pS;\r
242 \r
243 extern void (CALLBACK *cddavCallback)(unsigned short,unsigned short);\r
244 \r
245 #endif\r
246 \r
247 ///////////////////////////////////////////////////////////\r
248 // XA.C globals\r
249 ///////////////////////////////////////////////////////////\r
250 \r
251 #ifndef _IN_XA\r
252 \r
253 extern xa_decode_t   * xapGlobal;\r
254 \r
255 extern uint32_t * XAFeed;\r
256 extern uint32_t * XAPlay;\r
257 extern uint32_t * XAStart;\r
258 extern uint32_t * XAEnd;\r
259 \r
260 extern uint32_t   XARepeat;\r
261 extern uint32_t   XALastVal;\r
262 \r
263 extern uint32_t * CDDAFeed;\r
264 extern uint32_t * CDDAPlay;\r
265 extern uint32_t * CDDAStart;\r
266 extern uint32_t * CDDAEnd;\r
267 \r
268 extern int           iLeftXAVol;\r
269 extern int           iRightXAVol;\r
270 \r
271 #endif\r
272 \r
273 ///////////////////////////////////////////////////////////\r
274 // REVERB.C globals\r
275 ///////////////////////////////////////////////////////////\r
276 \r
277 #ifndef _IN_REVERB\r
278 \r
279 extern int *          sRVBPlay;\r
280 extern int *          sRVBEnd;\r
281 extern int *          sRVBStart;\r
282 extern int            iReverbOff;\r
283 extern int            iReverbRepeat;\r
284 extern int            iReverbNum;    \r
285 \r
286 #endif\r