Fully matched msm (US) (#532)
This commit is contained in:
parent
ac43740d3d
commit
897ff7b281
11 changed files with 1252 additions and 55 deletions
144
src/msm/msmmus.c
144
src/msm/msmmus.c
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue