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