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