1 /***************************************************************************
\r
2 externals.h - description
\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
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
16 ***************************************************************************/
\r
20 /////////////////////////////////////////////////////////
\r
22 /////////////////////////////////////////////////////////
\r
25 #define noinline __attribute__((noinline))
\r
26 #define unlikely(x) __builtin_expect((x), 0)
\r
29 #define unlikely(x) x
\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
38 #define max(a,b) (((a) > (b)) ? (a) : (b))
\r
39 #define min(a,b) (((a) < (b)) ? (a) : (b))
\r
42 ////////////////////////////////////////////////////////////////////////
\r
44 ////////////////////////////////////////////////////////////////////////
\r
49 // ~ FRAG_MSECS ms of data
\r
50 // note: must be even due to the way reverb works now
\r
51 #define FRAG_MSECS 2
\r
52 #define NSSIZE ((44100 * FRAG_MSECS / 1000 + 1) & ~1)
\r
54 ///////////////////////////////////////////////////////////
\r
56 ///////////////////////////////////////////////////////////
\r
58 // ADSR INFOS PER CHANNEL
\r
66 long SustainModeDec;
\r
69 unsigned long ReleaseVal;
\r
71 long ReleaseStartTime;
\r
79 unsigned char State:2;
\r
80 unsigned char AttackModeExp:1;
\r
81 unsigned char SustainModeExp:1;
\r
82 unsigned char SustainIncrease:1;
\r
83 unsigned char ReleaseModeExp:1;
\r
84 unsigned char AttackRate;
\r
85 unsigned char DecayRate;
\r
86 unsigned char SustainLevel;
\r
87 unsigned char SustainRate;
\r
88 unsigned char ReleaseRate;
\r
92 ///////////////////////////////////////////////////////////
\r
96 // used for debug channel muting
\r
99 // used for simple interpolation
\r
100 #define FLAG_IPOL0 2
\r
101 #define FLAG_IPOL1 4
\r
103 ///////////////////////////////////////////////////////////
\r
105 // MAIN CHANNEL STRUCT
\r
108 int iSBPos; // mixing stuff
\r
112 unsigned char * pCurr; // current pos in sound mem
\r
113 unsigned char * pLoop; // loop ptr in sound mem
\r
115 unsigned int bStop:1; // is channel stopped (sample _can_ still be playing, ADSR Release phase)
\r
116 unsigned int bReverb:1; // can we do reverb on this channel? must have ctrl register bit, to get active
\r
117 unsigned int bRVBActive:1; // reverb active flag
\r
118 unsigned int bNoise:1; // noise active flag
\r
119 unsigned int bFMod:2; // freq mod (0=off, 1=sound channel, 2=freq channel)
\r
120 unsigned int prevflags:3; // flags from previous block
\r
122 int iLeftVolume; // left volume
\r
123 int iRightVolume; // right volume
\r
125 int iRawPitch; // raw pitch (0...3fff)
\r
130 ///////////////////////////////////////////////////////////
\r
134 int StartAddr; // reverb area start addr in samples
\r
135 int CurrAddr; // reverb area curr addr in samples
\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
175 int dirty; // registers changed
\r
177 // normalized offsets
\r
178 int nIIR_DEST_A0, nIIR_DEST_A1, nIIR_DEST_B0, nIIR_DEST_B1,
\r
179 nACC_SRC_A0, nACC_SRC_A1, nACC_SRC_B0, nACC_SRC_B1,
\r
180 nIIR_SRC_A0, nIIR_SRC_A1, nIIR_SRC_B0, nIIR_SRC_B1,
\r
181 nACC_SRC_C0, nACC_SRC_C1, nACC_SRC_D0, nACC_SRC_D1,
\r
182 nMIX_DEST_A0, nMIX_DEST_A1, nMIX_DEST_B0, nMIX_DEST_B1;
\r
183 // MIX_DEST_xx - FB_SRC_x
\r
184 int nFB_SRC_A0, nFB_SRC_A1, nFB_SRC_B0, nFB_SRC_B1;
\r
187 ///////////////////////////////////////////////////////////
\r
189 ///////////////////////////////////////////////////////////
\r
193 // psx buffers / addresses
\r
195 extern unsigned short regArea[];
\r
196 extern unsigned short spuMem[];
\r
197 extern unsigned char * spuMemC;
\r
198 extern unsigned char * pSpuIrq;
\r
199 extern unsigned char * pSpuBuffer;
\r
201 #define regAreaGet(ch,offset) \
\r
202 regArea[((ch<<4)|(offset))>>1]
\r
206 extern int iVolume;
\r
207 extern int iXAPitch;
\r
208 extern int iUseReverb;
\r
209 extern int iUseInterpolation;
\r
212 extern int had_dma;
\r
213 extern int decode_pos;
\r
215 extern SPUCHAN s_chan[];
\r
216 extern REVERBInfo rvb;
\r
218 extern unsigned long dwNoiseVal;
\r
219 extern unsigned short spuCtrl;
\r
220 extern unsigned short spuStat;
\r
221 extern unsigned short spuIrq;
\r
222 extern unsigned long spuAddr;
\r
223 extern int bSpuInit;
\r
224 extern unsigned int dwNewChannel;
\r
225 extern unsigned int dwChannelOn;
\r
226 extern unsigned int dwPendingChanOff;
\r
227 extern unsigned int dwChannelDead;
\r
229 extern int SSumR[];
\r
230 extern int SSumL[];
\r
234 extern void (CALLBACK *cddavCallback)(unsigned short,unsigned short);
\r
238 ///////////////////////////////////////////////////////////
\r
240 ///////////////////////////////////////////////////////////
\r
244 extern xa_decode_t * xapGlobal;
\r
246 extern uint32_t * XAFeed;
\r
247 extern uint32_t * XAPlay;
\r
248 extern uint32_t * XAStart;
\r
249 extern uint32_t * XAEnd;
\r
251 extern uint32_t * CDDAFeed;
\r
252 extern uint32_t * CDDAPlay;
\r
253 extern uint32_t * CDDAStart;
\r
254 extern uint32_t * CDDAEnd;
\r
256 extern int iLeftXAVol;
\r
257 extern int iRightXAVol;
\r
261 ///////////////////////////////////////////////////////////
\r
262 // REVERB.C globals
\r
263 ///////////////////////////////////////////////////////////
\r
267 extern int * sRVBPlay;
\r
268 extern int * sRVBEnd;
\r
269 extern int * sRVBStart;
\r