Decompile n_alResamplePull2

This commit is contained in:
Ryan Dwyer 2021-10-17 17:16:04 +10:00
parent 84a4112563
commit 1d852b6dd2
6 changed files with 62 additions and 224 deletions

View File

@ -31,6 +31,18 @@
* Macros to assemble the audio command list
*/
/**
* n_aNoop is a command that Rare added to the library.
* The opcode is 0, which is a no-op according to the ABI.
* It obviously does something but I have no idea what.
*/
#define n_aNoop(pkt, outp, b, c) \
{ \
Acmd *_a = (Acmd *)pkt; \
_a->words.w0 = (_SHIFTL(A_SPNOOP, 24, 8) | _SHIFTL(outp, 0, 16)); \
_a->words.w1 = (_SHIFTL(b, 16, 16) | _SHIFTL(c, 0, 16)); \
}
#define n_aADPCMdec(pkt, s, f, c, a, d) \
{ \
Acmd *_a = (Acmd *)pkt; \

View File

@ -260,8 +260,8 @@ void alN_PVoiceNew(N_PVoice *mv, ALDMANew dmaNew, ALHeap *hp)
mv->em_ctrlList = 0;
mv->em_ctrlTail = 0;
mv->unk8c = 0;
mv->unk92 = 0;
mv->unk90 = 0;
mv->fx.unk02 = 0;
mv->fx.unk00 = 0;
mv->unkbc = alHeapAlloc(hp, 1, 8);
mv->unkb8 = 0;
}

View File

@ -108,8 +108,8 @@ Acmd *n_alEnvmixerPull(N_PVoice *filter, s32 sampleOffset, Acmd *p)
}
e->rs_ratio = param->pitch;
e->unk92 = param->unk15;
e->unk90 = param->unk18;
e->fx.unk02 = param->unk15;
e->fx.unk00 = param->unk18;
e->unkb8 = 1;
e->unk8c = param->unk14;
}

View File

@ -16,7 +16,7 @@ Acmd *n_alResamplePull(N_PVoice *e, s16 *outp, Acmd *p)
*/
if (e->rs_upitch) {
ptr = n_alAdpcmPull(e, &inp, FIXED_SAMPLE, p);
aDMEMMove(ptr++, inp, *outp , FIXED_SAMPLE<<1);
aDMEMMove(ptr++, inp, *outp , FIXED_SAMPLE << 1);
} else {
/*
* clip to maximum allowable pitch

View File

@ -1,216 +1,48 @@
#include "n_synthInternals.h"
#include <os.h>
#include <gu.h>
const u32 var70059c80[] = {0x46d10600};
const u32 var70059c84[] = {0x45f15800};
const u32 var70059c88[] = {0x45f15800};
void func0003ba64(struct fx *fx, f32 outputrate);
GLOBAL_ASM(
glabel n_alResamplePull2
/* 45ab0: 27bdffd0 */ addiu $sp,$sp,-48
/* 45ab4: afbf0014 */ sw $ra,0x14($sp)
/* 45ab8: afa40030 */ sw $a0,0x30($sp)
/* 45abc: afa50034 */ sw $a1,0x34($sp)
/* 45ac0: afa60038 */ sw $a2,0x38($sp)
/* 45ac4: afa7003c */ sw $a3,0x3c($sp)
/* 45ac8: 8fae003c */ lw $t6,0x3c($sp)
/* 45acc: afae002c */ sw $t6,0x2c($sp)
/* 45ad0: 8fa40030 */ lw $a0,0x30($sp)
/* 45ad4: 8fa50034 */ lw $a1,0x34($sp)
/* 45ad8: 0c011ea4 */ jal n_alResamplePull
/* 45adc: 8fa6003c */ lw $a2,0x3c($sp)
/* 45ae0: afa2002c */ sw $v0,0x2c($sp)
/* 45ae4: 8faf0030 */ lw $t7,0x30($sp)
/* 45ae8: 91f8008c */ lbu $t8,0x8c($t7)
/* 45aec: 1300006a */ beqz $t8,.L00045c98
/* 45af0: 00000000 */ nop
/* 45af4: 2b010040 */ slti $at,$t8,0x40
/* 45af8: 10200067 */ beqz $at,.L00045c98
/* 45afc: 00000000 */ nop
/* 45b00: 8fb90030 */ lw $t9,0x30($sp)
/* 45b04: 9328008c */ lbu $t0,0x8c($t9)
/* 45b08: 29010006 */ slti $at,$t0,0x6
/* 45b0c: 14200013 */ bnez $at,.L00045b5c
/* 45b10: 00000000 */ nop
/* 45b14: 8fa90030 */ lw $t1,0x30($sp)
/* 45b18: 912a008c */ lbu $t2,0x8c($t1)
/* 45b1c: 448a2000 */ mtc1 $t2,$f4
/* 45b20: 05410005 */ bgez $t2,.L00045b38
/* 45b24: 468021a0 */ cvt.s.w $f6,$f4
/* 45b28: 3c014f80 */ lui $at,0x4f80
/* 45b2c: 44814000 */ mtc1 $at,$f8
/* 45b30: 00000000 */ nop
/* 45b34: 46083180 */ add.s $f6,$f6,$f8
.L00045b38:
/* 45b38: 3c013f80 */ lui $at,0x3f80
/* 45b3c: 44815000 */ mtc1 $at,$f10
/* 45b40: 0c012974 */ jal sqrtf
/* 45b44: 460a3300 */ add.s $f12,$f6,$f10
/* 45b48: 3c017006 */ lui $at,%hi(var70059c80)
/* 45b4c: c4309c80 */ lwc1 $f16,%lo(var70059c80)($at)
/* 45b50: 46008483 */ div.s $f18,$f16,$f0
/* 45b54: 10000011 */ b .L00045b9c
/* 45b58: e7b20028 */ swc1 $f18,0x28($sp)
.L00045b5c:
/* 45b5c: 8fab0030 */ lw $t3,0x30($sp)
/* 45b60: 916c008c */ lbu $t4,0x8c($t3)
/* 45b64: 448c2000 */ mtc1 $t4,$f4
/* 45b68: 05810005 */ bgez $t4,.L00045b80
/* 45b6c: 46802220 */ cvt.s.w $f8,$f4
/* 45b70: 3c014f80 */ lui $at,0x4f80
/* 45b74: 44813000 */ mtc1 $at,$f6
/* 45b78: 00000000 */ nop
/* 45b7c: 46064200 */ add.s $f8,$f8,$f6
.L00045b80:
/* 45b80: 3c013f80 */ lui $at,0x3f80
/* 45b84: 44815000 */ mtc1 $at,$f10
/* 45b88: 3c014780 */ lui $at,0x4780
/* 45b8c: 44819000 */ mtc1 $at,$f18
/* 45b90: 460a4400 */ add.s $f16,$f8,$f10
/* 45b94: 46109103 */ div.s $f4,$f18,$f16
/* 45b98: e7a40028 */ swc1 $f4,0x28($sp)
.L00045b9c:
/* 45b9c: 3c017006 */ lui $at,%hi(var70059c84)
/* 45ba0: c4289c84 */ lwc1 $f8,%lo(var70059c84)($at)
/* 45ba4: c7a60028 */ lwc1 $f6,0x28($sp)
/* 45ba8: 4608303c */ c.lt.s $f6,$f8
/* 45bac: 00000000 */ nop
/* 45bb0: 45000004 */ bc1f .L00045bc4
/* 45bb4: 00000000 */ nop
/* 45bb8: 3c017006 */ lui $at,%hi(var70059c88)
/* 45bbc: c42a9c88 */ lwc1 $f10,%lo(var70059c88)($at)
/* 45bc0: e7aa0028 */ swc1 $f10,0x28($sp)
.L00045bc4:
/* 45bc4: 8fad002c */ lw $t5,0x2c($sp)
/* 45bc8: 25ae0008 */ addiu $t6,$t5,0x8
/* 45bcc: afae002c */ sw $t6,0x2c($sp)
/* 45bd0: afad0024 */ sw $t5,0x24($sp)
/* 45bd4: 8faf0034 */ lw $t7,0x34($sp)
/* 45bd8: 8fa80024 */ lw $t0,0x24($sp)
/* 45bdc: 85f80000 */ lh $t8,0x0($t7)
/* 45be0: 3319ffff */ andi $t9,$t8,0xffff
/* 45be4: ad190000 */ sw $t9,0x0($t0)
/* 45be8: 4449f800 */ cfc1 $t1,$31
/* 45bec: 240a0001 */ addiu $t2,$zero,0x1
/* 45bf0: 44caf800 */ ctc1 $t2,$31
/* 45bf4: c7b20028 */ lwc1 $f18,0x28($sp)
/* 45bf8: 46009424 */ cvt.w.s $f16,$f18
/* 45bfc: 444af800 */ cfc1 $t2,$31
/* 45c00: 00000000 */ nop
/* 45c04: 31410004 */ andi $at,$t2,0x4
/* 45c08: 314a0078 */ andi $t2,$t2,0x78
/* 45c0c: 11400014 */ beqz $t2,.L00045c60
/* 45c10: 00000000 */ nop
/* 45c14: 3c014f00 */ lui $at,0x4f00
/* 45c18: 44818000 */ mtc1 $at,$f16
/* 45c1c: 240a0001 */ addiu $t2,$zero,0x1
/* 45c20: 46109401 */ sub.s $f16,$f18,$f16
/* 45c24: 44caf800 */ ctc1 $t2,$31
/* 45c28: 00000000 */ nop
/* 45c2c: 46008424 */ cvt.w.s $f16,$f16
/* 45c30: 444af800 */ cfc1 $t2,$31
/* 45c34: 00000000 */ nop
/* 45c38: 31410004 */ andi $at,$t2,0x4
/* 45c3c: 314a0078 */ andi $t2,$t2,0x78
/* 45c40: 15400005 */ bnez $t2,.L00045c58
/* 45c44: 00000000 */ nop
/* 45c48: 440a8000 */ mfc1 $t2,$f16
/* 45c4c: 3c018000 */ lui $at,0x8000
/* 45c50: 10000007 */ b .L00045c70
/* 45c54: 01415025 */ or $t2,$t2,$at
.L00045c58:
/* 45c58: 10000005 */ b .L00045c70
/* 45c5c: 240affff */ addiu $t2,$zero,-1
.L00045c60:
/* 45c60: 440a8000 */ mfc1 $t2,$f16
/* 45c64: 00000000 */ nop
/* 45c68: 0540fffb */ bltz $t2,.L00045c58
/* 45c6c: 00000000 */ nop
.L00045c70:
/* 45c70: 8fad0030 */ lw $t5,0x30($sp)
/* 45c74: 8fa80024 */ lw $t0,0x24($sp)
/* 45c78: 314bffff */ andi $t3,$t2,0xffff
/* 45c7c: 91ae008c */ lbu $t6,0x8c($t5)
/* 45c80: 000b6400 */ sll $t4,$t3,0x10
/* 45c84: 44c9f800 */ ctc1 $t1,$31
/* 45c88: 25cf0001 */ addiu $t7,$t6,0x1
/* 45c8c: 31f8ffff */ andi $t8,$t7,0xffff
/* 45c90: 0198c825 */ or $t9,$t4,$t8
/* 45c94: ad190004 */ sw $t9,0x4($t0)
.L00045c98:
/* 45c98: 8fa90030 */ lw $t1,0x30($sp)
/* 45c9c: 852a0092 */ lh $t2,0x92($t1)
/* 45ca0: 19400039 */ blez $t2,.L00045d88
/* 45ca4: 00000000 */ nop
/* 45ca8: 8fab0030 */ lw $t3,0x30($sp)
/* 45cac: 8d6d00b8 */ lw $t5,0xb8($t3)
/* 45cb0: 11a00006 */ beqz $t5,.L00045ccc
/* 45cb4: 00000000 */ nop
/* 45cb8: 8fa40030 */ lw $a0,0x30($sp)
/* 45cbc: 3c0546ac */ lui $a1,0x46ac
/* 45cc0: 34a54400 */ ori $a1,$a1,0x4400
/* 45cc4: 0c00ee99 */ jal func0003ba64
/* 45cc8: 24840090 */ addiu $a0,$a0,0x90
.L00045ccc:
/* 45ccc: 8fae002c */ lw $t6,0x2c($sp)
/* 45cd0: 25cf0008 */ addiu $t7,$t6,0x8
/* 45cd4: afaf002c */ sw $t7,0x2c($sp)
/* 45cd8: afae0020 */ sw $t6,0x20($sp)
/* 45cdc: 8fb80020 */ lw $t8,0x20($sp)
/* 45ce0: 3c0c0b00 */ lui $t4,0xb00
/* 45ce4: 358c0020 */ ori $t4,$t4,0x20
/* 45ce8: af0c0000 */ sw $t4,0x0($t8)
/* 45cec: 8fa40030 */ lw $a0,0x30($sp)
/* 45cf0: 0c012d20 */ jal osVirtualToPhysical
/* 45cf4: 24840098 */ addiu $a0,$a0,0x98
/* 45cf8: 8fb90020 */ lw $t9,0x20($sp)
/* 45cfc: af220004 */ sw $v0,0x4($t9)
/* 45d00: 8fa80030 */ lw $t0,0x30($sp)
/* 45d04: 24010002 */ addiu $at,$zero,0x2
/* 45d08: 8d0900b8 */ lw $t1,0xb8($t0)
/* 45d0c: 15210003 */ bne $t1,$at,.L00045d1c
/* 45d10: 00000000 */ nop
/* 45d14: 8faa0030 */ lw $t2,0x30($sp)
/* 45d18: ad4000b8 */ sw $zero,0xb8($t2)
.L00045d1c:
/* 45d1c: 8fab002c */ lw $t3,0x2c($sp)
/* 45d20: 256d0008 */ addiu $t5,$t3,0x8
/* 45d24: afad002c */ sw $t5,0x2c($sp)
/* 45d28: afab001c */ sw $t3,0x1c($sp)
/* 45d2c: 8fb80030 */ lw $t8,0x30($sp)
/* 45d30: 8fae0034 */ lw $t6,0x34($sp)
/* 45d34: 8fad001c */ lw $t5,0x1c($sp)
/* 45d38: 8f1900b8 */ lw $t9,0xb8($t8)
/* 45d3c: 85cf0000 */ lh $t7,0x0($t6)
/* 45d40: 3c010e00 */ lui $at,0xe00
/* 45d44: 332800ff */ andi $t0,$t9,0xff
/* 45d48: 00084c00 */ sll $t1,$t0,0x10
/* 45d4c: 01215025 */ or $t2,$t1,$at
/* 45d50: 31ecffff */ andi $t4,$t7,0xffff
/* 45d54: 018a5825 */ or $t3,$t4,$t2
/* 45d58: adab0000 */ sw $t3,0x0($t5)
/* 45d5c: 8fae0030 */ lw $t6,0x30($sp)
/* 45d60: 0c012d20 */ jal osVirtualToPhysical
/* 45d64: 8dc400bc */ lw $a0,0xbc($t6)
/* 45d68: 3c0100ff */ lui $at,0xff
/* 45d6c: 8fb9001c */ lw $t9,0x1c($sp)
/* 45d70: 3421ffff */ ori $at,$at,0xffff
/* 45d74: 00417824 */ and $t7,$v0,$at
/* 45d78: 01e1c024 */ and $t8,$t7,$at
/* 45d7c: af380004 */ sw $t8,0x4($t9)
/* 45d80: 8fa80030 */ lw $t0,0x30($sp)
/* 45d84: ad0000b8 */ sw $zero,0xb8($t0)
.L00045d88:
/* 45d88: 10000003 */ b .L00045d98
/* 45d8c: 8fa2002c */ lw $v0,0x2c($sp)
/* 45d90: 10000001 */ b .L00045d98
/* 45d94: 00000000 */ nop
.L00045d98:
/* 45d98: 8fbf0014 */ lw $ra,0x14($sp)
/* 45d9c: 27bd0030 */ addiu $sp,$sp,0x30
/* 45da0: 03e00008 */ jr $ra
/* 45da4: 00000000 */ nop
);
Acmd *n_alResamplePull2(N_PVoice *e, s16 *outp, s32 outCount, Acmd *p)
{
Acmd *ptr = p;
f32 sp28;
ptr = n_alResamplePull(e, outp, p);
if (e->unk8c != 0 && e->unk8c < 64) {
if (e->unk8c >= 6) {
sp28 = 26755 / sqrtf(e->unk8c + 1.0f);
} else {
sp28 = 65536 / (e->unk8c + 1.0f);
}
if (sp28 < 7723) {
sp28 = 7723;
}
n_aNoop(ptr++, *outp, sp28, e->unk8c + 1);
}
if (e->fx.unk02 > 0) {
if (e->unkb8 != 0) {
func0003ba64(&e->fx, 22050);
}
n_aLoadADPCM(ptr++, 32, osVirtualToPhysical(e->fx.unk08))
if (e->unkb8 == 2) {
e->unkb8 = 0;
}
n_aPoleFilter(ptr++, e->unkb8, *outp, 0, osVirtualToPhysical(e->unkbc) & 0xffffff);
e->unkb8 = 0;
}
return ptr;
}
s32 n_alResampleParam2(N_PVoice *filter, s32 paramID, void *param)
{
@ -218,15 +50,15 @@ s32 n_alResampleParam2(N_PVoice *filter, s32 paramID, void *param)
switch (paramID) {
case (AL_FILTER_RESET):
filter->unk92 = 0;
filter->fx.unk02 = 0;
n_alLoadParam(filter, AL_FILTER_RESET, param);
break;
case (AL_FILTER_12):
filter->unk92 = (s32) param;
filter->fx.unk02 = (s32) param;
filter->unkb8 |= 2;
break;
case (AL_FILTER_13):
filter->unk90 = *f;
filter->fx.unk00 = *f;
filter->unkb8 |= 2;
break;
case (AL_FILTER_11):

View File

@ -97,13 +97,7 @@ typedef struct N_PVoice_s {
s32 offset;
u8 unk8c;
u16 unk8e;
s16 unk90;
u16 unk92;
s32 unk94;
s32 unk98;
s32 unk9c;
s32 unka0;
s32 unka4;
struct fx fx;
s32 unka8;
s32 unkac;
s32 unkb0;