diff --git a/asm/non_matchings/unknown_003260/func_800031C0.s b/asm/non_matchings/unknown_003260/alSndPNew.s similarity index 97% rename from asm/non_matchings/unknown_003260/func_800031C0.s rename to asm/non_matchings/unknown_003260/alSndPNew.s index bf4d6d9a..f1599cad 100644 --- a/asm/non_matchings/unknown_003260/func_800031C0.s +++ b/asm/non_matchings/unknown_003260/alSndPNew.s @@ -1,8 +1,8 @@ -glabel func_800031C0 +glabel alSndPNew /* 003DC0 800031C0 27BDFFB0 */ addiu $sp, $sp, -0x50 /* 003DC4 800031C4 AFB20028 */ sw $s2, 0x28($sp) -/* 003DC8 800031C8 3C12800E */ lui $s2, %hi(D_800DC6BC) # $s2, 0x800e -/* 003DCC 800031CC 2652C6BC */ addiu $s2, %lo(D_800DC6BC) # addiu $s2, $s2, -0x3944 +/* 003DC8 800031C8 3C12800E */ lui $s2, %hi(gAlSndPlayer) # $s2, 0x800e +/* 003DCC 800031CC 2652C6BC */ addiu $s2, %lo(gAlSndPlayer) # addiu $s2, $s2, -0x3944 /* 003DD0 800031D0 AFBF002C */ sw $ra, 0x2c($sp) /* 003DD4 800031D4 AFB10024 */ sw $s1, 0x24($sp) /* 003DD8 800031D8 AFB00020 */ sw $s0, 0x20($sp) diff --git a/asm/non_matchings/unknown_003260/func_8000410C.s b/asm/non_matchings/unknown_003260/func_8000410C.s index 450fe054..159db186 100644 --- a/asm/non_matchings/unknown_003260/func_8000410C.s +++ b/asm/non_matchings/unknown_003260/func_8000410C.s @@ -6,14 +6,14 @@ glabel func_8000410C /* 004D1C 8000411C 00807025 */ move $t6, $a0 /* 004D20 80004120 31F80004 */ andi $t8, $t7, 4 /* 004D24 80004124 1300000C */ beqz $t8, .L80004158 -/* 004D28 80004128 3C19800E */ lui $t9, %hi(D_800DC6BC) # $t9, 0x800e -/* 004D2C 8000412C 8F39C6BC */ lw $t9, %lo(D_800DC6BC)($t9) +/* 004D28 80004128 3C19800E */ lui $t9, %hi(gAlSndPlayer) # $t9, 0x800e +/* 004D2C 8000412C 8F39C6BC */ lw $t9, %lo(gAlSndPlayer)($t9) /* 004D30 80004130 25C5000C */ addiu $a1, $t6, 0xc /* 004D34 80004134 8F240038 */ lw $a0, 0x38($t9) /* 004D38 80004138 0C03262C */ jal alSynStopVoice /* 004D3C 8000413C AFA5001C */ sw $a1, 0x1c($sp) -/* 004D40 80004140 3C08800E */ lui $t0, %hi(D_800DC6BC) # $t0, 0x800e -/* 004D44 80004144 8D08C6BC */ lw $t0, %lo(D_800DC6BC)($t0) +/* 004D40 80004140 3C08800E */ lui $t0, %hi(gAlSndPlayer) # $t0, 0x800e +/* 004D44 80004144 8D08C6BC */ lw $t0, %lo(gAlSndPlayer)($t0) /* 004D48 80004148 8FA5001C */ lw $a1, 0x1c($sp) /* 004D4C 8000414C 8D040038 */ lw $a0, 0x38($t0) /* 004D50 80004150 0C03264C */ jal alSynFreeVoice @@ -22,8 +22,8 @@ glabel func_8000410C /* 004D58 80004158 8FA40020 */ lw $a0, 0x20($sp) /* 004D5C 8000415C 0C001148 */ jal func_80004520 /* 004D60 80004160 00000000 */ nop -/* 004D64 80004164 3C04800E */ lui $a0, %hi(D_800DC6BC) # $a0, 0x800e -/* 004D68 80004168 8C84C6BC */ lw $a0, %lo(D_800DC6BC)($a0) +/* 004D64 80004164 3C04800E */ lui $a0, %hi(gAlSndPlayer) # $a0, 0x800e +/* 004D68 80004168 8C84C6BC */ lw $a0, %lo(gAlSndPlayer)($a0) /* 004D6C 8000416C 8FA50020 */ lw $a1, 0x20($sp) /* 004D70 80004170 3406FFFF */ li $a2, 65535 /* 004D74 80004174 0C00107F */ jal func_800041FC diff --git a/asm/non_matchings/unknown_003260/func_8000418C.s b/asm/non_matchings/unknown_003260/func_8000418C.s index a9f2f2b9..dcae67fe 100644 --- a/asm/non_matchings/unknown_003260/func_8000418C.s +++ b/asm/non_matchings/unknown_003260/func_8000418C.s @@ -9,9 +9,9 @@ glabel func_8000418C /* 004DA8 800041A8 0C032678 */ jal alCents2Ratio /* 004DAC 800041AC AFA70030 */ sw $a3, 0x30($sp) /* 004DB0 800041B0 8FA70030 */ lw $a3, 0x30($sp) -/* 004DB4 800041B4 3C04800E */ lui $a0, %hi(D_800DC6BC) # $a0, 0x800e +/* 004DB4 800041B4 3C04800E */ lui $a0, %hi(gAlSndPlayer) # $a0, 0x800e /* 004DB8 800041B8 C4E4002C */ lwc1 $f4, 0x2c($a3) -/* 004DBC 800041BC 8C84C6BC */ lw $a0, %lo(D_800DC6BC)($a0) +/* 004DBC 800041BC 8C84C6BC */ lw $a0, %lo(gAlSndPlayer)($a0) /* 004DC0 800041C0 46040182 */ mul.s $f6, $f0, $f4 /* 004DC4 800041C4 24180010 */ li $t8, 16 /* 004DC8 800041C8 A7B80020 */ sh $t8, 0x20($sp) diff --git a/asm/non_matchings/unknown_003260/func_80004668.s b/asm/non_matchings/unknown_003260/func_80004668.s index 65a14e94..12890277 100644 --- a/asm/non_matchings/unknown_003260/func_80004668.s +++ b/asm/non_matchings/unknown_003260/func_80004668.s @@ -24,9 +24,9 @@ glabel func_80004668 /* 0052C0 800046C0 10000066 */ b .L8000485C /* 0052C4 800046C4 00001025 */ move $v0, $zero .L800046C8: -/* 0052C8 800046C8 3C15800E */ lui $s5, %hi(D_800DC6BC) # $s5, 0x800e +/* 0052C8 800046C8 3C15800E */ lui $s5, %hi(gAlSndPlayer) # $s5, 0x800e /* 0052CC 800046CC 8FB30064 */ lw $s3, 0x64($sp) -/* 0052D0 800046D0 26B5C6BC */ addiu $s5, %lo(D_800DC6BC) # addiu $s5, $s5, -0x3944 +/* 0052D0 800046D0 26B5C6BC */ addiu $s5, %lo(gAlSndPlayer) # addiu $s5, $s5, -0x3944 /* 0052D4 800046D4 AFA40080 */ sw $a0, 0x80($sp) /* 0052D8 800046D8 27B60050 */ addiu $s6, $sp, 0x50 /* 0052DC 800046DC 8FA40080 */ lw $a0, 0x80($sp) diff --git a/asm/non_matchings/unknown_003260/func_800048D8.s b/asm/non_matchings/unknown_003260/func_800048D8.s index 9a0fffb1..6cca2e43 100644 --- a/asm/non_matchings/unknown_003260/func_800048D8.s +++ b/asm/non_matchings/unknown_003260/func_800048D8.s @@ -15,8 +15,8 @@ glabel func_800048D8 /* 00550C 8000490C AFA2004C */ sw $v0, 0x4c($sp) /* 005510 80004910 12000016 */ beqz $s0, .L8000496C /* 005514 80004914 02408825 */ move $s1, $s2 -/* 005518 80004918 3C13800E */ lui $s3, %hi(D_800DC6BC) # $s3, 0x800e -/* 00551C 8000491C 2673C6BC */ addiu $s3, %lo(D_800DC6BC) # addiu $s3, $s3, -0x3944 +/* 005518 80004918 3C13800E */ lui $s3, %hi(gAlSndPlayer) # $s3, 0x800e +/* 00551C 8000491C 2673C6BC */ addiu $s3, %lo(gAlSndPlayer) # addiu $s3, $s3, -0x3944 /* 005520 80004920 27B4003C */ addiu $s4, $sp, 0x3c /* 005524 80004924 2412FFEF */ li $s2, -17 /* 005528 80004928 240E0400 */ li $t6, 1024 diff --git a/asm/non_matchings/unknown_003260/func_800049F8.s b/asm/non_matchings/unknown_003260/func_800049F8.s deleted file mode 100644 index 32a90b80..00000000 --- a/asm/non_matchings/unknown_003260/func_800049F8.s +++ /dev/null @@ -1,21 +0,0 @@ -glabel func_800049F8 -/* 0055F8 800049F8 27BDFFD8 */ addiu $sp, $sp, -0x28 -/* 0055FC 800049FC AFBF0014 */ sw $ra, 0x14($sp) -/* 005600 80004A00 AFA5002C */ sw $a1, 0x2c($sp) -/* 005604 80004A04 A7A50018 */ sh $a1, 0x18($sp) -/* 005608 80004A08 AFA4001C */ sw $a0, 0x1c($sp) -/* 00560C 80004A0C 10800007 */ beqz $a0, .L80004A2C -/* 005610 80004A10 AFA60020 */ sw $a2, 0x20($sp) -/* 005614 80004A14 3C04800E */ lui $a0, %hi(D_800DC6BC) # $a0, 0x800e -/* 005618 80004A18 8C84C6BC */ lw $a0, %lo(D_800DC6BC)($a0) -/* 00561C 80004A1C 27A50018 */ addiu $a1, $sp, 0x18 -/* 005620 80004A20 00003025 */ move $a2, $zero -/* 005624 80004A24 0C03246B */ jal alEvtqPostEvent -/* 005628 80004A28 24840014 */ addiu $a0, $a0, 0x14 -.L80004A2C: -/* 00562C 80004A2C 8FBF0014 */ lw $ra, 0x14($sp) -/* 005630 80004A30 27BD0028 */ addiu $sp, $sp, 0x28 -/* 005634 80004A34 03E00008 */ jr $ra -/* 005638 80004A38 00000000 */ nop - - diff --git a/asm/non_matchings/unknown_003260/func_80004A60.s b/asm/non_matchings/unknown_003260/func_80004A60.s index 8187c848..4383764f 100644 --- a/asm/non_matchings/unknown_003260/func_80004A60.s +++ b/asm/non_matchings/unknown_003260/func_80004A60.s @@ -21,8 +21,8 @@ glabel func_80004A60 /* 0056AC 80004AAC 12000017 */ beqz $s0, .L80004B0C /* 0056B0 80004AB0 A7110000 */ sh $s1, ($t8) /* 0056B4 80004AB4 02408825 */ move $s1, $s2 -/* 0056B8 80004AB8 3C12800E */ lui $s2, %hi(D_800DC6BC) # $s2, 0x800e -/* 0056BC 80004ABC 2652C6BC */ addiu $s2, %lo(D_800DC6BC) # addiu $s2, $s2, -0x3944 +/* 0056B8 80004AB8 3C12800E */ lui $s2, %hi(gAlSndPlayer) # $s2, 0x800e +/* 0056BC 80004ABC 2652C6BC */ addiu $s2, %lo(gAlSndPlayer) # addiu $s2, $s2, -0x3944 /* 0056C0 80004AC0 27B3002C */ addiu $s3, $sp, 0x2c .L80004AC4: /* 0056C4 80004AC4 8E190008 */ lw $t9, 8($s0) diff --git a/data/dkr.data.s b/data/dkr.data.s index 600a36fc..6ff531b3 100644 --- a/data/dkr.data.s +++ b/data/dkr.data.s @@ -95,7 +95,7 @@ glabel D_800DC6B4 glabel D_800DC6B8 .word 0x00000000 -glabel D_800DC6BC +glabel gAlSndPlayer .word 0x80119BD0 glabel sfxVolumeSlider diff --git a/src/unknown_001050.c b/src/unknown_001050.c index 2db7359a..592c56d0 100644 --- a/src/unknown_001050.c +++ b/src/unknown_001050.c @@ -178,7 +178,7 @@ void audio_init(u32 arg0){ audConfig.maxChannels = 16; audConfig.unk10 = 1; audConfig.hp = &gALHeap; - func_800031C0(&audConfig); + alSndPNew(&audConfig); audioStartThread(); func_80000968(0); func_80071140(reg_s2); diff --git a/src/unknown_003260.c b/src/unknown_003260.c index 7095b6d2..75d40d5a 100644 --- a/src/unknown_003260.c +++ b/src/unknown_003260.c @@ -9,14 +9,35 @@ extern void func_80002A98(void*); extern u32 D_80003008; +typedef struct unk800DC6BC_40 { + ALLink node; + u8 pad0C[0x38]; +} unk800DC6BC_40; //ALSoundState + +typedef union { + ALEvent msg; + + struct{ + s16 type; + void* state; + u32 unk04; + }snd_event; + +}ALSndpEvent; + /* Unknown Size */ typedef struct unk800DC6BC { - ALPlayer node; - ALEventQueue evtq; - u8 pad18[0x1C]; - s32 unk44; - s32 unk48; -} unk800DC6BC; + ALPlayer node; + ALEventQueue evtq; + ALEvent nextEvent; + ALSynth *drvr; + u32 unk3C; + unk800DC6BC_40 *unk40; + s32 unk44; + s32 unk48; + s32 frameTime; + ALMicroTime nextDelta; +} unk800DC6BC; //ALSndPlayer typedef struct unk80119240 { @@ -34,7 +55,7 @@ typedef struct unk80119240 */ extern u32 D_800DC6A0; //extern unk800DC6B0* D_800DC6B0; -extern unk800DC6BC* D_800DC6BC; +extern unk800DC6BC* gAlSndPlayer; extern s32 sfxVolumeSlider; extern s32 D_80115F90; extern ALHeap* D_80115F94; @@ -131,14 +152,64 @@ s32 sfxGetVolumeSlider(void) { } void func_8000318C(s32 arg0) { - if (D_800DC6BC->unk44 >= arg0) { - D_800DC6BC->unk48 = arg0; + if (gAlSndPlayer->unk44 >= arg0) { + gAlSndPlayer->unk48 = arg0; } else { - D_800DC6BC->unk48 = D_800DC6BC->unk44; + gAlSndPlayer->unk48 = gAlSndPlayer->unk44; } } -GLOBAL_ASM("asm/non_matchings/unknown_003260/func_800031C0.s") +#if 1 //BAD Regalloc in first for loop +GLOBAL_ASM("asm/non_matchings/unknown_003260/alSndPNew.s") +#else +typedef struct audioMgrConfig_s{ + u32 unk00; + u32 unk04; + u32 maxChannels; + ALHeap* hp; + u16 unk10; +} audioMgrConfig; + +extern unk800DC6BC_40* D_800DC6B8; + +ALMicroTime _sndpVoiceHandler(void *node); + +void alSndPNew(audioMgrConfig* c){ + s32 i; + unk800DC6BC_40* tmp1; + ALEvent sp_38; + + gAlSndPlayer->unk44 = c->maxChannels; + gAlSndPlayer->unk48 = c->maxChannels; + gAlSndPlayer->unk3C = 0; + gAlSndPlayer->frameTime = 33000; + gAlSndPlayer->unk40 = (unk800DC6BC_40 *) alHeapDBAlloc(0, 0, c->hp, 1, (c->unk00) << 6); + alEvtqNew(&(gAlSndPlayer->evtq), alHeapDBAlloc(0,0,c->hp,1, (c->unk04)*28), c->unk04); + D_800DC6B8 = gAlSndPlayer->unk40; + for (i=1; i < c->unk00; i++){ + //bad regalloc + tmp1 = &(gAlSndPlayer->unk40[i]); + alLink(tmp1, tmp1 - 1); + } + + D_80119C28 = alHeapDBAlloc(0,0,c->hp, 2, c->unk10); + for (i=0; i < c->unk10; i++){ + D_80119C28[i] = 32767; + } + + + gAlSndPlayer->drvr = alGlobals; + gAlSndPlayer->node.next = NULL; + gAlSndPlayer->node.handler = &_sndpVoiceHandler; + gAlSndPlayer->node.clientData = gAlSndPlayer; + + alSynAddPlayer(gAlSndPlayer->drvr, gAlSndPlayer); + sp_38.type = 32; + alEvtqPostEvent(&(gAlSndPlayer->evtq), &sp_38, gAlSndPlayer->frameTime); + gAlSndPlayer->nextDelta = alEvtqNextEvent(&(gAlSndPlayer->evtq), &(gAlSndPlayer->nextEvent)); +} +#endif + GLOBAL_ASM("asm/non_matchings/unknown_003260/_sndpVoiceHandler.s") GLOBAL_ASM("asm/non_matchings/unknown_003260/_handleEvent.s") GLOBAL_ASM("asm/non_matchings/unknown_003260/func_8000410C.s") @@ -182,7 +253,7 @@ void func_8000488C(u8* arg0){ ((u32*)(&sp_18))[1] = (u32) arg0; if(arg0){ arg0[0x3e] &= ~(1<<4); - alEvtqPostEvent(&(D_800DC6BC->evtq), &sp_18, 0); + alEvtqPostEvent(&(gAlSndPlayer->evtq), &sp_18, 0); } } GLOBAL_ASM("asm/non_matchings/unknown_003260/func_800048D8.s") @@ -192,8 +263,16 @@ void func_800049D8(void) { } +void func_800049F8(void * sndState,s16 type, u32 arg2){ + ALSndpEvent sp_18; + sp_18.snd_event.type = type; + sp_18.snd_event.state = sndState; + sp_18.snd_event.unk04 = arg2; + if(sndState){ + alEvtqPostEvent(&(gAlSndPlayer->evtq), &sp_18,0); + } -GLOBAL_ASM("asm/non_matchings/unknown_003260/func_800049F8.s") +} u16 func_80004A3C(u8 arg0){ return D_80119C28[arg0]; diff --git a/undefined_syms.txt b/undefined_syms.txt index 7da012ee..842860ec 100755 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -98,7 +98,7 @@ D_800DC6A0 = 0x800DC6A0; D_800DC6B0 = 0x800DC6B0; D_800DC6B4 = 0x800DC6B4; D_800DC6B8 = 0x800DC6B8; -D_800DC6BC = 0x800DC6BC; +gAlSndPlayer = 0x800DC6BC; sfxVolumeSlider = 0x800DC6C0; D_800DC6C4 = 0x800DC6C4; D_800DC6D0 = 0x800DC6D0;