From 78aeffe5a4e1795eeea786c4818ad5b3bae7fcd9 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 17 Oct 2021 11:24:07 +1000 Subject: [PATCH] Decompile func0003ba64 --- include/PR/n_libaudio.h | 7 ++ src/include/lib/lib_3a100.h | 4 +- src/include/lib/lib_3e3e0.h | 2 +- src/lib/naudio/n_csplayer.c | 4 +- src/lib/naudio/n_drvrNew.c | 169 ++++++------------------------- src/lib/naudio/n_synsetfxparam.c | 8 +- 6 files changed, 48 insertions(+), 146 deletions(-) diff --git a/include/PR/n_libaudio.h b/include/PR/n_libaudio.h index 73b6ef828..796d57549 100644 --- a/include/PR/n_libaudio.h +++ b/include/PR/n_libaudio.h @@ -182,6 +182,13 @@ struct oscstate { f32 unk10; }; +struct fx { + s16 unk00; + s16 unk02; + s32 unk04; + s16 unk08[8]; +}; + typedef struct N_ALVoiceState_s { struct N_ALVoiceState_s *next;/* MUST be first */ N_ALVoice voice; diff --git a/src/include/lib/lib_3a100.h b/src/include/lib/lib_3a100.h index 31ee310eb..1ab29584f 100644 --- a/src/include/lib/lib_3a100.h +++ b/src/include/lib/lib_3a100.h @@ -8,8 +8,8 @@ u32 func0003ae60(void); u32 func0003b178(void); u32 func0003b370(void); u32 func0003b54c(void); -u32 func0003b710(void); +void func0003b710(f32 outputrate, f32 arg1, f32 arg4, f32 *arg5, f32 *arg6); f32 func0003b9d4(s32 arg0); -void func0003ba64(ALFxRef fx, f32 outputrate); +void func0003ba64(struct fx *fx, f32 outputrate); #endif diff --git a/src/include/lib/lib_3e3e0.h b/src/include/lib/lib_3e3e0.h index 1e6ca922b..9970b5fed 100644 --- a/src/include/lib/lib_3e3e0.h +++ b/src/include/lib/lib_3e3e0.h @@ -8,6 +8,6 @@ void func0003e3e0(N_ALVoice *v, f32 arg1); u32 func0003e490(void); ALFxRef func0003e540(u8 arg0); ALFxRef func0003e5b8(u8 arg0); -void func0003e674(ALFxRef fx, s16 arg1, void *param); +void func0003e674(struct fx *fx, s16 arg1, void *param); #endif diff --git a/src/lib/naudio/n_csplayer.c b/src/lib/naudio/n_csplayer.c index d19c433e4..bc889d0ad 100644 --- a/src/lib/naudio/n_csplayer.c +++ b/src/lib/naudio/n_csplayer.c @@ -237,7 +237,7 @@ void func0003e3e0(N_ALVoice *v, f32 arg1); u8 func0003d9cc(N_ALVoiceState *vs, N_ALCSPlayer *seqp); ALFxRef func0003e540(u8 arg0); ALFxRef func0003e5b8(u8 arg0); -void func0003e674(ALFxRef fx, u8 arg1, void *param); +void func0003e674(struct fx *fx, u8 arg1, void *param); f32 func0003b9d4(s32 arg0); ALMicroTime __n_CSPVoiceHandler(void *node) @@ -365,7 +365,7 @@ ALMicroTime __n_CSPVoiceHandler(void *node) ALFxRef fx = func0003e5b8(seqp->nextEvent.msg.evt19.unk00); if (fx) { - func0003e674(fx, seqp->nextEvent.msg.evt19.unk01, &seqp->nextEvent.msg.evt19.param); + func0003e674((struct fx *) fx, seqp->nextEvent.msg.evt19.unk01, &seqp->nextEvent.msg.evt19.param); } } break; diff --git a/src/lib/naudio/n_drvrNew.c b/src/lib/naudio/n_drvrNew.c index 808f8cd99..c4c869e06 100644 --- a/src/lib/naudio/n_drvrNew.c +++ b/src/lib/naudio/n_drvrNew.c @@ -186,143 +186,38 @@ f32 func0003b9d4(s32 arg0) return value; } -GLOBAL_ASM( -glabel func0003ba64 -.late_rodata -glabel var70054ad0 -.word 0x46d12000 -glabel var70054ad4 -.word 0x46d12000 -.text -/* 3ba64: 27bdffc0 */ addiu $sp,$sp,-64 -/* 3ba68: afbf001c */ sw $ra,0x1c($sp) -/* 3ba6c: afa40040 */ sw $a0,0x40($sp) -/* 3ba70: afa50044 */ sw $a1,0x44($sp) -/* 3ba74: 8fae0040 */ lw $t6,0x40($sp) -/* 3ba78: 85cf0002 */ lh $t7,0x2($t6) -/* 3ba7c: 15e00003 */ bnez $t7,.L0003ba8c -/* 3ba80: 00000000 */ nop -/* 3ba84: 1000006e */ b .L0003bc40 -/* 3ba88: 00000000 */ nop -.L0003ba8c: -/* 3ba8c: 8fb80040 */ lw $t8,0x40($sp) -/* 3ba90: 87190002 */ lh $t9,0x2($t8) -/* 3ba94: 2b21000a */ slti $at,$t9,0xa -/* 3ba98: 10200004 */ beqz $at,.L0003baac -/* 3ba9c: 00000000 */ nop -/* 3baa0: 8fa90040 */ lw $t1,0x40($sp) -/* 3baa4: 2408000a */ addiu $t0,$zero,0xa -/* 3baa8: a5280002 */ sh $t0,0x2($t1) -.L0003baac: -/* 3baac: 8faa0040 */ lw $t2,0x40($sp) -/* 3bab0: 3c014120 */ lui $at,0x4120 -/* 3bab4: 44819000 */ mtc1 $at,$f18 -/* 3bab8: 854c0002 */ lh $t4,0x2($t2) -/* 3babc: 854b0000 */ lh $t3,0x0($t2) -/* 3bac0: 44814000 */ mtc1 $at,$f8 -/* 3bac4: 448c5000 */ mtc1 $t4,$f10 -/* 3bac8: 448b2000 */ mtc1 $t3,$f4 -/* 3bacc: 27ad0024 */ addiu $t5,$sp,0x24 -/* 3bad0: 46805420 */ cvt.s.w $f16,$f10 -/* 3bad4: afad0010 */ sw $t5,0x10($sp) -/* 3bad8: c7ac0044 */ lwc1 $f12,0x44($sp) -/* 3badc: 27a70030 */ addiu $a3,$sp,0x30 -/* 3bae0: 468021a0 */ cvt.s.w $f6,$f4 -/* 3bae4: 46128103 */ div.s $f4,$f16,$f18 -/* 3bae8: 46083380 */ add.s $f14,$f6,$f8 -/* 3baec: 44062000 */ mfc1 $a2,$f4 -/* 3baf0: 0c00edc4 */ jal func0003b710 -/* 3baf4: 00000000 */ nop -/* 3baf8: 240e0003 */ addiu $t6,$zero,0x3 -/* 3bafc: afae003c */ sw $t6,0x3c($sp) -.L0003bb00: -/* 3bb00: 8fb8003c */ lw $t8,0x3c($sp) -/* 3bb04: 8faf0040 */ lw $t7,0x40($sp) -/* 3bb08: 0018c840 */ sll $t9,$t8,0x1 -/* 3bb0c: 01f94021 */ addu $t0,$t7,$t9 -/* 3bb10: a5000008 */ sh $zero,0x8($t0) -/* 3bb14: 8fa9003c */ lw $t1,0x3c($sp) -/* 3bb18: 252b0001 */ addiu $t3,$t1,0x1 -/* 3bb1c: 29610008 */ slti $at,$t3,0x8 -/* 3bb20: 1420fff7 */ bnez $at,.L0003bb00 -/* 3bb24: afab003c */ sw $t3,0x3c($sp) -/* 3bb28: 8faa0040 */ lw $t2,0x40($sp) -/* 3bb2c: 3c014300 */ lui $at,0x4300 -/* 3bb30: 44815000 */ mtc1 $at,$f10 -/* 3bb34: 854c0002 */ lh $t4,0x2($t2) -/* 3bb38: 3c017005 */ lui $at,%hi(var70054ad0) -/* 3bb3c: c4324ad0 */ lwc1 $f18,%lo(var70054ad0)($at) -/* 3bb40: 448c3000 */ mtc1 $t4,$f6 -/* 3bb44: 27ad0030 */ addiu $t5,$sp,0x30 -/* 3bb48: 46803220 */ cvt.s.w $f8,$f6 -/* 3bb4c: c5a60000 */ lwc1 $f6,0x0($t5) -/* 3bb50: 460a4402 */ mul.s $f16,$f8,$f10 -/* 3bb54: 46109101 */ sub.s $f4,$f18,$f16 -/* 3bb58: 46043202 */ mul.s $f8,$f6,$f4 -/* 3bb5c: 4600428d */ trunc.w.s $f10,$f8 -/* 3bb60: 44185000 */ mfc1 $t8,$f10 -/* 3bb64: 00000000 */ nop -/* 3bb68: a5580008 */ sh $t8,0x8($t2) -/* 3bb6c: 8faf0040 */ lw $t7,0x40($sp) -/* 3bb70: 3c014300 */ lui $at,0x4300 -/* 3bb74: 44813000 */ mtc1 $at,$f6 -/* 3bb78: 85f90002 */ lh $t9,0x2($t7) -/* 3bb7c: 3c017005 */ lui $at,%hi(var70054ad4) -/* 3bb80: c4284ad4 */ lwc1 $f8,%lo(var70054ad4)($at) -/* 3bb84: 44999000 */ mtc1 $t9,$f18 -/* 3bb88: 27a80030 */ addiu $t0,$sp,0x30 -/* 3bb8c: 46809420 */ cvt.s.w $f16,$f18 -/* 3bb90: c5120004 */ lwc1 $f18,0x4($t0) -/* 3bb94: 46068102 */ mul.s $f4,$f16,$f6 -/* 3bb98: 46044281 */ sub.s $f10,$f8,$f4 -/* 3bb9c: 460a9402 */ mul.s $f16,$f18,$f10 -/* 3bba0: 4600818d */ trunc.w.s $f6,$f16 -/* 3bba4: 440b3000 */ mfc1 $t3,$f6 -/* 3bba8: 00000000 */ nop -/* 3bbac: a5eb000a */ sh $t3,0xa($t7) -/* 3bbb0: 8fac0040 */ lw $t4,0x40($sp) -/* 3bbb4: a580000c */ sh $zero,0xc($t4) -/* 3bbb8: 27ad0024 */ addiu $t5,$sp,0x24 -/* 3bbbc: 3c01c680 */ lui $at,0xc680 -/* 3bbc0: 44812000 */ mtc1 $at,$f4 -/* 3bbc4: c5a80004 */ lwc1 $f8,0x4($t5) -/* 3bbc8: 8faa0040 */ lw $t2,0x40($sp) -/* 3bbcc: 46044482 */ mul.s $f18,$f8,$f4 -/* 3bbd0: 4600928d */ trunc.w.s $f10,$f18 -/* 3bbd4: 44185000 */ mfc1 $t8,$f10 -/* 3bbd8: 00000000 */ nop -/* 3bbdc: a5580018 */ sh $t8,0x18($t2) -/* 3bbe0: 27b90024 */ addiu $t9,$sp,0x24 -/* 3bbe4: 3c01c680 */ lui $at,0xc680 -/* 3bbe8: 44813000 */ mtc1 $at,$f6 -/* 3bbec: c7300008 */ lwc1 $f16,0x8($t9) -/* 3bbf0: 8fab0040 */ lw $t3,0x40($sp) -/* 3bbf4: 46068202 */ mul.s $f8,$f16,$f6 -/* 3bbf8: 4600410d */ trunc.w.s $f4,$f8 -/* 3bbfc: 44092000 */ mfc1 $t1,$f4 -/* 3bc00: 00000000 */ nop -/* 3bc04: a569001a */ sh $t1,0x1a($t3) -/* 3bc08: 240f000a */ addiu $t7,$zero,0xa -/* 3bc0c: afaf003c */ sw $t7,0x3c($sp) -.L0003bc10: -/* 3bc10: 8fad003c */ lw $t5,0x3c($sp) -/* 3bc14: 8fac0040 */ lw $t4,0x40($sp) -/* 3bc18: 000d7040 */ sll $t6,$t5,0x1 -/* 3bc1c: 018ec021 */ addu $t8,$t4,$t6 -/* 3bc20: a7000008 */ sh $zero,0x8($t8) -/* 3bc24: 8faa003c */ lw $t2,0x3c($sp) -/* 3bc28: 25590001 */ addiu $t9,$t2,0x1 -/* 3bc2c: 2b210010 */ slti $at,$t9,0x10 -/* 3bc30: 1420fff7 */ bnez $at,.L0003bc10 -/* 3bc34: afb9003c */ sw $t9,0x3c($sp) -/* 3bc38: 10000001 */ b .L0003bc40 -/* 3bc3c: 00000000 */ nop -.L0003bc40: -/* 3bc40: 8fbf001c */ lw $ra,0x1c($sp) -/* 3bc44: 27bd0040 */ addiu $sp,$sp,0x40 -/* 3bc48: 03e00008 */ jr $ra -/* 3bc4c: 00000000 */ nop -); +void func0003b710(f32 outputrate, f32 arg1, f32 arg4, f32 *arg5, f32 *arg6); + +void func0003ba64(struct fx *fx, f32 outputrate) +{ + s32 i; + f32 sp30[3]; + f32 sp24[3]; + + if (fx->unk02 == 0) { + return; + } + + if (fx->unk02 < 10) { + fx->unk02 = 10; + } + + func0003b710(outputrate, fx->unk00 + 10.0f, fx->unk02 / 10.0f, sp30, sp24); + + for (i = 3; i < 8; i++) { + fx->unk08[i] = 0; + } + + fx->unk08[0] = sp30[0] * (26768 - fx->unk02 * 128.0f); + fx->unk08[1] = sp30[1] * (26768 - fx->unk02 * 128.0f); + fx->unk08[2] = 0; + fx->unk08[8] = sp24[1] * -16384; + fx->unk08[9] = sp24[2] * -16384; + + for (i = 10; i < 16; i++) { + fx->unk08[i] = 0; + } +} void n_alFxNew(ALFx **fx_ar, ALSynConfig *c, s16 bus, ALHeap *hp) { diff --git a/src/lib/naudio/n_synsetfxparam.c b/src/lib/naudio/n_synsetfxparam.c index b7a1b1d6e..5564845ef 100644 --- a/src/lib/naudio/n_synsetfxparam.c +++ b/src/lib/naudio/n_synsetfxparam.c @@ -7,14 +7,14 @@ void n_alSynSetFXParam(ALFxRef fx, s16 paramID, void *param) n_alFxParamHdl(f, (s32)paramID, param); } -void func0003ba64(ALFxRef fx, f32 outputrate); +void func0003ba64(struct fx *fx, f32 outputrate); -void func0003e674(ALFxRef fx, s16 arg1, void *param) +void func0003e674(struct fx *fx, s16 arg1, void *param) { if (arg1 == 8) { - ((s16 *)fx)[1] = (*(s32 *)param * 0.1f); + fx->unk02 = (*(s32 *)param * 0.1f); } else if (arg1 == 9) { - *(u16 *)fx = *(s32 *)param; + fx->unk00 = *(s32 *)param; } func0003ba64(fx, n_syn->outputRate);