spu: reduce use of globals
[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 #ifdef __GNUC__\r
25 #define noinline __attribute__((noinline))\r
26 #define unlikely(x) __builtin_expect((x), 0)\r
27 #else\r
28 #define noinline\r
29 #define unlikely(x) x\r
30 #endif\r
31 \r
32 #define PSE_LT_SPU                  4\r
33 #define PSE_SPU_ERR_SUCCESS         0\r
34 #define PSE_SPU_ERR                 -60\r
35 #define PSE_SPU_ERR_NOTCONFIGURED   PSE_SPU_ERR - 1\r
36 #define PSE_SPU_ERR_INIT            PSE_SPU_ERR - 2\r
37 #ifndef max\r
38 #define max(a,b)            (((a) > (b)) ? (a) : (b))\r
39 #define min(a,b)            (((a) < (b)) ? (a) : (b))\r
40 #endif\r
41 \r
42 ////////////////////////////////////////////////////////////////////////\r
43 // spu defines\r
44 ////////////////////////////////////////////////////////////////////////\r
45 \r
46 // num of channels\r
47 #define MAXCHAN     24\r
48 \r
49 // note: must be even due to the way reverb works now\r
50 #define NSSIZE ((44100 / 50 + 16) & ~1)\r
51 \r
52 ///////////////////////////////////////////////////////////\r
53 // struct defines\r
54 ///////////////////////////////////////////////////////////\r
55 \r
56 // ADSR INFOS PER CHANNEL\r
57 typedef struct\r
58 {\r
59  unsigned char  State:2;\r
60  unsigned char  AttackModeExp:1;\r
61  unsigned char  SustainModeExp:1;\r
62  unsigned char  SustainIncrease:1;\r
63  unsigned char  ReleaseModeExp:1;\r
64  unsigned char  AttackRate;\r
65  unsigned char  DecayRate;\r
66  unsigned char  SustainLevel;\r
67  unsigned char  SustainRate;\r
68  unsigned char  ReleaseRate;\r
69  int            EnvelopeVol;\r
70 } ADSRInfoEx;\r
71               \r
72 ///////////////////////////////////////////////////////////\r
73 \r
74 // Tmp Flags\r
75 \r
76 // used for debug channel muting\r
77 #define FLAG_MUTE  1\r
78 \r
79 // used for simple interpolation\r
80 #define FLAG_IPOL0 2\r
81 #define FLAG_IPOL1 4\r
82 \r
83 ///////////////////////////////////////////////////////////\r
84 \r
85 // MAIN CHANNEL STRUCT\r
86 typedef struct\r
87 {\r
88  int               iSBPos;                             // mixing stuff\r
89  int               spos;\r
90  int               sinc;\r
91  int               sinc_inv;\r
92 \r
93  unsigned char *   pCurr;                              // current pos in sound mem\r
94  unsigned char *   pLoop;                              // loop ptr in sound mem\r
95 \r
96  unsigned int      bStop:1;                            // is channel stopped (sample _can_ still be playing, ADSR Release phase)\r
97  unsigned int      bReverb:1;                          // can we do reverb on this channel? must have ctrl register bit, to get active\r
98  unsigned int      bRVBActive:1;                       // reverb active flag\r
99  unsigned int      bNoise:1;                           // noise active flag\r
100  unsigned int      bFMod:2;                            // freq mod (0=off, 1=sound channel, 2=freq channel)\r
101  unsigned int      prevflags:3;                        // flags from previous block\r
102 \r
103  int               iLeftVolume;                        // left volume\r
104  int               iRightVolume;                       // right volume\r
105  ADSRInfoEx        ADSRX;\r
106  int               iRawPitch;                          // raw pitch (0...3fff)\r
107 \r
108  int               SB[32+4];\r
109 } SPUCHAN;\r
110 \r
111 ///////////////////////////////////////////////////////////\r
112 \r
113 typedef struct\r
114 {\r
115  int StartAddr;      // reverb area start addr in samples\r
116  int CurrAddr;       // reverb area curr addr in samples\r
117 \r
118  int VolLeft;\r
119  int VolRight;\r
120  int iRVBLeft;\r
121  int iRVBRight;\r
122 \r
123  int FB_SRC_A;       // (offset)\r
124  int FB_SRC_B;       // (offset)\r
125  int IIR_ALPHA;      // (coef.)\r
126  int ACC_COEF_A;     // (coef.)\r
127  int ACC_COEF_B;     // (coef.)\r
128  int ACC_COEF_C;     // (coef.)\r
129  int ACC_COEF_D;     // (coef.)\r
130  int IIR_COEF;       // (coef.)\r
131  int FB_ALPHA;       // (coef.)\r
132  int FB_X;           // (coef.)\r
133  int IIR_DEST_A0;    // (offset)\r
134  int IIR_DEST_A1;    // (offset)\r
135  int ACC_SRC_A0;     // (offset)\r
136  int ACC_SRC_A1;     // (offset)\r
137  int ACC_SRC_B0;     // (offset)\r
138  int ACC_SRC_B1;     // (offset)\r
139  int IIR_SRC_A0;     // (offset)\r
140  int IIR_SRC_A1;     // (offset)\r
141  int IIR_DEST_B0;    // (offset)\r
142  int IIR_DEST_B1;    // (offset)\r
143  int ACC_SRC_C0;     // (offset)\r
144  int ACC_SRC_C1;     // (offset)\r
145  int ACC_SRC_D0;     // (offset)\r
146  int ACC_SRC_D1;     // (offset)\r
147  int IIR_SRC_B1;     // (offset)\r
148  int IIR_SRC_B0;     // (offset)\r
149  int MIX_DEST_A0;    // (offset)\r
150  int MIX_DEST_A1;    // (offset)\r
151  int MIX_DEST_B0;    // (offset)\r
152  int MIX_DEST_B1;    // (offset)\r
153  int IN_COEF_L;      // (coef.)\r
154  int IN_COEF_R;      // (coef.)\r
155 \r
156  int dirty;          // registers changed\r
157 \r
158  // normalized offsets\r
159  int nIIR_DEST_A0, nIIR_DEST_A1, nIIR_DEST_B0, nIIR_DEST_B1,\r
160         nACC_SRC_A0, nACC_SRC_A1, nACC_SRC_B0, nACC_SRC_B1, \r
161         nIIR_SRC_A0, nIIR_SRC_A1, nIIR_SRC_B0, nIIR_SRC_B1,\r
162         nACC_SRC_C0, nACC_SRC_C1, nACC_SRC_D0, nACC_SRC_D1,\r
163         nMIX_DEST_A0, nMIX_DEST_A1, nMIX_DEST_B0, nMIX_DEST_B1;\r
164  // MIX_DEST_xx - FB_SRC_x\r
165  int nFB_SRC_A0, nFB_SRC_A1, nFB_SRC_B0, nFB_SRC_B1;\r
166 } REVERBInfo;\r
167 \r
168 ///////////////////////////////////////////////////////////\r
169 \r
170 // psx buffers / addresses\r
171 \r
172 typedef struct\r
173 {\r
174  unsigned short  spuCtrl;\r
175  unsigned short  spuStat;\r
176 \r
177  unsigned int    spuAddr;\r
178  unsigned char * spuMemC;\r
179  unsigned char * pSpuIrq;\r
180 \r
181  unsigned int    cycles_played;\r
182  int             decode_pos;\r
183  int             decode_dirty_ch;\r
184  unsigned int    bSpuInit:1;\r
185  unsigned int    bSPUIsOpen:1;\r
186 \r
187  unsigned int    dwNoiseVal;           // global noise generator\r
188  unsigned int    dwNoiseCount;\r
189  unsigned int    dwNewChannel;         // flags for faster testing, if new channel starts\r
190  unsigned int    dwChannelOn;          // not silent channels\r
191  unsigned int    dwChannelDead;        // silent+not useful channels\r
192 \r
193  unsigned char * pSpuBuffer;\r
194  short         * pS;\r
195 \r
196  void (CALLBACK *irqCallback)(void);   // func of main emu, called on spu irq\r
197  void (CALLBACK *cddavCallback)(unsigned short,unsigned short);\r
198  void (CALLBACK *scheduleCallback)(unsigned int);\r
199 \r
200  int           * sRVBStart;\r
201 \r
202  xa_decode_t   * xapGlobal;\r
203  unsigned int  * XAFeed;\r
204  unsigned int  * XAPlay;\r
205  unsigned int  * XAStart;\r
206  unsigned int  * XAEnd;\r
207 \r
208  unsigned int  * CDDAFeed;\r
209  unsigned int  * CDDAPlay;\r
210  unsigned int  * CDDAStart;\r
211  unsigned int  * CDDAEnd;\r
212 \r
213  unsigned int    XARepeat;\r
214  unsigned int    XALastVal;\r
215 \r
216  int             iLeftXAVol;\r
217  int             iRightXAVol;\r
218 \r
219  int             pad[32];\r
220  unsigned short  regArea[0x400];\r
221  unsigned short  spuMem[256*1024];\r
222 } SPUInfo;\r
223 \r
224 ///////////////////////////////////////////////////////////\r
225 // SPU.C globals\r
226 ///////////////////////////////////////////////////////////\r
227 \r
228 #ifndef _IN_SPU\r
229 \r
230 extern SPUInfo spu;\r
231 extern SPUCHAN s_chan[];\r
232 extern REVERBInfo rvb;\r
233 \r
234 void do_samples(unsigned int cycles_to);\r
235 void schedule_next_irq(void);\r
236 \r
237 #define regAreaGet(ch,offset) \\r
238   spu.regArea[((ch<<4)|(offset))>>1]\r
239 \r
240 #define do_samples_if_needed(c) \\r
241  do { \\r
242   if ((int)((c) - spu.cycles_played) >= 16 * 768) \\r
243    do_samples(c); \\r
244  } while (0)\r
245 \r
246 #endif\r
247 \r