mirror of https://github.com/zeldaret/tp
374 lines
10 KiB
C
374 lines
10 KiB
C
#ifndef _REVOLUTION_AX_H_
|
|
#define _REVOLUTION_AX_H_
|
|
|
|
#include <revolution/types.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define AX_SAMPLE_RATE 32000
|
|
#define AX_SAMPLES_PER_FRAME 96
|
|
#define AX_SAMPLE_DEPTH_BYTES sizeof(u32)
|
|
#define AX_SAMPLES_PER_FRAME_RMT 18
|
|
#define AX_FRAME_SIZE (AX_SAMPLES_PER_FRAME * AX_SAMPLE_DEPTH_BYTES)
|
|
#define AX_MAX_VOLUME 32768
|
|
|
|
#define AX_VOICE_STOP 0
|
|
#define AX_VOICE_RUN 1
|
|
|
|
typedef struct _AXPBMIX {
|
|
/* 0x00 */ u16 vL;
|
|
/* 0x02 */ u16 vDeltaL;
|
|
/* 0x04 */ u16 vR;
|
|
/* 0x06 */ u16 vDeltaR;
|
|
/* 0x08 */ u16 vAuxAL;
|
|
/* 0x0A */ u16 vDeltaAuxAL;
|
|
/* 0x0C */ u16 vAuxAR;
|
|
/* 0x0E */ u16 vDeltaAuxAR;
|
|
/* 0x10 */ u16 vAuxBL;
|
|
/* 0x12 */ u16 vDeltaAuxBL;
|
|
/* 0x14 */ u16 vAuxBR;
|
|
/* 0x16 */ u16 vDeltaAuxBR;
|
|
/* 0x18 */ u16 vAuxBS;
|
|
/* 0x1A */ u16 vDeltaAuxBS;
|
|
/* 0x1C */ u16 vS;
|
|
/* 0x1E */ u16 vDeltaS;
|
|
/* 0x20 */ u16 vAuxAS;
|
|
/* 0x22 */ u16 vDeltaAuxAS;
|
|
} AXPBMIX;
|
|
|
|
typedef struct _AXPBITD {
|
|
/* 0x00 */ u16 flag;
|
|
/* 0x02 */ u16 bufferHi;
|
|
/* 0x04 */ u16 bufferLo;
|
|
/* 0x06 */ u16 shiftL;
|
|
/* 0x08 */ u16 shiftR;
|
|
/* 0x0A */ u16 targetShiftL;
|
|
/* 0x0C */ u16 targetShiftR;
|
|
} AXPBITD;
|
|
|
|
typedef struct _AXPBUPDATE {
|
|
/* 0x00 */ u16 updNum[5];
|
|
/* 0x0A */ u16 dataHi;
|
|
/* 0x0C */ u16 dataLo;
|
|
} AXPBUPDATE;
|
|
|
|
typedef struct _AXPBDPOP {
|
|
/* 0x00 */ s16 aL;
|
|
/* 0x02 */ s16 aAuxAL;
|
|
/* 0x04 */ s16 aAuxBL;
|
|
/* 0x06 */ s16 aR;
|
|
/* 0x08 */ s16 aAuxAR;
|
|
/* 0x0A */ s16 aAuxBR;
|
|
/* 0x0C */ s16 aS;
|
|
/* 0x0E */ s16 aAuxAS;
|
|
/* 0x10 */ s16 aAuxBS;
|
|
} AXPBDPOP;
|
|
|
|
typedef struct _AXPBVE {
|
|
/* 0x00 */ u16 currentVolume;
|
|
/* 0x02 */ s16 currentDelta;
|
|
} AXPBVE;
|
|
|
|
typedef struct _AXPBFIR {
|
|
/* 0x00 */ u16 numCoefs;
|
|
/* 0x02 */ u16 coefsHi;
|
|
/* 0x04 */ u16 coefsLo;
|
|
} AXPBFIR;
|
|
|
|
typedef struct _AXPBADDR {
|
|
/* 0x00 */ u16 loopFlag;
|
|
/* 0x02 */ u16 format;
|
|
/* 0x04 */ u16 loopAddressHi;
|
|
/* 0x06 */ u16 loopAddressLo;
|
|
/* 0x08 */ u16 endAddressHi;
|
|
/* 0x0A */ u16 endAddressLo;
|
|
/* 0x0C */ u16 currentAddressHi;
|
|
/* 0x0E */ u16 currentAddressLo;
|
|
} AXPBADDR;
|
|
|
|
typedef struct _AXPBADPCM {
|
|
/* 0x00 */ u16 a[8][2];
|
|
/* 0x20 */ u16 gain;
|
|
/* 0x22 */ u16 pred_scale;
|
|
/* 0x24 */ u16 yn1;
|
|
/* 0x26 */ u16 yn2;
|
|
} AXPBADPCM;
|
|
|
|
typedef struct _AXPBSRC {
|
|
/* 0x00 */ u16 ratioHi;
|
|
/* 0x02 */ u16 ratioLo;
|
|
/* 0x04 */ u16 currentAddressFrac;
|
|
/* 0x06 */ u16 last_samples[4];
|
|
} AXPBSRC;
|
|
|
|
typedef struct _AXPBADPCMLOOP {
|
|
/* 0x00 */ u16 loop_pred_scale;
|
|
/* 0x02 */ u16 loop_yn1;
|
|
/* 0x04 */ u16 loop_yn2;
|
|
} AXPBADPCMLOOP;
|
|
|
|
typedef struct _AXPBLPF {
|
|
u16 on;
|
|
u16 yn1;
|
|
u16 a0;
|
|
u16 b0;
|
|
} AXPBLPF;
|
|
|
|
typedef struct _AXPB {
|
|
/* 0x00 */ u16 nextHi;
|
|
/* 0x02 */ u16 nextLo;
|
|
/* 0x04 */ u16 currHi;
|
|
/* 0x06 */ u16 currLo;
|
|
/* 0x08 */ u16 srcSelect;
|
|
/* 0x0A */ u16 coefSelect;
|
|
/* 0x0C */ u16 mixerCtrl;
|
|
/* 0x0E */ u16 state;
|
|
/* 0x10 */ u16 type;
|
|
/* 0x12 */ AXPBMIX mix;
|
|
/* 0x36 */ AXPBITD itd;
|
|
/* 0x44 */ AXPBUPDATE update;
|
|
/* 0x52 */ AXPBDPOP dpop;
|
|
/* 0x64 */ AXPBVE ve;
|
|
/* 0x68 */ AXPBFIR fir;
|
|
/* 0x6E */ AXPBADDR addr;
|
|
/* 0x7E */ AXPBADPCM adpcm;
|
|
/* 0xA6 */ AXPBSRC src;
|
|
/* 0xB4 */ AXPBADPCMLOOP adpcmLoop;
|
|
/* 0xBA */ AXPBLPF lpf;
|
|
/* 0xC2 */ u16 pad[25];
|
|
} AXPB;
|
|
|
|
typedef struct _AXVPB {
|
|
/* 0x000 */ void* next;
|
|
/* 0x004 */ void* prev;
|
|
/* 0x008 */ void* next1;
|
|
/* 0x00C */ u32 priority;
|
|
/* 0x010 */ void (*callback)(void*);
|
|
/* 0x014 */ u32 userContext;
|
|
/* 0x018 */ u32 index;
|
|
/* 0x01C */ u32 sync;
|
|
/* 0x020 */ u32 depop;
|
|
/* 0x024 */ u32 updateMS;
|
|
/* 0x028 */ u32 updateCounter;
|
|
/* 0x02C */ u32 updateTotal;
|
|
/* 0x030 */ u16* updateWrite;
|
|
/* 0x034 */ u16 updateData[128];
|
|
/* 0x134 */ void* itdBuffer;
|
|
/* 0x138 */ AXPB pb;
|
|
} AXVPB;
|
|
|
|
typedef struct _AXPBITDBUFFER {
|
|
/* 0x00 */ s16 data[32];
|
|
} AXPBITDBUFFER;
|
|
|
|
typedef struct _AXPBU {
|
|
/* 0x00 */ u16 data[128];
|
|
} AXPBU;
|
|
|
|
typedef struct _AXSPB {
|
|
/* 0x00 */ u16 dpopLHi;
|
|
/* 0x02 */ u16 dpopLLo;
|
|
/* 0x04 */ s16 dpopLDelta;
|
|
/* 0x06 */ u16 dpopRHi;
|
|
/* 0x08 */ u16 dpopRLo;
|
|
/* 0x0A */ s16 dpopRDelta;
|
|
/* 0x0C */ u16 dpopSHi;
|
|
/* 0x0E */ u16 dpopSLo;
|
|
/* 0x10 */ s16 dpopSDelta;
|
|
/* 0x12 */ u16 dpopALHi;
|
|
/* 0x14 */ u16 dpopALLo;
|
|
/* 0x16 */ s16 dpopALDelta;
|
|
/* 0x18 */ u16 dpopARHi;
|
|
/* 0x1A */ u16 dpopARLo;
|
|
/* 0x1C */ s16 dpopARDelta;
|
|
/* 0x1E */ u16 dpopASHi;
|
|
/* 0x20 */ u16 dpopASLo;
|
|
/* 0x22 */ s16 dpopASDelta;
|
|
/* 0x24 */ u16 dpopBLHi;
|
|
/* 0x26 */ u16 dpopBLLo;
|
|
/* 0x28 */ s16 dpopBLDelta;
|
|
/* 0x2A */ u16 dpopBRHi;
|
|
/* 0x2C */ u16 dpopBRLo;
|
|
/* 0x2E */ s16 dpopBRDelta;
|
|
/* 0x30 */ u16 dpopBSHi;
|
|
/* 0x32 */ u16 dpopBSLo;
|
|
/* 0x34 */ s16 dpopBSDelta;
|
|
} AXSPB;
|
|
|
|
typedef struct _AXPROFILE {
|
|
/* 0x00 */ u64 axFrameStart;
|
|
/* 0x08 */ u64 auxProcessingStart;
|
|
/* 0x10 */ u64 auxProcessingEnd;
|
|
/* 0x18 */ u64 userCallbackStart;
|
|
/* 0x20 */ u64 userCallbackEnd;
|
|
/* 0x28 */ u64 axFrameEnd;
|
|
/* 0x30 */ u32 axNumVoices;
|
|
} AXPROFILE;
|
|
|
|
typedef struct AX_AUX_DATA {
|
|
/* 0x00 */ s32* l;
|
|
/* 0x00 */ s32* r;
|
|
/* 0x00 */ s32* s;
|
|
} AX_AUX_DATA;
|
|
|
|
typedef struct AX_AUX_DATA_DPL2 {
|
|
/* 0x00 */ s32* l;
|
|
/* 0x00 */ s32* r;
|
|
/* 0x00 */ s32* ls;
|
|
/* 0x00 */ s32* rs;
|
|
} AX_AUX_DATA_DPL2;
|
|
|
|
typedef struct _AXPBRMTMIX {
|
|
/* 0x0 */ u16 vMain0;
|
|
/* 0x2 */ u16 vDeltaMain0;
|
|
/* 0x4 */ u16 vAux0;
|
|
/* 0x6 */ u16 vDeltaAux0;
|
|
/* 0x8 */ u16 vMain1;
|
|
/* 0xA */ u16 vDeltaMain1;
|
|
/* 0xC */ u16 vAux1;
|
|
/* 0xE */ u16 vDeltaAux1;
|
|
/* 0x10 */ u16 vMain2;
|
|
/* 0x12 */ u16 vDeltaMain2;
|
|
/* 0x14 */ u16 vAux2;
|
|
/* 0x16 */ u16 vDeltaAux2;
|
|
/* 0x18 */ u16 vMain3;
|
|
/* 0x1A */ u16 vDeltaMain3;
|
|
/* 0x1C */ u16 vAux3;
|
|
/* 0x1E */ u16 vDeltaAux3;
|
|
} AXPBRMTMIX;
|
|
|
|
typedef struct _AXPBBIQUAD {
|
|
/* 0x0 */ u16 on;
|
|
/* 0x2 */ u16 xn1;
|
|
/* 0x4 */ u16 xn2;
|
|
/* 0x6 */ u16 yn1;
|
|
/* 0x8 */ u16 yn2;
|
|
/* 0xA */ u16 b0;
|
|
/* 0xC */ u16 b1;
|
|
/* 0xE */ u16 b2;
|
|
/* 0x10 */ u16 a1;
|
|
/* 0x12 */ u16 a2;
|
|
} AXPBBIQUAD;
|
|
|
|
typedef union __AXPBRMTIIR {
|
|
AXPBLPF lpf;
|
|
AXPBBIQUAD biquad;
|
|
} AXPBRMTIIR;
|
|
|
|
typedef void (*AXCallback)();
|
|
typedef void (*AXAuxCallback)(void* chans, void* context);
|
|
|
|
#define AX_DSP_SLAVE_LENGTH 0xF80
|
|
#define AX_MAX_VOICES 64
|
|
|
|
#define AX_SRC_TYPE_NONE 0
|
|
#define AX_SRC_TYPE_LINEAR 1
|
|
#define AX_SRC_TYPE_4TAP_8K 2
|
|
#define AX_SRC_TYPE_4TAP_12K 3
|
|
#define AX_SRC_TYPE_4TAP_16K 4
|
|
|
|
// sync flags
|
|
#define AX_SYNC_FLAG_COPYALL (1 << 31)
|
|
#define AX_SYNC_FLAG_UNK1 (1 << 30) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK2 (1 << 29) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK3 (1 << 28) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK4 (1 << 27) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK5 (1 << 26) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK6 (1 << 25) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK7 (1 << 24) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK8 (1 << 23) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK9 (1 << 22) // reserved, unused?
|
|
#define AX_SYNC_FLAG_UNK10 (1 << 21) // reserved, unused?
|
|
#define AX_SYNC_FLAG_COPYADPCMLOOP (1 << 20)
|
|
#define AX_SYNC_FLAG_COPYRATIO (1 << 19)
|
|
#define AX_SYNC_FLAG_COPYSRC (1 << 18)
|
|
#define AX_SYNC_FLAG_COPYADPCM (1 << 17)
|
|
#define AX_SYNC_FLAG_COPYCURADDR (1 << 16)
|
|
#define AX_SYNC_FLAG_COPYENDADDR (1 << 15)
|
|
#define AX_SYNC_FLAG_COPYLOOPADDR (1 << 14)
|
|
#define AX_SYNC_FLAG_COPYLOOP (1 << 13)
|
|
#define AX_SYNC_FLAG_COPYADDR (1 << 12)
|
|
#define AX_SYNC_FLAG_COPYFIR (1 << 11)
|
|
#define AX_SYNC_FLAG_SWAPVOL (1 << 10)
|
|
#define AX_SYNC_FLAG_COPYVOL (1 << 9)
|
|
#define AX_SYNC_FLAG_COPYDPOP (1 << 8)
|
|
#define AX_SYNC_FLAG_COPYUPDATE (1 << 7)
|
|
#define AX_SYNC_FLAG_COPYTSHIFT (1 << 6)
|
|
#define AX_SYNC_FLAG_COPYITD (1 << 5)
|
|
#define AX_SYNC_FLAG_COPYAXPBMIX (1 << 4)
|
|
#define AX_SYNC_FLAG_COPYTYPE (1 << 3)
|
|
#define AX_SYNC_FLAG_COPYSTATE (1 << 2)
|
|
#define AX_SYNC_FLAG_COPYMXRCTRL (1 << 1)
|
|
#define AX_SYNC_FLAG_COPYSELECT (1 << 0)
|
|
|
|
#define AX_PRIORITY_STACKS 32
|
|
|
|
// AX
|
|
void AXInit(void);
|
|
void AXInitEx(u32 outputBufferMode);
|
|
void AXQuit(void);
|
|
|
|
// AXAlloc
|
|
void AXFreeVoice(AXVPB* p);
|
|
AXVPB* AXAcquireVoice(u32 priority, void (*callback)(void *), u32 userContext);
|
|
void AXSetVoicePriority(AXVPB* p, u32 priority);
|
|
|
|
// AXAux
|
|
void AXRegisterAuxACallback(AXAuxCallback callback, void* context);
|
|
void AXRegisterAuxBCallback(void (*callback)(void*, void*), void* context);
|
|
|
|
// AXCL
|
|
void AXSetMode(u32 mode);
|
|
u32 AXGetMode(void);
|
|
|
|
// AXOut
|
|
extern AXPROFILE __AXLocalProfile;
|
|
|
|
void AXSetStepMode(u32 i);
|
|
AXCallback AXRegisterCallback(AXCallback callback);
|
|
|
|
// AXProf
|
|
void AXInitProfile(AXPROFILE* profile, u32 maxProfiles);
|
|
u32 AXGetProfile(void);
|
|
|
|
// AXVPB
|
|
void AXSetVoiceSrcType(AXVPB* p, u32 type);
|
|
void AXSetVoiceState(AXVPB* p, u16 state);
|
|
void AXSetVoiceType(AXVPB* p, u16 type);
|
|
void AXSetVoiceMix(AXVPB* p, AXPBMIX* mix);
|
|
void AXSetVoiceItdOn(AXVPB* p);
|
|
void AXSetVoiceItdTarget(AXVPB* p, u16 lShift, u16 rShift);
|
|
void AXSetVoiceUpdateIncrement(AXVPB* p);
|
|
void AXSetVoiceUpdateWrite(AXVPB* p, u16 param, u16 data);
|
|
void AXSetVoiceDpop(AXVPB* p, AXPBDPOP* dpop);
|
|
void AXSetVoiceVe(AXVPB* p, AXPBVE* ve);
|
|
void AXSetVoiceVeDelta(AXVPB* p, s16 delta);
|
|
void AXSetVoiceFir(AXVPB* p, AXPBFIR* fir);
|
|
void AXSetVoiceAddr(AXVPB* p, AXPBADDR* addr);
|
|
void AXSetVoiceLoop(AXVPB* p, u16 loop);
|
|
void AXSetVoiceLoopAddr(AXVPB* p, u32 addr);
|
|
void AXSetVoiceEndAddr(AXVPB* p, u32 addr);
|
|
void AXSetVoiceCurrentAddr(AXVPB* p, u32 addr);
|
|
void AXSetVoiceAdpcm(AXVPB* p, AXPBADPCM* adpcm);
|
|
void AXSetVoiceSrc(AXVPB* p, AXPBSRC* src_);
|
|
void AXSetVoiceSrcRatio(AXVPB* p, f32 ratio);
|
|
void AXSetVoiceAdpcmLoop(AXVPB* p, AXPBADPCMLOOP* adpcmloop);
|
|
void AXSetMaxDspCycles(u32 cycles);
|
|
u32 AXGetMaxDspCycles(void);
|
|
u32 AXGetDspCycles(void);
|
|
void AXSetVoiceLpf(AXVPB* p, AXPBLPF* lpf);
|
|
void AXSetVoiceLpfCoefs(AXVPB* p, u16 a0, u16 b0);
|
|
void AXGetLpfCoefs(u16 freq, u16* a0, u16* b0);
|
|
|
|
// DSPCode
|
|
extern u16 axDspSlaveLength;
|
|
extern u16 axDspSlave[AX_DSP_SLAVE_LENGTH];
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _REVOLUTION_AX_H_
|