Fully matched msm (US) (#532)

This commit is contained in:
mrshigure 2025-01-15 05:49:34 -08:00 committed by GitHub
parent ac43740d3d
commit 897ff7b281
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 1252 additions and 55 deletions

View file

@ -1,4 +1,5 @@
#include "msm/msmmus.h"
#include "msm/msmmem.h"
typedef struct {
/* 0x00 */ s16 unk00;
@ -51,6 +52,11 @@ typedef struct {
/* 0x01C */ char unk70[0x108];
} msmMusStruct02; // Size 0x178
typedef struct {
/* 0x00 */ char unk00[0xC];
/* 0x0C */ s32 unk0C;
} UnkGroupDataPtr; // Size unknown
static msmMusStruct02 mus;
static void msmMusPauseSub(msmMusStruct00* arg0, BOOL pause, s32 speed) {
@ -199,13 +205,11 @@ s32 msmMusGetMidiCtrl(int musNo, s32 channel, s32 ctrl) {
}
s32 msmMusGetNumPlay(BOOL baseGrp) {
msmMusStruct02* mus_ptr = &mus;
switch (baseGrp) {
case FALSE:
return mus_ptr->unk03 + mus_ptr->unk04;
return mus.unk03 + mus.unk04;
default:
return mus_ptr->unk03;
return mus.unk03;
}
}
@ -227,7 +231,7 @@ s32 msmMusSetParam(s32 arg0, MSM_MUSPARAM* arg1) {
return MSM_ERR_OUTOFMUS;
}
temp_r31 = &mus.unk18[arg0];
if (arg1->flag & 2) {
if (arg1->flag & MSM_MUSPARAM_VOL) {
temp_r31->unk2C = arg1->fadeSpeed / 15;
if (temp_r31->unk2C != 0) {
temp_r31->unk05 = 1;
@ -240,7 +244,7 @@ s32 msmMusSetParam(s32 arg0, MSM_MUSPARAM* arg1) {
sndSeqVolume(temp_r31->unk02 * temp_r31->unk03 * temp_r31->unk1C * temp_r31->unk28 / 2048383, 0, temp_r31->unk08, 0);
}
}
if (arg1->flag & 0x10) {
if (arg1->flag & MSM_MUSPARAM_SPEED) {
sndSeqSpeed(temp_r31->unk08, (arg1->speed << 8) / 100);
}
return 0;
@ -335,8 +339,128 @@ s32 msmMusStop(int musNo, s32 speed) {
return 0;
}
// TODO: https://decomp.me/scratch/PGpbJ
// msmMusPlay
int msmMusPlay(int musId, MSM_MUSPARAM* musParam) {
s32 var_r30;
int var_r29;
s32 temp_r3_3;
UnkGroupDataPtr* temp_r3_2;
msmMusStruct01* temp_r28;
msmMusStruct00* temp_r27;
DVDFileInfo sp10;
// TODO: https://decomp.me/scratch/24daZ
// msmMusInit
if (musId < 0 || musId >= mus.unk00) {
return MSM_ERR_INVALIDID;
}
temp_r28 = &mus.unk0C[musId];
if (temp_r28->unk00 == 0xFFFF) {
return MSM_ERR_REMOVEDID;
}
if (msmSysCheckLoadGroupID(temp_r28->unk00) == 0) {
return MSM_ERR_GRP_NOTLOADED;
}
var_r30 = (musParam != NULL) ? musParam->flag : 0;
var_r29 = (var_r30 & MSM_MUSPARAM_CHAN) ? musParam->chan : 0;
if (var_r29 < 0 || var_r29 >= mus.unk02) {
return MSM_ERR_OUTOFMUS;
}
temp_r27 = &mus.unk18[var_r29];
if (temp_r27->unk04 != 0) {
sndSeqStop(temp_r27->unk08);
}
if (temp_r28->unk0C < 0) {
if (temp_r27->unk00 != musId) {
if (msmFioOpen(mus.unk08, &sp10) != 1) {
return MSM_ERR_OPENFAIL;
}
if (msmFioRead(&sp10, temp_r27->unk0C, temp_r28->unk08, temp_r28->unk04 + mus.unk10) < 0) {
msmFioClose(&sp10);
return MSM_ERR_READFAIL;
}
msmFioClose(&sp10);
temp_r27->unk10 = temp_r27->unk0C;
}
} else {
temp_r3_2 = msmSysGetGroupDataPtr(temp_r28->unk0C);
if (temp_r3_2 == NULL) {
return MSM_ERR_MUSGRP_NOTLOADED;
}
temp_r27->unk10 = (void*) ((u32) temp_r3_2 + temp_r3_2->unk0C + temp_r28->unk04);
}
temp_r27->unk05 = 1;
temp_r27->unk03 = temp_r28->unk0D;
temp_r27->unk2C = 0;
temp_r27->unk20 = 0;
temp_r27->unk14 = 0;
temp_r27->unk28 = 0x7F;
temp_r27->unk1C = 0x7F;
temp_r27->unk38.flags = 4;
temp_r27->unk38.volume.time = 0;
temp_r27->unk02 = (var_r30 & MSM_MUSPARAM_VOL) ? musParam->vol : 0x7F;
temp_r27->unk38.volume.target = temp_r27->unk03 * temp_r27->unk1C * temp_r27->unk02 / 16129;
if (var_r30 & MSM_MUSPARAM_PAUSE) {
temp_r27->unk38.flags |= 0x10;
}
if (var_r30 & MSM_MUSPARAM_SPEED) {
temp_r27->unk38.flags |= 2;
temp_r27->unk38.speed = musParam->speed * 256 / 100;
}
if (var_r30 & MSM_MUSPARAM_FADESPEED) {
temp_r27->unk14 = -(musParam->fadeSpeed / 15);
if (temp_r27->unk14 != 0) {
temp_r27->unk18 = 0;
temp_r27->unk1C = 0;
temp_r27->unk38.volume.target = 0;
}
}
temp_r3_3 = sndSeqPlayEx(temp_r28->unk00, temp_r28->unk02, temp_r27->unk10, &temp_r27->unk38, 0);
if (temp_r3_3 == SND_ID_ERROR) {
temp_r27->unk05 = 0;
return MSM_ERR_PLAYFAIL;
}
temp_r27->unk08 = temp_r3_3;
temp_r27->unk00 = musId;
temp_r27->unk04 = (temp_r27->unk38.flags & 0x10) ? 3 : 2;
temp_r27->unk05 = 0;
return var_r29;
}
s32 msmMusInit(sysData* arg0, DVDFileInfo* arg1) {
s32 temp_r4;
s32 var_r8;
mus.unk00 = 0;
mus.unk02 = 0;
mus.unk04 = 0;
mus.unk03 = 0;
if (arg0->unk10->unk4 == 0) {
return 0;
}
temp_r4 = arg0->unkC->unk2C;
if (temp_r4 == 0) {
return 0;
}
if ((mus.unk0C = msmMemAlloc(temp_r4)) == NULL) {
return MSM_ERR_OUTOFMEM;
}
if (msmFioRead(arg1, mus.unk0C, arg0->unkC->unk2C, arg0->unkC->unk28) < 0) {
return MSM_ERR_READFAIL;
}
temp_r4 = arg0->unk10->unk20;
if (temp_r4 != 0) {
if ((mus.unk14 = msmMemAlloc(temp_r4 * arg0->unk10->unk8)) == NULL) {
return MSM_ERR_OUTOFMEM;
}
} else {
mus.unk14 = NULL;
}
mus.unk00 = arg0->unk10->unk4;
mus.unk02 = arg0->unk10->unk8;
mus.unk10 = arg0->unkC->unk48;
mus.unk08 = arg0->unk0;
for (var_r8 = 0; var_r8 < mus.unk02; var_r8++) {
mus.unk18[var_r8].unk0C = (void*) ((u32) mus.unk14 + arg0->unk10->unk20 * var_r8);
mus.unk18[var_r8].unk00 = -1;
mus.unk18[var_r8].unk05 = 0;
}
return 0;
}