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