tp/include/revolution/ax.h

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_