spu: try keyoff ignore
[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 #ifndef __P_SOUND_EXTERNALS_H__\r
19 #define __P_SOUND_EXTERNALS_H__\r
20 \r
21 #include <stdint.h>\r
22 \r
23 /////////////////////////////////////////////////////////\r
24 // generic defines\r
25 /////////////////////////////////////////////////////////\r
26 \r
27 //#define log_unhandled printf\r
28 #define log_unhandled(...)\r
29 \r
30 #ifdef __GNUC__\r
31 #define noinline __attribute__((noinline))\r
32 #define unlikely(x) __builtin_expect((x), 0)\r
33 #else\r
34 #define noinline\r
35 #define unlikely(x) x\r
36 #endif\r
37 #if defined(__GNUC__) && !defined(_TMS320C6X)\r
38 #define preload __builtin_prefetch\r
39 #else\r
40 #define preload(...)\r
41 #endif\r
42 \r
43 #define PSE_LT_SPU                  4\r
44 #define PSE_SPU_ERR_SUCCESS         0\r
45 #define PSE_SPU_ERR                 -60\r
46 #define PSE_SPU_ERR_NOTCONFIGURED   PSE_SPU_ERR - 1\r
47 #define PSE_SPU_ERR_INIT            PSE_SPU_ERR - 2\r
48 #ifndef max\r
49 #define max(a,b)            (((a) > (b)) ? (a) : (b))\r
50 #define min(a,b)            (((a) < (b)) ? (a) : (b))\r
51 #endif\r
52 \r
53 ////////////////////////////////////////////////////////////////////////\r
54 // spu defines\r
55 ////////////////////////////////////////////////////////////////////////\r
56 \r
57 // num of channels\r
58 #define MAXCHAN     24\r
59 \r
60 // note: must be even due to the way reverb works now\r
61 #define NSSIZE ((44100 / 50 + 16) & ~1)\r
62 \r
63 ///////////////////////////////////////////////////////////\r
64 // struct defines\r
65 ///////////////////////////////////////////////////////////\r
66 \r
67 enum ADSR_State {\r
68  ADSR_ATTACK = 0,\r
69  ADSR_DECAY = 1,\r
70  ADSR_SUSTAIN = 2,\r
71  ADSR_RELEASE = 3,\r
72 };\r
73 \r
74 // ADSR INFOS PER CHANNEL\r
75 typedef struct\r
76 {\r
77  unsigned char  State:2;                               // ADSR_State\r
78  unsigned char  AttackModeExp:1;\r
79  unsigned char  SustainModeExp:1;\r
80  unsigned char  SustainIncrease:1;\r
81  unsigned char  ReleaseModeExp:1;\r
82  unsigned char  AttackRate;\r
83  unsigned char  DecayRate;\r
84  unsigned char  SustainLevel;\r
85  unsigned char  SustainRate;\r
86  unsigned char  ReleaseRate;\r
87  int            EnvelopeVol;\r
88 } ADSRInfoEx;\r
89               \r
90 ///////////////////////////////////////////////////////////\r
91 \r
92 // Tmp Flags\r
93 \r
94 // used for debug channel muting\r
95 #define FLAG_MUTE  1\r
96 \r
97 // used for simple interpolation\r
98 #define FLAG_IPOL0 2\r
99 #define FLAG_IPOL1 4\r
100 \r
101 ///////////////////////////////////////////////////////////\r
102 \r
103 // MAIN CHANNEL STRUCT\r
104 typedef struct\r
105 {\r
106  int               iSBPos;                             // mixing stuff\r
107  int               spos;\r
108  int               sinc;\r
109  int               sinc_inv;\r
110 \r
111  unsigned char *   pCurr;                              // current pos in sound mem\r
112  unsigned char *   pLoop;                              // loop ptr in sound mem\r
113 \r
114  unsigned int      bReverb:1;                          // can we do reverb on this channel? must have ctrl register bit, to get active\r
115  unsigned int      bRVBActive:1;                       // reverb active flag\r
116  unsigned int      bNoise:1;                           // noise active flag\r
117  unsigned int      bFMod:2;                            // freq mod (0=off, 1=sound channel, 2=freq channel)\r
118  unsigned int      prevflags:3;                        // flags from previous block\r
119  unsigned int      bIgnoreLoop:1;                      // Ignore loop\r
120  unsigned int      bStarting:1;                        // starting after keyon\r
121  union {\r
122   struct {\r
123    int             iLeftVolume;                        // left volume\r
124    int             iRightVolume;                       // right volume\r
125   };\r
126   int              iVolume[2];\r
127  };\r
128  ADSRInfoEx        ADSRX;\r
129  int               iRawPitch;                          // raw pitch (0...3fff)\r
130 } SPUCHAN;\r
131 \r
132 ///////////////////////////////////////////////////////////\r
133 \r
134 typedef struct\r
135 {\r
136  int StartAddr;      // reverb area start addr in samples\r
137  int CurrAddr;       // reverb area curr addr in samples\r
138 \r
139  int VolLeft;\r
140  int VolRight;\r
141 \r
142  int FB_SRC_A;       // (offset)\r
143  int FB_SRC_B;       // (offset)\r
144  int IIR_ALPHA;      // (coef.)\r
145  int ACC_COEF_A;     // (coef.)\r
146  int ACC_COEF_B;     // (coef.)\r
147  int ACC_COEF_C;     // (coef.)\r
148  int ACC_COEF_D;     // (coef.)\r
149  int IIR_COEF;       // (coef.)\r
150  int FB_ALPHA;       // (coef.)\r
151  int FB_X;           // (coef.)\r
152  int IIR_DEST_A0;    // (offset)\r
153  int IIR_DEST_A1;    // (offset)\r
154  int ACC_SRC_A0;     // (offset)\r
155  int ACC_SRC_A1;     // (offset)\r
156  int ACC_SRC_B0;     // (offset)\r
157  int ACC_SRC_B1;     // (offset)\r
158  int IIR_SRC_A0;     // (offset)\r
159  int IIR_SRC_A1;     // (offset)\r
160  int IIR_DEST_B0;    // (offset)\r
161  int IIR_DEST_B1;    // (offset)\r
162  int ACC_SRC_C0;     // (offset)\r
163  int ACC_SRC_C1;     // (offset)\r
164  int ACC_SRC_D0;     // (offset)\r
165  int ACC_SRC_D1;     // (offset)\r
166  int IIR_SRC_B1;     // (offset)\r
167  int IIR_SRC_B0;     // (offset)\r
168  int MIX_DEST_A0;    // (offset)\r
169  int MIX_DEST_A1;    // (offset)\r
170  int MIX_DEST_B0;    // (offset)\r
171  int MIX_DEST_B1;    // (offset)\r
172  int IN_COEF_L;      // (coef.)\r
173  int IN_COEF_R;      // (coef.)\r
174 \r
175  int dirty;          // registers changed\r
176 \r
177  // MIX_DEST_xx - FB_SRC_x\r
178  int FB_SRC_A0, FB_SRC_A1, FB_SRC_B0, FB_SRC_B1;\r
179 } REVERBInfo;\r
180 \r
181 ///////////////////////////////////////////////////////////\r
182 \r
183 // psx buffers / addresses\r
184 \r
185 typedef union\r
186 {\r
187  int SB[28 + 4 + 4];\r
188  struct {\r
189   int sample[28];\r
190   union {\r
191    struct {\r
192     int pos;\r
193     signed short val[4];\r
194    } gauss;\r
195    int simple[5]; // 28-32\r
196   } interp;\r
197   int sinc_old;\r
198  };\r
199 } sample_buf;\r
200 \r
201 typedef struct\r
202 {\r
203  unsigned short  spuCtrl;\r
204  unsigned short  spuStat;\r
205 \r
206  unsigned int    spuAddr;\r
207 \r
208  unsigned int    cycles_played;\r
209  unsigned int    cycles_dma_end;\r
210  int             decode_pos;\r
211  int             decode_dirty_ch;\r
212  unsigned int    bSpuInit:1;\r
213  unsigned int    bSPUIsOpen:1;\r
214  unsigned int    bMemDirty:1;          // had external write to SPU RAM\r
215 \r
216  unsigned int    dwNoiseVal;           // global noise generator\r
217  unsigned int    dwNoiseCount;\r
218  unsigned int    dwNewChannel;         // flags for faster testing, if new channel starts\r
219  unsigned int    dwChannelsAudible;    // not silent channels\r
220  unsigned int    dwChannelDead;        // silent+not useful channels\r
221 \r
222  unsigned int    XARepeat;\r
223  unsigned int    XALastVal;\r
224 \r
225  int             iLeftXAVol;\r
226  int             iRightXAVol;\r
227 \r
228  unsigned int    last_keyon_cycles;\r
229 \r
230  union {\r
231   unsigned char  *spuMemC;\r
232   unsigned short *spuMem;\r
233  };\r
234  unsigned char * pSpuIrq;\r
235 \r
236  unsigned char * pSpuBuffer;\r
237  short         * pS;\r
238 \r
239  SPUCHAN       * s_chan;\r
240  REVERBInfo    * rvb;\r
241 \r
242  int           * SSumLR;\r
243 \r
244  void (CALLBACK *irqCallback)(void);   // func of main emu, called on spu irq\r
245  //void (CALLBACK *cddavCallback)(short, short);\r
246  void (CALLBACK *scheduleCallback)(unsigned int);\r
247 \r
248  const xa_decode_t * xapGlobal;\r
249  unsigned int  * XAFeed;\r
250  unsigned int  * XAPlay;\r
251  unsigned int  * XAStart;\r
252  unsigned int  * XAEnd;\r
253 \r
254  unsigned int  * CDDAFeed;\r
255  unsigned int  * CDDAPlay;\r
256  unsigned int  * CDDAStart;\r
257  unsigned int  * CDDAEnd;\r
258 \r
259  unsigned short  regArea[0x400];\r
260 \r
261  sample_buf      sb[MAXCHAN];\r
262  int             interpolation;\r
263  sample_buf      sb_thread[MAXCHAN];\r
264 } SPUInfo;\r
265 \r
266 #define regAreaGet(offset) \\r
267   spu.regArea[((offset) - 0xc00)>>1]\r
268 #define regAreaGetCh(ch, offset) \\r
269   spu.regArea[((ch<<4)|(offset))>>1]\r
270 \r
271 ///////////////////////////////////////////////////////////\r
272 // SPU.C globals\r
273 ///////////////////////////////////////////////////////////\r
274 \r
275 #ifndef _IN_SPU\r
276 \r
277 extern SPUInfo spu;\r
278 \r
279 void do_samples(unsigned int cycles_to, int do_sync);\r
280 void schedule_next_irq(void);\r
281 void check_irq_io(unsigned int addr);\r
282 \r
283 #define do_samples_if_needed(c, sync, samples) \\r
284  do { \\r
285   if (sync || (int)((c) - spu.cycles_played) >= (samples) * 768) \\r
286    do_samples(c, sync); \\r
287  } while (0)\r
288 \r
289 #endif\r
290 \r
291 #endif /* __P_SOUND_EXTERNALS_H__ */\r