spu: remove some hacks, to be reworked
[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 // num of channels\r
39 #define MAXCHAN     24\r
40 \r
41 // ~ 1 ms of data\r
42 // note: must be even due to the way reverb works now\r
43 #define FRAG_MSECS 2\r
44 #define NSSIZE ((44100 * FRAG_MSECS / 1000 + 1) & ~1)\r
45 \r
46 ///////////////////////////////////////////////////////////\r
47 // struct defines\r
48 ///////////////////////////////////////////////////////////\r
49 \r
50 // ADSR INFOS PER CHANNEL\r
51 typedef struct\r
52 {\r
53  int            AttackModeExp;\r
54  long           AttackTime;\r
55  long           DecayTime;\r
56  long           SustainLevel;\r
57  int            SustainModeExp;\r
58  long           SustainModeDec;\r
59  long           SustainTime;\r
60  int            ReleaseModeExp;\r
61  unsigned long  ReleaseVal;\r
62  long           ReleaseTime;\r
63  long           ReleaseStartTime; \r
64  long           ReleaseVol; \r
65  long           lTime;\r
66  long           lVolume;\r
67 } ADSRInfo;\r
68 \r
69 typedef struct\r
70 {\r
71  unsigned char  State:2;\r
72  unsigned char  AttackModeExp:1;\r
73  unsigned char  SustainModeExp:1;\r
74  unsigned char  SustainIncrease:1;\r
75  unsigned char  ReleaseModeExp:1;\r
76  unsigned char  AttackRate;\r
77  unsigned char  DecayRate;\r
78  unsigned char  SustainLevel;\r
79  unsigned char  SustainRate;\r
80  unsigned char  ReleaseRate;\r
81  int            EnvelopeVol;\r
82 } ADSRInfoEx;\r
83               \r
84 ///////////////////////////////////////////////////////////\r
85 \r
86 // Tmp Flags\r
87 \r
88 // used for debug channel muting\r
89 #define FLAG_MUTE  1\r
90 \r
91 // used for simple interpolation\r
92 #define FLAG_IPOL0 2\r
93 #define FLAG_IPOL1 4\r
94 \r
95 ///////////////////////////////////////////////////////////\r
96 \r
97 // MAIN CHANNEL STRUCT\r
98 typedef struct\r
99 {\r
100  int               iSBPos;                             // mixing stuff\r
101  int               spos;\r
102  int               sinc;\r
103 \r
104  unsigned char *   pCurr;                              // current pos in sound mem\r
105  unsigned char *   pLoop;                              // loop ptr in sound mem\r
106 \r
107  unsigned int      bStop:1;                            // is channel stopped (sample _can_ still be playing, ADSR Release phase)\r
108  unsigned int      bReverb:1;                          // can we do reverb on this channel? must have ctrl register bit, to get active\r
109  unsigned int      bRVBActive:1;                       // reverb active flag\r
110  unsigned int      bNoise:1;                           // noise active flag\r
111  unsigned int      bFMod:2;                            // freq mod (0=off, 1=sound channel, 2=freq channel)\r
112  unsigned int      bJump:1;                            // last decoded block jumped\r
113 \r
114  int               iLeftVolume;                        // left volume\r
115  int               iRightVolume;                       // right volume\r
116  ADSRInfoEx        ADSRX;\r
117  int               iRawPitch;                          // raw pitch (0...3fff)\r
118 \r
119  int               SB[32+4];\r
120 } SPUCHAN;\r
121 \r
122 ///////////////////////////////////////////////////////////\r
123 \r
124 typedef struct\r
125 {\r
126  int StartAddr;      // reverb area start addr in samples\r
127  int CurrAddr;       // reverb area curr addr in samples\r
128 \r
129  int VolLeft;\r
130  int VolRight;\r
131  int iRVBLeft;\r
132  int iRVBRight;\r
133 \r
134  int FB_SRC_A;       // (offset)\r
135  int FB_SRC_B;       // (offset)\r
136  int IIR_ALPHA;      // (coef.)\r
137  int ACC_COEF_A;     // (coef.)\r
138  int ACC_COEF_B;     // (coef.)\r
139  int ACC_COEF_C;     // (coef.)\r
140  int ACC_COEF_D;     // (coef.)\r
141  int IIR_COEF;       // (coef.)\r
142  int FB_ALPHA;       // (coef.)\r
143  int FB_X;           // (coef.)\r
144  int IIR_DEST_A0;    // (offset)\r
145  int IIR_DEST_A1;    // (offset)\r
146  int ACC_SRC_A0;     // (offset)\r
147  int ACC_SRC_A1;     // (offset)\r
148  int ACC_SRC_B0;     // (offset)\r
149  int ACC_SRC_B1;     // (offset)\r
150  int IIR_SRC_A0;     // (offset)\r
151  int IIR_SRC_A1;     // (offset)\r
152  int IIR_DEST_B0;    // (offset)\r
153  int IIR_DEST_B1;    // (offset)\r
154  int ACC_SRC_C0;     // (offset)\r
155  int ACC_SRC_C1;     // (offset)\r
156  int ACC_SRC_D0;     // (offset)\r
157  int ACC_SRC_D1;     // (offset)\r
158  int IIR_SRC_B1;     // (offset)\r
159  int IIR_SRC_B0;     // (offset)\r
160  int MIX_DEST_A0;    // (offset)\r
161  int MIX_DEST_A1;    // (offset)\r
162  int MIX_DEST_B0;    // (offset)\r
163  int MIX_DEST_B1;    // (offset)\r
164  int IN_COEF_L;      // (coef.)\r
165  int IN_COEF_R;      // (coef.)\r
166 \r
167  int dirty;          // registers changed\r
168 \r
169  // normalized offsets\r
170  int nIIR_DEST_A0, nIIR_DEST_A1, nIIR_DEST_B0, nIIR_DEST_B1,\r
171         nACC_SRC_A0, nACC_SRC_A1, nACC_SRC_B0, nACC_SRC_B1, \r
172         nIIR_SRC_A0, nIIR_SRC_A1, nIIR_SRC_B0, nIIR_SRC_B1,\r
173         nACC_SRC_C0, nACC_SRC_C1, nACC_SRC_D0, nACC_SRC_D1,\r
174         nMIX_DEST_A0, nMIX_DEST_A1, nMIX_DEST_B0, nMIX_DEST_B1;\r
175  // MIX_DEST_xx - FB_SRC_x\r
176  int nFB_SRC_A0, nFB_SRC_A1, nFB_SRC_B0, nFB_SRC_B1;\r
177 } REVERBInfo;\r
178 \r
179 ///////////////////////////////////////////////////////////\r
180 // SPU.C globals\r
181 ///////////////////////////////////////////////////////////\r
182 \r
183 #ifndef _IN_SPU\r
184 \r
185 // psx buffers / addresses\r
186 \r
187 extern unsigned short  regArea[];                        \r
188 extern unsigned short  spuMem[];\r
189 extern unsigned char * spuMemC;\r
190 extern unsigned char * pSpuIrq;\r
191 extern unsigned char * pSpuBuffer;\r
192 \r
193 #define regAreaGet(ch,offset) \\r
194   regArea[((ch<<4)|(offset))>>1]\r
195 \r
196 // user settings\r
197 \r
198 extern int        iVolume;\r
199 extern int        iXAPitch;\r
200 extern int        iSPUIRQWait;\r
201 extern int        iDebugMode;\r
202 extern int        iRecordMode;\r
203 extern int        iUseReverb;\r
204 extern int        iUseInterpolation;\r
205 // MISC\r
206 \r
207 extern int iSpuAsyncWait;\r
208 \r
209 extern SPUCHAN s_chan[];\r
210 extern REVERBInfo rvb;\r
211 \r
212 extern unsigned long dwNoiseVal;\r
213 extern unsigned short spuCtrl;\r
214 extern unsigned short spuStat;\r
215 extern unsigned short spuIrq;\r
216 extern unsigned long  spuAddr;\r
217 extern int      bSpuInit;\r
218 extern unsigned int dwNewChannel;\r
219 extern unsigned int dwChannelOn;\r
220 extern unsigned int dwPendingChanOff;\r
221 extern unsigned int dwChannelDead;\r
222 \r
223 extern int      SSumR[];\r
224 extern int      SSumL[];\r
225 extern int      iCycle;\r
226 extern short *  pS;\r
227 \r
228 extern void (CALLBACK *cddavCallback)(unsigned short,unsigned short);\r
229 \r
230 #endif\r
231 \r
232 ///////////////////////////////////////////////////////////\r
233 // XA.C globals\r
234 ///////////////////////////////////////////////////////////\r
235 \r
236 #ifndef _IN_XA\r
237 \r
238 extern xa_decode_t   * xapGlobal;\r
239 \r
240 extern uint32_t * XAFeed;\r
241 extern uint32_t * XAPlay;\r
242 extern uint32_t * XAStart;\r
243 extern uint32_t * XAEnd;\r
244 \r
245 extern uint32_t   XARepeat;\r
246 extern uint32_t   XALastVal;\r
247 \r
248 extern uint32_t * CDDAFeed;\r
249 extern uint32_t * CDDAPlay;\r
250 extern uint32_t * CDDAStart;\r
251 extern uint32_t * CDDAEnd;\r
252 \r
253 extern int           iLeftXAVol;\r
254 extern int           iRightXAVol;\r
255 \r
256 #endif\r
257 \r
258 ///////////////////////////////////////////////////////////\r
259 // REVERB.C globals\r
260 ///////////////////////////////////////////////////////////\r
261 \r
262 #ifndef _IN_REVERB\r
263 \r
264 extern int *          sRVBPlay;\r
265 extern int *          sRVBEnd;\r
266 extern int *          sRVBStart;\r
267 \r
268 #endif\r