8bbf4e0208e37ef764f38ebd27787e8161464eac
[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 #if defined(__GNUC__) && !defined(_TMS320C6X)\r
32 #define preload __builtin_prefetch\r
33 #else\r
34 #define preload(...)\r
35 #endif\r
36 \r
37 #define PSE_LT_SPU                  4\r
38 #define PSE_SPU_ERR_SUCCESS         0\r
39 #define PSE_SPU_ERR                 -60\r
40 #define PSE_SPU_ERR_NOTCONFIGURED   PSE_SPU_ERR - 1\r
41 #define PSE_SPU_ERR_INIT            PSE_SPU_ERR - 2\r
42 #ifndef max\r
43 #define max(a,b)            (((a) > (b)) ? (a) : (b))\r
44 #define min(a,b)            (((a) < (b)) ? (a) : (b))\r
45 #endif\r
46 \r
47 ////////////////////////////////////////////////////////////////////////\r
48 // spu defines\r
49 ////////////////////////////////////////////////////////////////////////\r
50 \r
51 // num of channels\r
52 #define MAXCHAN     24\r
53 \r
54 // note: must be even due to the way reverb works now\r
55 #define NSSIZE ((44100 / 50 + 16) & ~1)\r
56 \r
57 ///////////////////////////////////////////////////////////\r
58 // struct defines\r
59 ///////////////////////////////////////////////////////////\r
60 \r
61 enum ADSR_State {\r
62  ADSR_ATTACK = 0,\r
63  ADSR_DECAY = 1,\r
64  ADSR_SUSTAIN = 2,\r
65  ADSR_RELEASE = 3,\r
66 };\r
67 \r
68 // ADSR INFOS PER CHANNEL\r
69 typedef struct\r
70 {\r
71  unsigned char  State:2;                               // ADSR_State\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  int               sinc_inv;\r
104 \r
105  unsigned char *   pCurr;                              // current pos in sound mem\r
106  unsigned char *   pLoop;                              // loop ptr in sound mem\r
107 \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      prevflags:3;                        // flags from previous block\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 } SPUCHAN;\r
119 \r
120 ///////////////////////////////////////////////////////////\r
121 \r
122 typedef struct\r
123 {\r
124  int StartAddr;      // reverb area start addr in samples\r
125  int CurrAddr;       // reverb area curr addr in samples\r
126 \r
127  int VolLeft;\r
128  int VolRight;\r
129 \r
130  int FB_SRC_A;       // (offset)\r
131  int FB_SRC_B;       // (offset)\r
132  int IIR_ALPHA;      // (coef.)\r
133  int ACC_COEF_A;     // (coef.)\r
134  int ACC_COEF_B;     // (coef.)\r
135  int ACC_COEF_C;     // (coef.)\r
136  int ACC_COEF_D;     // (coef.)\r
137  int IIR_COEF;       // (coef.)\r
138  int FB_ALPHA;       // (coef.)\r
139  int FB_X;           // (coef.)\r
140  int IIR_DEST_A0;    // (offset)\r
141  int IIR_DEST_A1;    // (offset)\r
142  int ACC_SRC_A0;     // (offset)\r
143  int ACC_SRC_A1;     // (offset)\r
144  int ACC_SRC_B0;     // (offset)\r
145  int ACC_SRC_B1;     // (offset)\r
146  int IIR_SRC_A0;     // (offset)\r
147  int IIR_SRC_A1;     // (offset)\r
148  int IIR_DEST_B0;    // (offset)\r
149  int IIR_DEST_B1;    // (offset)\r
150  int ACC_SRC_C0;     // (offset)\r
151  int ACC_SRC_C1;     // (offset)\r
152  int ACC_SRC_D0;     // (offset)\r
153  int ACC_SRC_D1;     // (offset)\r
154  int IIR_SRC_B1;     // (offset)\r
155  int IIR_SRC_B0;     // (offset)\r
156  int MIX_DEST_A0;    // (offset)\r
157  int MIX_DEST_A1;    // (offset)\r
158  int MIX_DEST_B0;    // (offset)\r
159  int MIX_DEST_B1;    // (offset)\r
160  int IN_COEF_L;      // (coef.)\r
161  int IN_COEF_R;      // (coef.)\r
162 \r
163  int dirty;          // registers changed\r
164 \r
165  // MIX_DEST_xx - FB_SRC_x\r
166  int FB_SRC_A0, FB_SRC_A1, FB_SRC_B0, FB_SRC_B1;\r
167 } REVERBInfo;\r
168 \r
169 ///////////////////////////////////////////////////////////\r
170 \r
171 // psx buffers / addresses\r
172 \r
173 #define SB_SIZE (32 + 4)\r
174 \r
175 typedef struct\r
176 {\r
177  unsigned short  spuCtrl;\r
178  unsigned short  spuStat;\r
179 \r
180  unsigned int    spuAddr;\r
181  union {\r
182   unsigned char  *spuMemC;\r
183   unsigned short *spuMem;\r
184  };\r
185  unsigned char * pSpuIrq;\r
186 \r
187  unsigned int    cycles_played;\r
188  int             decode_pos;\r
189  int             decode_dirty_ch;\r
190  unsigned int    bSpuInit:1;\r
191  unsigned int    bSPUIsOpen:1;\r
192 \r
193  unsigned int    dwNoiseVal;           // global noise generator\r
194  unsigned int    dwNoiseCount;\r
195  unsigned int    dwNewChannel;         // flags for faster testing, if new channel starts\r
196  unsigned int    dwChannelOn;          // not silent channels\r
197  unsigned int    dwChannelDead;        // silent+not useful channels\r
198 \r
199  unsigned char * pSpuBuffer;\r
200  short         * pS;\r
201 \r
202  void (CALLBACK *irqCallback)(void);   // func of main emu, called on spu irq\r
203  void (CALLBACK *cddavCallback)(unsigned short,unsigned short);\r
204  void (CALLBACK *scheduleCallback)(unsigned int);\r
205 \r
206  xa_decode_t   * xapGlobal;\r
207  unsigned int  * XAFeed;\r
208  unsigned int  * XAPlay;\r
209  unsigned int  * XAStart;\r
210  unsigned int  * XAEnd;\r
211 \r
212  unsigned int  * CDDAFeed;\r
213  unsigned int  * CDDAPlay;\r
214  unsigned int  * CDDAStart;\r
215  unsigned int  * CDDAEnd;\r
216 \r
217  unsigned int    XARepeat;\r
218  unsigned int    XALastVal;\r
219 \r
220  int             iLeftXAVol;\r
221  int             iRightXAVol;\r
222 \r
223  SPUCHAN       * s_chan;\r
224  REVERBInfo    * rvb;\r
225 \r
226  // buffers\r
227  int           * SB;\r
228  int           * SSumLR;\r
229 \r
230  int             pad[29];\r
231  unsigned short  regArea[0x400];\r
232 } SPUInfo;\r
233 \r
234 ///////////////////////////////////////////////////////////\r
235 // SPU.C globals\r
236 ///////////////////////////////////////////////////////////\r
237 \r
238 #ifndef _IN_SPU\r
239 \r
240 extern SPUInfo spu;\r
241 \r
242 void do_samples(unsigned int cycles_to, int do_sync);\r
243 void schedule_next_irq(void);\r
244 \r
245 #define regAreaGet(ch,offset) \\r
246   spu.regArea[((ch<<4)|(offset))>>1]\r
247 \r
248 #define do_samples_if_needed(c, sync) \\r
249  do { \\r
250   if (sync || (int)((c) - spu.cycles_played) >= 16 * 768) \\r
251    do_samples(c, sync); \\r
252  } while (0)\r
253 \r
254 #endif\r
255 \r