1 /*---------------------------------------------------------------------------*
2   Project:  Revolution AX library
3   File:     AX.h
4 
5   Copyright (C)1998-2006 Nintendo  All Rights Reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: ax.h,v $
14   Revision 1.28  2006/11/14 06:31:18  aka
15   Revised comment.
16 
17   Revision 1.27  2006/11/07 12:01:57  aka
18   Added switch of Biquad IIR filter for remote outputs.
19 
20   Revision 1.26  2006/11/07 04:19:32  aka
21   Removed HPF feature.
22   Added biquad IIR feature.
23   Added LPF feature for remote outputs.
24 
25   Revision 1.25  2006/10/23 01:28:53  aka
26   Rolled-back AXInit() and AXInitEx().
27   Added AXInitSpecifyMem() and AXInitExSpecifyMem().
28 
29   Revision 1.24  2006/10/11 11:55:48  aka
30   Added AXGetMasterVolume().
31   Added AXSetMasterVolume().
32 
33   Revision 1.23  2006/10/10 04:54:55  aka
34   Removed AXSetMaxVoices().
35   Removed AXSetMemory().
36   Revised AXInit() & AXInitEx().
37 
38   Revision 1.22  2006/10/10 00:40:38  aka
39   Added AXIsInit().
40 
41   Revision 1.21  2006/10/06 06:52:50  aka
42   Added AXGetMemorySize().
43   Added AXSetMaxVoices().
44   Added AXGetMaxVoices().
45   Added AXSetMemory().
46   Added AXRegisterExceedCallback().
47 
48   Revision 1.20  2006/09/29 06:43:51  aka
49   Added aux return volume functions to 1.18.
50 
51   Revision 1.19  2006/09/25 00:59:55  aka
52   Returned to 1.16 for SDK2.2 patch4.
53   Added aux return volume functions.
54 
55   Revision 1.18  2006/09/18 04:36:38  aka
56   Changed AX_MAX_VOICES from 64 to 96.
57 
58   Revision 1.17  2006/09/14 01:38:52  aka
59   Removed voice update function.
60 
61   Revision 1.16  2006/09/05 10:19:23  aka
62   Added AXGetAuxA/B/CCallback().
63 
64   Revision 1.15  2006/08/14 02:00:38  aka
65   Removed AX_DSP_CYCLES_PBSYNC.
66 
67   Revision 1.14  2006/07/25 00:55:22  aka
68   Added a definition AX_ENABLE_REMOTE.
69 
70   Revision 1.13  2006/07/21 13:04:41  aka
71   Re-designed how to support controller speakers.
72 
73   Revision 1.12  2006/07/19 07:40:48  aka
74   Renamed AX_PB_MIXCTRL_RMT_XXX.
75 
76   Revision 1.11  2006/07/19 05:35:21  aka
77   Added AX_PB_MIXCTRL_RMT_XXX definitions for controller speakers.
78 
79   Revision 1.10  2006/07/19 05:09:34  aka
80   Added AXRmtGetLpfCoefs() and AXRmtGetHpfCoefs() for controller speakers.
81 
82   Revision 1.9  2006/07/19 04:42:13  aka
83   Added AX_RMT_SAMPLES_PER_XXX definitions.
84 
85   Revision 1.8  2006/07/10 06:40:47  aka
86   Modified to support controller speakers.
87 
88   Revision 1.7  2006/03/22 01:14:59  aka
89   Changed AX_MAX_VOICES from 32 to 64.
90 
91   Revision 1.6  2006/03/15 08:25:26  aka
92   Revised AX_DSP_CYCLES.
93 
94   Revision 1.5  2006/01/31 04:14:44  aka
95   Renamed "Project" from Dolphin to Revolution.
96 
97   Revision 1.4  2006/01/31 01:01:54  aka
98   Removed some comments.
99 
100   Revision 1.3  2006/01/30 11:50:16  aka
101   Changed copyright.
102 
103   Revision 1.2  2006/01/30 11:29:59  aka
104   Changed some comments from Japanese to English.
105 
106   Revision 1.1.1.1  2005/12/29 06:53:27  hiratsu
107   Initial import.
108 
109   Revision 1.2  2005/11/07 06:42:32  aka
110   Changed suiting to Revolution's audio spec.
111 
112   Revision 1.1.1.1  2005/05/12 02:41:06  yasuh-to
113   Imported from dolphin tree.
114 
115     25    03/07/22 9:28a Akagi
116     Changed return of AXRegisterCallback from void to AXUserCallback.
117 
118     24    03/06/11 2:58p Akagi
119     Added AXGetLpfCoefs.
120 
121     23    03/04/15 19:53 Suzuki
122     added the definition of AX_OUTPUT_BUFFER_DOUBLE and
123     AX_OUTPUT_BUFFER_TRIPLE.
124 
125     22    03/04/15 13:44 Suzuki
126     add AXInitEx.
127 
128     21    03/04/04 13:26 Suzuki
129     add the definition of DSPADPCM
130 
131     20    8/15/02 11:02a Billyjack
132     added low pass filter
133 
134     19    02/08/12 5:55p Akagi
135     Added log field.
136 
137   $NoKeywords: $
138  *---------------------------------------------------------------------------*/
139 
140 #ifndef __AX_H__
141 #define __AX_H__
142 
143 #ifdef __cplusplus
144 extern "C" {
145 #endif
146 
147 /*--------------------------------------------------------------------------*
148  *--------------------------------------------------------------------------*/
149 #define AX_ENABLE_REMOTE
150 
151 /*--------------------------------------------------------------------------*
152     profiling
153  *--------------------------------------------------------------------------*/
154 typedef struct _AXPROFILE
155 {
156 
157     OSTime  axFrameStart;
158     OSTime  auxProcessingStart;
159     OSTime  auxProcessingEnd;
160     OSTime  userCallbackStart;
161     OSTime  userCallbackEnd;
162     OSTime  axFrameEnd;
163     u32     axNumVoices;
164     u32     __padding;
165 
166 } AXPROFILE;
167 
168 /*--------------------------------------------------------------------------*
169     mixing
170  *--------------------------------------------------------------------------*/
171 typedef struct _AXPBMIX
172 {
173     //  mixing values in .15, 0x8000 = ca. 1.0
174 
175     u16     vL;
176     u16     vDeltaL;
177     u16     vR;
178     u16     vDeltaR;
179 
180     u16     vAuxAL;
181     u16     vDeltaAuxAL;
182     u16     vAuxAR;
183     u16     vDeltaAuxAR;
184 
185     u16     vAuxBL;
186     u16     vDeltaAuxBL;
187     u16     vAuxBR;
188     u16     vDeltaAuxBR;
189 
190     u16     vAuxCL;
191     u16     vDeltaAuxCL;
192     u16     vAuxCR;
193     u16     vDeltaAuxCR;
194 
195     u16     vS;
196     u16     vDeltaS;
197     u16     vAuxAS;
198     u16     vDeltaAuxAS;
199     u16     vAuxBS;
200     u16     vDeltaAuxBS;
201     u16     vAuxCS;
202     u16     vDeltaAuxCS;
203 
204 } AXPBMIX;
205 
206 #define AXPBMIX_VL_OFF            AXPBMIX_OFF
207 #define AXPBMIX_VDELTAL_OFF       (AXPBMIX_OFF+1)
208 #define AXPBMIX_VR_OFF            (AXPBMIX_OFF+2)
209 #define AXPBMIX_VDELTAR_OFF       (AXPBMIX_OFF+3)
210 
211 #define AXPBMIX_VAUXAL_OFF        (AXPBMIX_OFF+4)
212 #define AXPBMIX_VDELTAAUXAL_OFF   (AXPBMIX_OFF+5)
213 #define AXPBMIX_VAUXAR_OFF        (AXPBMIX_OFF+6)
214 #define AXPBMIX_VDELTAAUXAR_OFF   (AXPBMIX_OFF+7)
215 
216 #define AXPBMIX_VAUXBL_OFF        (AXPBMIX_OFF+8)
217 #define AXPBMIX_VDELTAAUXBL_OFF   (AXPBMIX_OFF+9)
218 #define AXPBMIX_VAUXBR_OFF        (AXPBMIX_OFF+10)
219 #define AXPBMIX_VDELTAAUXBR_OFF   (AXPBMIX_OFF+11)
220 
221 #define AXPBMIX_VAUXCL_OFF        (AXPBMIX_OFF+12)
222 #define AXPBMIX_VDELTAAUXCL_OFF   (AXPBMIX_OFF+13)
223 #define AXPBMIX_VAUXCR_OFF        (AXPBMIX_OFF+14)
224 #define AXPBMIX_VDELTAAUXCR_OFF   (AXPBMIX_OFF+15)
225 
226 #define AXPBMIX_VS_OFF            (AXPBMIX_OFF+16)
227 #define AXPBMIX_VDELTAS_OFF       (AXPBMIX_OFF+17)
228 #define AXPBMIX_VAUXAS_OFF        (AXPBMIX_OFF+18)
229 #define AXPBMIX_VDELTAAUXAS_OFF   (AXPBMIX_OFF+19)
230 #define AXPBMIX_VAUXBS_OFF        (AXPBMIX_OFF+20)
231 #define AXPBMIX_VDELTAAUXBS_OFF   (AXPBMIX_OFF+21)
232 #define AXPBMIX_VAUXCS_OFF        (AXPBMIX_OFF+22)
233 #define AXPBMIX_VDELTAAUXCS_OFF   (AXPBMIX_OFF+23)
234 
235 #define AXPBMIX_SIZE              24
236 
237 /*--------------------------------------------------------------------------*
238     mixing for remote speaker
239  *--------------------------------------------------------------------------*/
240 typedef struct _AXPBRMTMIX
241 {
242 
243     u16     vMain0;
244     u16     vDeltaMain0;
245     u16     vAux0;
246     u16     vDeltaAux0;
247 
248     u16     vMain1;
249     u16     vDeltaMain1;
250     u16     vAux1;
251     u16     vDeltaAux1;
252 
253     u16     vMain2;
254     u16     vDeltaMain2;
255     u16     vAux2;
256     u16     vDeltaAux2;
257 
258     u16     vMain3;
259     u16     vDeltaMain3;
260     u16     vAux3;
261     u16     vDeltaAux3;
262 
263 } AXPBRMTMIX;
264 
265 #define AXPBRMTMIX_SIZE           16
266 
267 /*--------------------------------------------------------------------------*
268     initial time delay
269  *--------------------------------------------------------------------------*/
270 typedef struct _AXPBITD
271 {
272 
273     u16     flag;               //  on or off for this voice
274     u16     bufferHi;           //  MRAM buffer
275     u16     bufferLo;           //
276     u16     shiftL;             //  phase shift samples left (current)
277     u16     shiftR;             //  phase shift samples right (current)
278     u16     targetShiftL;       //  phase shift samples left (target)
279     u16     targetShiftR;       //  phase shift samples right (target)
280 
281 } AXPBITD;
282 
283 //  flag
284 #define AX_PB_ITD_OFF      0x0000
285 #define AX_PB_ITD_ON       0x0001
286 
287 #define AXPBITD_FLAG_OFF          AXPBITD_OFF
288 #define AXPBITD_BUFFERHI_OFF      (AXPBITD_OFF+1)
289 #define AXPBITD_BUFFERLO_OFF      (AXPBITD_OFF+2)
290 #define AXPBITD_SHIFTL_OFF        (AXPBITD_OFF+3)
291 #define AXPBITD_SHIFTR_OFF        (AXPBITD_OFF+4)
292 #define AXPBITD_TARGETSHIFTL_OFF  (AXPBITD_OFF+5)
293 #define AXPBITD_TARGETSHIFTR_OFF  (AXPBITD_OFF+6)
294 #define AXPBITD_SIZE              7
295 
296 /*--------------------------------------------------------------------------*
297     depop data (last amplitudes mixed into buffers)
298  *--------------------------------------------------------------------------*/
299 typedef struct _AXPBDPOP
300 {
301 
302     s16     aL;
303     s16     aAuxAL;
304     s16     aAuxBL;
305     s16     aAuxCL;
306 
307     s16     aR;
308     s16     aAuxAR;
309     s16     aAuxBR;
310     s16     aAuxCR;
311 
312     s16     aS;
313     s16     aAuxAS;
314     s16     aAuxBS;
315     s16     aAuxCS;
316 
317 } AXPBDPOP;
318 
319 #define AXPBDPOP_AL_OFF       AXPBDPOP_OFF
320 #define AXPBDPOP_AAUXAL_OFF   (AXPBDPOP_OFF+1)
321 #define AXPBDPOP_AAUXBL_OFF   (AXPBDPOP_OFF+2)
322 #define AXPBDPOP_AAUXCL_OFF   (AXPBDPOP_OFF+3)
323 
324 #define AXPBDPOP_AR_OFF       (AXPBDPOP_OFF+4)
325 #define AXPBDPOP_AAUXAR_OFF   (AXPBDPOP_OFF+5)
326 #define AXPBDPOP_AAUXBR_OFF   (AXPBDPOP_OFF+6)
327 #define AXPBDPOP_AAUXCR_OFF   (AXPBDPOP_OFF+7)
328 
329 #define AXPBDPOP_AS_OFF       (AXPBDPOP_OFF+8)
330 #define AXPBDPOP_AAUXAS_OFF   (AXPBDPOP_OFF+9)
331 #define AXPBDPOP_AAUXBS_OFF   (AXPBDPOP_OFF+10)
332 #define AXPBDPOP_AAUXCS_OFF   (AXPBDPOP_OFF+11)
333 
334 #define AXPBDPOP_SIZE         12
335 
336 /*--------------------------------------------------------------------------*
337     depop data for remote speakers
338  *--------------------------------------------------------------------------*/
339 typedef struct _AXPBRMTDPOP
340 {
341 
342     s16     aMain0;
343     s16     aMain1;
344     s16     aMain2;
345     s16     aMain3;
346 
347     s16     aAux0;
348     s16     aAux1;
349     s16     aAux2;
350     s16     aAux3;
351 
352 } AXPBRMTDPOP;
353 
354 #define AXPBDRMTPOP_SIZE      8
355 
356 /*--------------------------------------------------------------------------*
357     volume envelope
358  *--------------------------------------------------------------------------*/
359 typedef struct _AXPBVE
360 {
361 
362     u16     currentVolume;              // .15 volume at start of frame
363     s16     currentDelta;               // signed per sample delta delta
364 
365 } AXPBVE;
366 
367 #define AXPBVE_CURRENTVOLUME_OFF  AXPBVE_OFF
368 #define AXPBVE_CURRENTDELTA_OFF   (AXPBVE_OFF+1)
369 #define AXPBVE_SIZE               2
370 
371 /*--------------------------------------------------------------------------*
372     buffer addressing
373  *--------------------------------------------------------------------------*/
374 typedef struct _AXPBADDR
375 {                                       // all values are mesured in samples:
376 
377     u16     loopFlag;                   // 0 = one-shot, 1=looping
378     u16     format;                     // sample format used (see below)
379     u16     loopAddressHi;              // Start of loop (this will point to a shared "zero" buffer if one-shot mode is active)
380     u16     loopAddressLo;
381     u16     endAddressHi;               // End of sample (and loop)
382     u16     endAddressLo;
383     u16     currentAddressHi;           // Current playback position
384     u16     currentAddressLo;
385 
386 } AXPBADDR;
387 
388 #define AXPBADDR_LOOP_OFF     0           // States for loopFlag field
389 #define AXPBADDR_LOOP_ON      1
390 
391 #define AXPBADDR_LOOPFLAG_OFF         AXPBADDR_OFF
392 #define AXPBADDR_FORMAT_OFF           (AXPBADDR_OFF+1)
393 #define AXPBADDR_LOOPADDRESSHI_OFF    (AXPBADDR_OFF+2)
394 #define AXPBADDR_LOOPADDRESSLO_OFF    (AXPBADDR_OFF+3)
395 #define AXPBADDR_ENDADDRESSHI_OFF     (AXPBADDR_OFF+4)
396 #define AXPBADDR_ENDADDRESSLO_OFF     (AXPBADDR_OFF+5)
397 #define AXPBADDR_CURRENTADDRESSHI_OFF (AXPBADDR_OFF+6)
398 #define AXPBADDR_CURRENTADDRESSLO_OFF (AXPBADDR_OFF+7)
399 #define AXPBADDR_SIZE                 8
400 
401 /*--------------------------------------------------------------------------*
402     ADPCM decoder state
403  *--------------------------------------------------------------------------*/
404 typedef struct _AXPBADPCM
405 {
406 
407     u16     a[8][2];            //  coef table a1[0],a2[0],a1[1],a2[1]....
408 
409     u16     gain;               //  gain to be applied (0 for ADPCM, 0x0800 for PCM8/16)
410 
411     u16     pred_scale;         //  predictor / scale combination (nibbles, as in hardware)
412     u16     yn1;                //  y[n - 1]
413     u16     yn2;                //  y[n - 2]
414 
415 } AXPBADPCM;
416 
417 #define AXPBADPCM_A1                  AXPBADPCM_OFF
418 #define AXPBADPCM_A2                  (AXPBADPCM_OFF+8)
419 #define AXPBADPCM_GAIN                (AXPBADPCM_OFF+16
420 #define AXPBADPCM_PRED_SCALE          (AXPBADPCM_OFF+17)
421 #define AXPBADPCM_YN1                 (AXPBADPCM_OFF+18)
422 #define AXPBADPCM_YN2                 (AXPBADPCM_OFF+19)
423 #define AXPBADPCM_SIZE                20
424 
425 /*--------------------------------------------------------------------------*
426     sample rate converter state
427  *--------------------------------------------------------------------------*/
428 typedef struct _AXPBSRC
429 {
430 
431     u16     ratioHi;            //  sampling ratio, integer
432     u16     ratioLo;            //  sampling ratio, fraction
433 
434     u16     currentAddressFrac; //  current fractional sample position
435 
436     u16     last_samples[4];    //  last 4 input samples
437 
438 } AXPBSRC;
439 
440 #define AXPBSRC_RATIOHI_OFF               AXPBSRC_OFF
441 #define AXPBSRC_RATIOLO_OFF               (AXPBSRC_OFF+1)
442 #define AXPBSRC_CURRENTADDRESSFRAC_OFF    (AXPBSRC_OFF+2)
443 #define AXPBSRC_LAST_SAMPLES_OFF          (AXPBSRC_OFF+3)       // 4 words
444 #define AXPBSRC_SIZE                      7
445 
446 /*--------------------------------------------------------------------------*
447     sample rate converter state for remote speakers
448  *--------------------------------------------------------------------------*/
449 typedef struct _AXPBRMTSRC
450 {
451 
452     u16     currentAddressFrac; //  current fractional sample position
453 
454     u16     last_samples[4];    //  last 4 input samples
455 
456 } AXPBRMTSRC;
457 
458 #define AXPBRMTSRC_SIZE                   5
459 
460 /*--------------------------------------------------------------------------*
461     ADPCM loop parameters
462  *--------------------------------------------------------------------------*/
463 typedef struct _AXPBADPCMLOOP
464 {
465 
466     u16     loop_pred_scale;    //  predictor / scale combination (nibbles, as in hardware)
467     u16     loop_yn1;           //  y[n - 1]
468     u16     loop_yn2;           //  y[n - 2]
469 
470 } AXPBADPCMLOOP;
471 
472 #define AXPBADPCMLOOP_PRED_SCALE      AXPBADPCMLOOP_OFF
473 #define AXPBADPCMLOOP_YN1             (AXPBADPCMLOOP_OFF+1)
474 #define AXPBADPCMLOOP_YN2             (AXPBADPCMLOOP_OFF+2)
475 #define AXPBADPCMLOOP_SIZE            3
476 
477 /*--------------------------------------------------------------------------*
478     IIR filter parameters (lowpass)
479  *--------------------------------------------------------------------------*/
480 typedef struct _AXPBLPF
481 {
482 
483     u16     on;
484     u16     yn1;
485     u16     a0;
486     u16     b0;
487 
488 } AXPBLPF;
489 
490 #define AXPBLPF_ON                    AXPBLPF_OFF
491 #define AXPBLPF_YN1                   (AXPBLPF_OFF+1)
492 #define AXPBLPF_A0                    (AXPBLPF_OFF+2)
493 #define AXPBLPF_B0                    (AXPBLPF_OFF+3)
494 #define AXPBLPF_SIZE                  4
495 
496 /*--------------------------------------------------------------------------*
497     Biquad IIR filter parameters
498  *--------------------------------------------------------------------------*/
499 typedef struct _AXPBBIQUAD
500 {
501 
502     u16     on;
503     u16     xn1;
504     u16     xn2;
505     u16     yn1;
506     u16     yn2;
507     u16     b0;
508     u16     b1;
509     u16     b2;
510     u16     a1;
511     u16     a2;
512 
513 } AXPBBIQUAD;
514 
515 #define AXPBBIQUAD_ON                 AXPBBIQUAD_OFF
516 #define AXPBBIQUAD_XN1                (AXPBBIQUAD_OFF+1)
517 #define AXPBBIQUAD_XN2                (AXPBBIQUAD_OFF+2)
518 #define AXPBBIQUAD_YN1                (AXPBBIQUAD_OFF+3)
519 #define AXPBBIQUAD_YN2                (AXPBBIQUAD_OFF+4)
520 #define AXPBBIQUAD_B0                 (AXPBBIQUAD_OFF+5)
521 #define AXPBBIQUAD_B1                 (AXPBBIQUAD_OFF+6)
522 #define AXPBBIQUAD_B2                 (AXPBBIQUAD_OFF+7)
523 #define AXPBBIQUAD_A1                 (AXPBBIQUAD_OFF+8)
524 #define AXPBBIQUAD_A2                 (AXPBBIQUAD_OFF+9)
525 #define AXPBBIQUAD_SIZE               10
526 
527 /*--------------------------------------------------------------------------*
528     IIR filter for remote speakers
529  *--------------------------------------------------------------------------*/
530 typedef union __AXPBRMTIIR
531 {
532     AXPBLPF    lpf;
533     AXPBBIQUAD biquad;
534 
535 } AXPBRMTIIR;
536 
537 #define AXPBRMTIIR_SIZE               10
538 
539 /*--------------------------------------------------------------------------*
540     voice parameter block
541  *--------------------------------------------------------------------------*/
542 typedef struct _AXPB
543 {
544 
545     u16             nextHi;     // pointer to next parameter buffer (MRAM)
546     u16             nextLo;
547 
548     u16             currHi;     // pointer to this parameter buffer (MRAM)
549     u16             currLo;
550 
551     u16             srcSelect;  // Select type of SRC (none,4-tap,linear)
552     u16             coefSelect; // Coef. to be used with 4-tap SRC
553     u32             mixerCtrl;  // Mixer control bits
554 
555     u16             state;      // current state (see below)
556     u16             type;       // type of voice (stream)
557 
558     AXPBMIX         mix;
559     AXPBITD         itd;
560     AXPBDPOP        dpop;
561     AXPBVE          ve;
562     AXPBADDR        addr;
563     AXPBADPCM       adpcm;
564     AXPBSRC         src;
565     AXPBADPCMLOOP   adpcmLoop;
566     AXPBLPF         lpf;
567     AXPBBIQUAD      biquad;
568 
569     u16             remote;
570 
571     u16             rmtMixerCtrl; // Mixer control bits
572 
573     AXPBRMTMIX      rmtMix;
574     AXPBRMTDPOP     rmtDpop;
575     AXPBRMTSRC      rmtSrc;
576     AXPBRMTIIR      rmtIIR;
577 
578     u16             pad[12];     // 32 byte alignment
579 
580 } AXPB;
581 
582 //  state
583 #define AX_PB_STATE_STOP        0x0000
584 #define AX_PB_STATE_RUN         0x0001
585 
586 //  type
587 #define AX_PB_TYPE_NORMAL       0x0000
588 #define AX_PB_TYPE_STREAM       0x0001  // no loop context programming for ADPCM
589 
590 //  format
591 #define AX_PB_FORMAT_PCM16      0x000A  // signed 16 bit PCM mono
592 #define AX_PB_FORMAT_PCM8       0x0019  // signed 8 bit PCM mono
593 #define AX_PB_FORMAT_ADPCM      0x0000  // ADPCM encoded (both standard & extended)
594 
595 //  src select
596 #define AX_PB_SRCSEL_POLYPHASE  0x0000  // N64 type polyphase filter (4-tap)
597 #define AX_PB_SRCSEL_LINEAR     0x0001  // Linear interpolator
598 #define AX_PB_SRCSEL_NONE       0x0002  // No SRC (1:1)
599 
600 //  coef select
601 #define AX_PB_COEFSEL_8KHZ      0x0000  // 8KHz low pass response
602 #define AX_PB_COEFSEL_12KHZ     0x0001  // 12.8KHz N64 type response
603 #define AX_PB_COEFSEL_16KHZ     0x0002  // 16KHz response
604 
605 //  mixer ctrl for main speakers
606 #define AX_PB_MIXCTRL_L         0x00000001  // main left mix
607 #define AX_PB_MIXCTRL_R         0x00000002  // main right mix
608 #define AX_PB_MIXCTRL_LR_RAMP   0x00000004  // main bus ramp (applies to LR only)
609 #define AX_PB_MIXCTRL_S         0x00000008  // main surround mix
610 #define AX_PB_MIXCTRL_S_RAMP    0x00000010  // main bus ramp (applies to S only)
611 
612 #define AX_PB_MIXCTRL_A_L       0x00010000  // AuxA left mix
613 #define AX_PB_MIXCTRL_A_R       0x00020000  // AuxA rigth mix
614 #define AX_PB_MIXCTRL_A_LR_RAMP 0x00040000  // AuxA bus ramp (applies to LR only)
615 #define AX_PB_MIXCTRL_A_S       0x00080000  // AuxA surround mix
616 #define AX_PB_MIXCTRL_A_S_RAMP  0x00100000  // AuxA bus ramp (applies to S only)
617 
618 #define AX_PB_MIXCTRL_B_L       0x00200000  // AuxB left mix
619 #define AX_PB_MIXCTRL_B_R       0x00400000  // AuxB rigth mix
620 #define AX_PB_MIXCTRL_B_LR_RAMP 0x00800000  // AuxB bus ramp (applies to LR only)
621 #define AX_PB_MIXCTRL_B_S       0x01000000  // AuxB surround mix
622 #define AX_PB_MIXCTRL_B_S_RAMP  0x02000000  // AuxB bus ramp (applies to S only)
623 
624 #define AX_PB_MIXCTRL_C_L       0x04000000  // AuxCleft mix
625 #define AX_PB_MIXCTRL_C_R       0x08000000  // AuxC rigth mix
626 #define AX_PB_MIXCTRL_C_LR_RAMP 0x10000000  // AuxC bus ramp (applies to LR only)
627 #define AX_PB_MIXCTRL_C_S       0x20000000  // AuxC surround mix
628 #define AX_PB_MIXCTRL_C_S_RAMP  0x40000000  // AuxC bus ramp (applies to S only)
629 #define AX_PB_MIXCTRL_C_DPL2    0x80000000  // AuxC DPL2, does not apply ITD for surrounds
630 
631 //  IIR filter switch
632 #define AX_PB_LPF_OFF           0x0000  // LPF switch
633 #define AX_PB_LPF_ON            0x0001
634 
635 #define AX_PB_BIQUAD_OFF        0x0000  // Biquad IIR filter switch
636 #define AX_PB_BIQUAD_ON         0x0002
637 
638 // output
639 #define AX_PB_REMOTE_OFF        0x0000
640 #define AX_PB_REMOTE_ON         0x0001
641 
642 //  mixer ctrl for remote speakers
643 #define AX_PB_MIXCTRL_MAIN0       0x0001  // main0 mix
644 #define AX_PB_MIXCTRL_MAIN0_RAMP  0x0002  // main0 mix with ramp
645 #define AX_PB_MIXCTRL_AUX0        0x0004  // aux0
646 #define AX_PB_MIXCTRL_AUX0_RAMP   0x0008  // aux0  mix with ramp
647 #define AX_PB_MIXCTRL_MAIN1       0x0010  // main1
648 #define AX_PB_MIXCTRL_MAIN1_RAMP  0x0020  // main1 mix with ramp
649 #define AX_PB_MIXCTRL_AUX1        0x0040  // aux1
650 #define AX_PB_MIXCTRL_AUX1_RAMP   0x0080  // aux1  mix with ramp
651 #define AX_PB_MIXCTRL_MAIN2       0x0100  // main2
652 #define AX_PB_MIXCTRL_MAIN2_RAMP  0x0200  // main2 mix with ramp
653 #define AX_PB_MIXCTRL_AUX2        0x0400  // aux2
654 #define AX_PB_MIXCTRL_AUX2_RAMP   0x0800  // aux2  mix with ramp
655 #define AX_PB_MIXCTRL_MAIN3       0x1000  // main3
656 #define AX_PB_MIXCTRL_MAIN3_RAMP  0x2000  // main3 mix with ramp
657 #define AX_PB_MIXCTRL_AUX3        0x4000  // aux3
658 #define AX_PB_MIXCTRL_AUX3_RAMP   0x8000  // aux3  mix with ramp
659 
660 #define AX_PB_NEXTHI_OFF        0
661 #define AX_PB_NEXTLO_OFF        1
662 #define AX_PB_CURRHI_OFF        2
663 #define AX_PB_CURRLO_OFF        3
664 #define AX_PB_SRCSELECT_OFF     4
665 #define AX_PB_COEFSELECT_OFF    5
666 #define AX_PB_MIXERCTRL_OFF     6
667 #define AX_PB_STATE_OFF         8
668 #define AX_PB_TYPE_OFF          9
669 #define AXPBMIX_OFF             10
670 
671 #define AXPBITD_OFF             (AXPBMIX_OFF       + AXPBMIX_SIZE)
672 #define AXPBDPOP_OFF            (AXPBITD_OFF       + AXPBITD_SIZE)
673 #define AXPBVE_OFF              (AXPBDPOP_OFF      + AXPBDPOP_SIZE)
674 #define AXPBADDR_OFF            (AXPBVE_OFF        + AXPBVE_SIZE)
675 #define AXPBADPCM_OFF           (AXPBADDR_OFF      + AXPBADDR_SIZE)
676 #define AXPBSRC_OFF             (AXPBADPCM_OFF     + AXPBADPCM_SIZE)
677 #define AXPBADPCMLOOP_OFF       (AXPBSRC_OFF       + AXPBSRC_SIZE)
678 #define AXPBLPF_OFF             (AXPBADPCMLOOP_OFF + AXPBADPCMLOOP_SIZE)
679 #define AXPBBIQUAD_OFF          (AXPBLPF_OFF       + AXPBLPF_SIZE)
680 
681 #define AXPBREMOTE_OFF          (AXPBBIQUAD_OFF    + AXPBBIQUAD_SIZE)
682 #define AXPBRMTMIXCTRL_OFF      (AXPBREMOTE_OFF    + 1)
683 #define AXPBRMTMIX_OFF          (AXPBRMTMIXCTRL_OFF+ 1)
684 #define AXPBRMTDPOP_OFF         (AXPBRMTMIX_OFF    + AXPBRMTMIX_SIZE)
685 #define AXPBRMTSRC_OFF          (AXPBRMTDPOP_OFF   + AXPBRMTDPOP_SIZE)
686 #define AXPBRMTIIR_OFF          (AXPBRMTSRC_OFF    + AXPBRMTSRC_SIZE)
687 
688 #define AX_PB_SIZE              (AXPBRMTIIR_OFF    +  AXPBRMTIIR_SIZE)
689 
690 /*--------------------------------------------------------------------------*
691     studio parameter block
692  *--------------------------------------------------------------------------*/
693 
694 typedef struct _AXSPB
695 {
696     u16 dpopLHi;
697     u16 dpopLLo;
698     s16 dpopLDelta;
699     u16 dpopRHi;
700     u16 dpopRLo;
701     s16 dpopRDelta;
702     u16 dpopSHi;
703     u16 dpopSLo;
704     s16 dpopSDelta;
705 
706     u16 dpopALHi;
707     u16 dpopALLo;
708     s16 dpopALDelta;
709     u16 dpopARHi;
710     u16 dpopARLo;
711     s16 dpopARDelta;
712     u16 dpopASHi;
713     u16 dpopASLo;
714     s16 dpopASDelta;
715 
716     u16 dpopBLHi;
717     u16 dpopBLLo;
718     s16 dpopBLDelta;
719     u16 dpopBRHi;
720     u16 dpopBRLo;
721     s16 dpopBRDelta;
722     u16 dpopBSHi;
723     u16 dpopBSLo;
724     s16 dpopBSDelta;
725 
726     u16 dpopCLHi;
727     u16 dpopCLLo;
728     s16 dpopCLDelta;
729     u16 dpopCRHi;
730     u16 dpopCRLo;
731     s16 dpopCRDelta;
732     u16 dpopCSHi;
733     u16 dpopCSLo;
734     s16 dpopCSDelta;
735 
736     u16 dpopMain0Hi;
737     u16 dpopMain0Lo;
738     s16 dpopMain0Delta;
739     u16 dpopAux0Hi;
740     u16 dpopAux0Lo;
741     s16 dpopAux0Delta;
742 
743     u16 dpopMain1Hi;
744     u16 dpopMain1Lo;
745     s16 dpopMain1Delta;
746     u16 dpopAux1Hi;
747     u16 dpopAux1Lo;
748     s16 dpopAux1Delta;
749 
750     u16 dpopMain2Hi;
751     u16 dpopMain2Lo;
752     s16 dpopMain2Delta;
753     u16 dpopAux2Hi;
754     u16 dpopAux2Lo;
755     s16 dpopAux2Delta;
756 
757     u16 dpopMain3Hi;
758     u16 dpopMain3Lo;
759     s16 dpopMain3Delta;
760     u16 dpopAux3Hi;
761     u16 dpopAux3Lo;
762     s16 dpopAux3Delta;
763 
764 } AXSPB;
765 
766 /*---------------------------------------------------------------------------*
767  *---------------------------------------------------------------------------*/
768 #define AX_DSP_CYCLES               (OS_BUS_CLOCK / 667)
769 
770 /*---------------------------------------------------------------------------*
771  *---------------------------------------------------------------------------*/
772 #define AX_MAX_VOICES               96
773 
774 #define AX_MS_PER_FRAME             3
775 
776 #define AX_IN_SAMPLES_PER_MS        32
777 #define AX_IN_SAMPLES_PER_SEC       (AX_IN_SAMPLES_PER_MS * 1000)
778 #define AX_IN_SAMPLES_PER_FRAME     (AX_IN_SAMPLES_PER_MS * AX_MS_PER_FRAME)
779 
780 /*---------------------------------------------------------------------------*
781  *---------------------------------------------------------------------------*/
782 #define AX_RMT_SAMPLES_PER_MS       6
783 #define AX_RMT_SAMPLES_PER_SEC      (AX_RMT_SAMPLES_PER_MS * 1000)
784 #define AX_RMT_SAMPLES_PER_FRAME    (AX_RMT_SAMPLES_PER_MS * AX_MS_PER_FRAME)
785 
786 /*---------------------------------------------------------------------------*
787  *---------------------------------------------------------------------------*/
788 #define AX_MODE_STEREO              0
789 #define AX_MODE_SURROUND            1
790 #define AX_MODE_DPL2                2
791 
792 /*---------------------------------------------------------------------------*
793  *---------------------------------------------------------------------------*/
794 #define AX_COMPRESSOR_OFF           0
795 #define AX_COMPRESSOR_ON            1
796 
797 /*---------------------------------------------------------------------------*
798  *---------------------------------------------------------------------------*/
799 #define AX_PRIORITY_STACKS          32
800 #define AX_PRIORITY_NODROP          (AX_PRIORITY_STACKS - 1)
801 #define AX_PRIORITY_LOWEST          1
802 #define AX_PRIORITY_FREE            0
803 
804 /*---------------------------------------------------------------------------*
805  *---------------------------------------------------------------------------*/
806 #define AX_SRC_TYPE_NONE            0
807 #define AX_SRC_TYPE_LINEAR          1
808 #define AX_SRC_TYPE_4TAP_8K         2
809 #define AX_SRC_TYPE_4TAP_12K        3
810 #define AX_SRC_TYPE_4TAP_16K        4
811 
812 /*---------------------------------------------------------------------------*
813  *---------------------------------------------------------------------------*/
814 #define AX_ADDR_ONESHOT             0
815 #define AX_ADDR_LOOP                1
816 
817 /*---------------------------------------------------------------------------*
818  *---------------------------------------------------------------------------*/
819 #define AX_SYNC_NONEWPARAMS         0x00000000
820 #define AX_SYNC_USER_SRCSELECT      0x00000001
821 #define AX_SYNC_USER_MIXCTRL        0x00000002
822 #define AX_SYNC_USER_STATE          0x00000004
823 #define AX_SYNC_USER_TYPE           0x00000008
824 #define AX_SYNC_USER_MIX            0x00000010
825 #define AX_SYNC_USER_ITD            0x00000020
826 #define AX_SYNC_USER_ITDTARGET      0x00000040
827 #define AX_SYNC_USER_DPOP           0x00000080
828 #define AX_SYNC_USER_VE             0x00000100
829 #define AX_SYNC_USER_VEDELTA        0x00000200
830 #define AX_SYNC_USER_ADDR           0x00000400
831 #define AX_SYNC_USER_LOOP           0x00000800
832 #define AX_SYNC_USER_LOOPADDR       0x00001000
833 #define AX_SYNC_USER_ENDADDR        0x00002000
834 #define AX_SYNC_USER_CURRADDR       0x00004000
835 #define AX_SYNC_USER_ADPCM          0x00008000
836 #define AX_SYNC_USER_SRC            0x00010000
837 #define AX_SYNC_USER_SRCRATIO       0x00020000
838 #define AX_SYNC_USER_ADPCMLOOP      0x00040000
839 #define AX_SYNC_USER_LPF            0x00080000
840 #define AX_SYNC_USER_LPF_COEF       0x00100000
841 #define AX_SYNC_USER_BIQUAD         0x00200000
842 #define AX_SYNC_USER_BIQUAD_COEF    0x00400000
843 #define AX_SYNC_USER_REMOTE         0x00800000
844 #define AX_SYNC_USER_RMTMIXCTRL     0x01000000
845 #define AX_SYNC_USER_RMTMIX         0x02000000
846 #define AX_SYNC_USER_RMTDPOP        0x04000000
847 #define AX_SYNC_USER_RMTSRC         0x08000000
848 #define AX_SYNC_USER_RMTIIR         0x10000000
849 #define AX_SYNC_USER_RMTIIR_COEF1   0x20000000
850 #define AX_SYNC_USER_RMTIIR_COEF2   0x40000000
851 
852 #define AX_SYNC_USER_ALLPARAMS      0x80000000
853 
854 /*---------------------------------------------------------------------------*
855  *---------------------------------------------------------------------------*/
856 #define AX_OUTPUT_BUFFER_DOUBLE     0
857 #define AX_OUTPUT_BUFFER_TRIPLE     1
858 
859 /*---------------------------------------------------------------------------*
860     callback interface
861  *---------------------------------------------------------------------------*/
862 typedef void    (*AXUserCallback)   (void);
863 typedef void    (*AXAuxCallback)    (void *data, void *context);
864 typedef void    (*AXVoiceCallback)  (void *p);
865 typedef void    (*AXExceedCallback) (u32 cycles);
866 
867 /*---------------------------------------------------------------------------*
868  *---------------------------------------------------------------------------*/
869 typedef struct _AXVPB
870 {
871     void            *next;          // used in priority stacks
872     void            *prev;          // used in priority stacks
873     void            *next1;         // used in callback stack
874 
875     // these ares are used in voice allocation
876     u32             priority;       // index to stack
877     AXVoiceCallback callback;       // user callback for specified
878     u32             userContext;    // user assigned context for callback
879 
880     // vars & flags for updating and sync PBs
881     u32             index;          // index of VPB in array
882     u32             sync;           // bit mask for each PB item to sync
883     u32             depop;          // should depop voice
884     void            *itdBuffer;     // pointer to itd buffer
885     AXPB            pb;             // write params to this PB
886 
887 } AXVPB;
888 
889 typedef struct _AXPBITDBUFFER
890 {
891 
892     s16 data[32];
893 
894 } AXPBITDBUFFER;
895 
896 /*---------------------------------------------------------------------------*
897 Header for DSPADPCM.exe header
898  *---------------------------------------------------------------------------*/
899 typedef struct
900 {
901     u32 num_samples;       // total number of RAW samples
902     u32 num_adpcm_nibbles; // number of ADPCM nibbles (including frame headers)
903     u32 sample_rate;       // Sample rate, in Hz
904     u16 loop_flag;         // 1=LOOPED, 0=NOT LOOPED
905     u16 format;            // Always 0x0000, for ADPCM
906     u32 sa;                // Start offset address for looped samples (zero for non-looped)
907     u32 ea;                // End offset address for looped samples
908     u32 ca;                // always zero
909     u16 coef[16];          // decode coefficients (eight pairs of 16-bit words)
910     u16 gain;              // always zero for ADPCM
911     u16 ps;                // predictor/scale
912     u16 yn1;               // sample history
913     u16 yn2;               // sample history
914     u16 lps;               // predictor/scale for loop context
915     u16 lyn1;              // sample history (n-1) for loop context
916     u16 lyn2;              // sample history (n-2) for loop context
917     u16 pad[11];           // reserved
918 
919 } DSPADPCM;
920 
921 /*---------------------------------------------------------------------------*
922  *---------------------------------------------------------------------------*/
923 void    AXInit                      (void);
924 void    AXInitEx                    (u32 outputBufferMode);
925 void    AXInitSpecifyMem            (u32 num, void* mem);
926 void    AXInitExSpecifyMem          (u32 num, void* mem, u32 outputBufferMode);
927 BOOL    AXIsInit                    (void);
928 void    AXQuit                      (void);
929 
930 #define AXGetMemorySize(num)        ((sizeof(AXPB) + sizeof(AXPBITDBUFFER) + sizeof(AXVPB)) * num)
931 
932 u32     AXGetMaxVoices              (void);
933 
934 AXUserCallback AXRegisterCallback   (AXUserCallback callback);
935 
936 void    AXSetMode                   (u32 mode);
937 u32     AXGetMode                   (void);
938 
939 void    AXSetMaxDspCycles           (u32 cycles);
940 u32     AXGetMaxDspCycles           (void);
941 u32     AXGetDspCycles              (void);
942 
943 void    AXRegisterAuxACallback      (AXAuxCallback callback, void *context);
944 void    AXRegisterAuxBCallback      (AXAuxCallback callback, void *context);
945 void    AXRegisterAuxCCallback      (AXAuxCallback callback, void *context);
946 
947 void    AXGetAuxACallback           (AXAuxCallback *callback, void **context);
948 void    AXGetAuxBCallback           (AXAuxCallback *callback, void **context);
949 void    AXGetAuxCCallback           (AXAuxCallback *callback, void **context);
950 
951 u16     AXGetMasterVolume           (void);
952 void    AXSetMasterVolume           (u16 volume);
953 
954 u16     AXGetAuxAReturnVolume       (void);
955 u16     AXGetAuxBReturnVolume       (void);
956 u16     AXGetAuxCReturnVolume       (void);
957 void    AXSetAuxAReturnVolume       (u16 volume);
958 void    AXSetAuxBReturnVolume       (u16 volume);
959 void    AXSetAuxCReturnVolume       (u16 volume);
960 
961 AXVPB*  AXAcquireVoice              (
962                                      u32                priority,
963                                      AXVoiceCallback    callback,
964                                      u32                userContext
965                                      );
966 
967 void    AXFreeVoice                 (AXVPB *p);
968 void    AXSetVoicePriority          (AXVPB *p, u32 priority);
969 
970 void    AXSetVoiceSrcType           (AXVPB *p, u32 type);
971 void    AXSetVoiceState             (AXVPB *p, u16 state);
972 void    AXSetVoiceType              (AXVPB *p, u16 type);
973 void    AXSetVoiceMix               (AXVPB *p, AXPBMIX *mix);
974 void    AXSetVoiceItdOn             (AXVPB *p);
975 void    AXSetVoiceItdTarget         (AXVPB *p, u16 lShift, u16 rShift);
976 void    AXSetVoiceDpop              (AXVPB *p, AXPBDPOP *dpop);
977 void    AXSetVoiceVe                (AXVPB *p, AXPBVE *ve);
978 void    AXSetVoiceVeDelta           (AXVPB *p, s16 delta);
979 void    AXSetVoiceAddr              (AXVPB *p, AXPBADDR *addr);
980 void    AXSetVoiceLoop              (AXVPB *p, u16 loop);
981 void    AXSetVoiceLoopAddr          (AXVPB *p, u32 address);
982 void    AXSetVoiceEndAddr           (AXVPB *p, u32 address);
983 void    AXSetVoiceCurrentAddr       (AXVPB *p, u32 address);
984 void    AXSetVoiceAdpcm             (AXVPB *p, AXPBADPCM *adpcm);
985 void    AXSetVoiceSrc               (AXVPB *p, AXPBSRC *src);
986 void    AXSetVoiceSrcRatio          (AXVPB *p, f32 ratio);
987 void    AXSetVoiceAdpcmLoop         (AXVPB *p, AXPBADPCMLOOP *adpcmloop);
988 void    AXSetVoiceLpf               (AXVPB *p, AXPBLPF *lpf);
989 void    AXSetVoiceLpfCoefs          (AXVPB *p, u16 a0, u16 b0);
990 void    AXSetVoiceBiquad            (AXVPB *p, AXPBBIQUAD *biquad);
991 void    AXSetVoiceBiquadCoefs       (AXVPB *p, u16 b0, u16 b1, u16 b2, u16 a1, u16 a2);
992 
993 void    AXInitProfile               (AXPROFILE *profile, u32 maxProfiles);
994 u32     AXGetProfile                (void);
995 
996 void    AXSetCompressor             (u32);
997 
998 void    AXSetStepMode               (u32);
999 
1000 void    AXGetLpfCoefs               (u16 freq, u16 *a0, u16 *b0);
1001 
1002 void    AXSetVoiceRmtOn             (AXVPB *p, u16 on);
1003 void    AXSetVoiceRmtMix            (AXVPB *p, AXPBRMTMIX  *mix);
1004 void    AXSetVoiceRmtDpop           (AXVPB *p, AXPBRMTDPOP *dpop);
1005 void    AXSetVoiceRmtSrc            (AXVPB *p, AXPBRMTSRC  *src);
1006 void    AXSetVoiceRmtIIR            (AXVPB *p, AXPBRMTIIR  *iir);
1007 void    AXSetVoiceRmtIIRCoefs       (AXVPB *p, u16 type, ...);
1008 
1009 s32     AXRmtGetSamplesLeft         (void);
1010 s32     AXRmtGetSamples             (s32 chan, s16* buffer, s32 samples);
1011 s32     AXRmtAdvancePtr             (s32 samples);
1012 
1013 void    AXRegisterExceedCallback    (AXExceedCallback callback);
1014 
1015 #ifdef __cplusplus
1016 }
1017 #endif
1018 
1019 #endif // __AX_H__
1020