diff --git a/src/game/music.c b/src/game/music.c index 2536803db..623556fee 100644 --- a/src/game/music.c +++ b/src/game/music.c @@ -57,12 +57,12 @@ const char var7f1b20b8nb[] = "musicStartWatch start\n"; const char var7f1b20d0nb[] = "musicEndWatch start\n"; const char var7f1b20e8nb[] = "musicEndWatch end\n"; const char var7f1b20fcnb[] = "musicStartDead\n"; -const char var7f1b210cnb[] = "musicStartTemporaryAmbient\n"; +const char var7f1b210cnb[] = "musicStartTemporary\n"; const char var7f1b2124nb[] = "musicEndTemporary\n"; const char var7f1b2138nb[] = "musicStartCutscene\n"; const char var7f1b214cnb[] = "musicEndCutscene\n"; const char var7f1b2160nb[] = "musicStartAmbient : Tune=%d\n"; -const char var7f1b2180nb[] = "musicEndTemporaryAmbient\n"; +const char var7f1b2180nb[] = "musicEndAmbient\n"; #endif char *var80084100[] = { @@ -114,7 +114,7 @@ void musicSetVolume(u16 volume) for (i = 0; i < ARRAYCOUNT(var800aaa38); i++) { if (var800aaa38[i].tracktype != TRACKTYPE_NONE && var800aaa38[i].tracktype != TRACKTYPE_AMBIENT) { - sndSetMusicChannelVolume(&var80094ed8[i], volume); + seqSetVolume(&g_SeqInstances[i], volume); } } diff --git a/src/include/bss.h b/src/include/bss.h index 92fddd426..c5af9f5cd 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -34,7 +34,7 @@ extern u32 var80090b08; extern AMAudioMgr g_AudioManager; extern Mtx *var80092870; extern s32 g_SndMaxFxBusses; -extern struct var80094ed8 var80094ed8[3]; +extern struct seqinstance g_SeqInstances[3]; extern ALHeap g_SndHeap; extern u32 var80095200; extern struct var80095210 var80095210; diff --git a/src/include/lib/lib_39be0.h b/src/include/lib/lib_39be0.h index 0c25c26ce..e475b0f90 100644 --- a/src/include/lib/lib_39be0.h +++ b/src/include/lib/lib_39be0.h @@ -4,7 +4,7 @@ #include "data.h" #include "types.h" -u32 func00039be0(void); -u32 func00039c30(void); +void func00039be0(N_ALCSPlayer *seqp, void *arg1); +void func00039c30(N_ALCSPlayer *seqp); #endif diff --git a/src/include/lib/snd.h b/src/include/lib/snd.h index 86589c0f1..1295a7344 100644 --- a/src/include/lib/snd.h +++ b/src/include/lib/snd.h @@ -19,13 +19,13 @@ u32 snd0000f0d4(void); u32 snd0000f228(void); void sndSetSoundMode(s32 mode); u32 snd0000f49c(void); -void snd0000f67c(struct var80094ed8 *arg0); +void seqInit(struct seqinstance *seq); void sndInit(void); bool sndIsMp3(u16 soundnum); bool snd0000fbc4(s16 arg0); -bool snd0000fc48(struct var80094ed8 *arg0, s32 tracknum); -u16 sndGetMusicChannelVolume(struct var80094ed8 *arg0); -void sndSetMusicChannelVolume(struct var80094ed8 *arg0, u16 volume); +bool seqPlay(struct seqinstance *seq, s32 tracknum); +u16 seqGetVolume(struct seqinstance *seq); +void seqSetVolume(struct seqinstance *seq, u16 volume); void snd0000fe18(void); void snd0000fe20(void); void snd0000fe50(void); diff --git a/src/include/types.h b/src/include/types.h index c0195373a..a8e269222 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -6194,73 +6194,12 @@ struct var800aaa38 { u32 unk0c; }; -struct var80094ed8 { - /*0x000*/ u32 unk000; - /*0x004*/ u32 unk004; - /*0x008*/ u32 unk008; - /*0x00c*/ u32 unk00c; - /*0x010*/ u32 unk010; - /*0x014*/ u32 unk014; - /*0x018*/ u32 unk018; - /*0x01c*/ u32 unk01c; - /*0x020*/ u32 unk020; - /*0x024*/ u32 unk024; - /*0x028*/ u32 unk028; - /*0x02c*/ u32 unk02c; - /*0x030*/ u32 unk030; - /*0x034*/ u32 unk034; - /*0x038*/ u32 unk038; - /*0x03c*/ u32 unk03c; - /*0x040*/ u32 unk040; - /*0x044*/ u32 unk044; - /*0x048*/ u32 unk048; - /*0x04c*/ u32 unk04c; - /*0x050*/ u32 unk050; - /*0x054*/ u32 unk054; - /*0x058*/ u32 unk058; - /*0x05c*/ u32 unk05c; - /*0x060*/ u32 unk060; - /*0x064*/ u32 unk064; - /*0x068*/ u32 unk068; - /*0x06c*/ u32 unk06c; - /*0x070*/ u32 unk070; - /*0x074*/ u32 unk074; - /*0x078*/ u32 unk078; - /*0x07c*/ u32 unk07c; - /*0x080*/ u32 unk080; - /*0x084*/ u32 unk084; - /*0x088*/ u32 unk088; - /*0x08c*/ u32 unk08c; - /*0x090*/ u32 unk090; - /*0x094*/ u32 unk094; - /*0x098*/ u32 unk098; - /*0x09c*/ u32 unk09c; - /*0x0a0*/ u32 unk0a0; - /*0x0a4*/ u32 unk0a4; - /*0x0a8*/ u32 unk0a8; - /*0x0ac*/ u32 unk0ac; - /*0x0b0*/ u32 unk0b0; - /*0x0b4*/ u32 unk0b4; - /*0x0b8*/ u32 unk0b8; - /*0x0bc*/ u32 unk0bc; - /*0x0c0*/ u32 unk0c0; - /*0x0c4*/ u32 unk0c4; - /*0x0c8*/ u32 unk0c8; - /*0x0cc*/ u32 unk0cc; - /*0x0d0*/ u32 unk0d0; - /*0x0d4*/ u32 unk0d4; - /*0x0d8*/ u32 unk0d8; - /*0x0dc*/ u32 unk0dc; - /*0x0e0*/ u32 unk0e0; - /*0x0e4*/ u32 unk0e4; - /*0x0e8*/ u32 unk0e8; - /*0x0ec*/ u32 unk0ec; - /*0x0f0*/ u32 unk0f0; - /*0x0f4*/ u32 unk0f4; +struct seqinstance { + /*0x000*/ ALCSeq seq; /*0x0f8*/ N_ALCSPlayer *seqp; - /*0x0fc*/ void *unk0fc; + /*0x0fc*/ u8 *data; /*0x100*/ u16 volume; - /*0x104*/ u32 unk104; + /*0x104*/ s32 tracknum; }; struct lasersight { @@ -7026,7 +6965,7 @@ struct handweaponinfo { }; struct seqtableentry { - u8 *data; + u32 romaddr; u16 binlen; u16 ziplen; }; diff --git a/src/lib/music.c b/src/lib/music.c index f8c8a02be..daaffd13d 100644 --- a/src/lib/music.c +++ b/src/lib/music.c @@ -51,11 +51,11 @@ s32 musicHandlePlayEvent(struct musicevent *event, s32 result) // Check if this tracktype is currently in use. If it is then that's // an error - the caller should have stopped the existing track first. for (i = 0; i < 3; i++) { - if (event->tracktype == var800aaa38[i].tracktype && n_alCSPGetState(var80094ed8[i].seqp) == AL_PLAYING) { + if (event->tracktype == var800aaa38[i].tracktype && n_alCSPGetState(g_SeqInstances[i].seqp) == AL_PLAYING) { value = event->tracktype == TRACKTYPE_AMBIENT ? 24 : 32; for (j = 0; j < 16; j++) { - func00039e5c(var80094ed8[i].seqp, j, 0xff, value); + func00039e5c(g_SeqInstances[i].seqp, j, 0xff, value); osSyncPrintf("MUSIC(Play) : Unpaused midi channel %d for state %d\n", j, event->tracktype); } @@ -71,11 +71,11 @@ s32 musicHandlePlayEvent(struct musicevent *event, s32 result) if (result == RESULT_FAIL) { // Find an unused channel for (i = 0; i < 3; i++) { - if (n_alCSPGetState(var80094ed8[i].seqp) == AL_STOPPED) { + if (n_alCSPGetState(g_SeqInstances[i].seqp) == AL_STOPPED) { osSyncPrintf("MUSIC(Play) : Starting, Guid=%u, Midi=%d, Tune=%d\n", event->id, 0, event->tracktype); - if (snd0000fc48(&var80094ed8[i], event->tracknum)) { - sndSetMusicChannelVolume(&var80094ed8[i], event->volume); + if (seqPlay(&g_SeqInstances[i], event->tracknum)) { + seqSetVolume(&g_SeqInstances[i], event->volume); var800aaa38[i].tracktype = event->tracktype; var800aaa38[i].unk04 = 1; @@ -95,7 +95,7 @@ s32 musicHandlePlayEvent(struct musicevent *event, s32 result) for (i = 0; i < 3; i++) { if ((var800aaa38[i].tracktype == TRACKTYPE_NONE || event->tracktype == var800aaa38[i].tracktype) - && n_alCSPGetState(var80094ed8[i].seqp) != AL_STOPPED) { + && n_alCSPGetState(g_SeqInstances[i].seqp) != AL_STOPPED) { index = i; osSyncPrintf("MUSIC(Play) : About to dump the fading channel %d as a same state play request is waiting\n", index); break; @@ -106,7 +106,7 @@ s32 musicHandlePlayEvent(struct musicevent *event, s32 result) if (event->failcount >= 3) { for (i = 0; i < 3; i++) { if (var800aaa38[i].tracktype == TRACKTYPE_AMBIENT - && n_alCSPGetState(var80094ed8[i].seqp) != AL_STOPPED) { + && n_alCSPGetState(g_SeqInstances[i].seqp) != AL_STOPPED) { index = i; osSyncPrintf("MUSIC(Play) : About to dump the ambience channel %d\n", index); osSyncPrintf("MUSIC(Play) : Reason : A play request is waiting - State = %d\n", event->tracktype); @@ -117,7 +117,7 @@ s32 musicHandlePlayEvent(struct musicevent *event, s32 result) } if (index != -1) { - n_alSeqpStop((N_ALSeqPlayer *)var80094ed8[index].seqp); + n_alSeqpStop((N_ALSeqPlayer *)g_SeqInstances[index].seqp); var800aaa38[index].tracktype = TRACKTYPE_NONE; var800aaa38[index].unk04 = 0; @@ -151,7 +151,7 @@ s32 musicHandleStopEvent(struct musicevent *event, s32 result) for (i = 0; i < 3; i++) { if (event->tracktype == var800aaa38[i].tracktype) { - n_alSeqpStop((N_ALSeqPlayer *)var80094ed8[i].seqp); + n_alSeqpStop((N_ALSeqPlayer *)g_SeqInstances[i].seqp); var800aaa38[i].tracktype = TRACKTYPE_NONE; var800aaa38[i].unk04 = 0; @@ -173,12 +173,12 @@ s32 musicHandleFadeEvent(struct musicevent *event, s32 result) for (i = 0; i < 3; i++) { if (event->tracktype == var800aaa38[i].tracktype && var800aaa38[i].unk04 != 0) { for (j = 0; j < 16; j++) { - func00039e5c(var80094ed8[i].seqp, j, var70053ca0[event->tracktype], 32); + func00039e5c(g_SeqInstances[i].seqp, j, var70053ca0[event->tracktype], 32); } var800aaa38[i].unk04 = event->fadetopause; var800aaa38[i].unk08 = event->fadetopause; - var800aaa38[i].unk0c = var80094ed8[i].seqp->chanState[0].unk0d; + var800aaa38[i].unk0c = g_SeqInstances[i].seqp->chanState[0].unk0d; } } @@ -190,7 +190,7 @@ s32 musicHandleStopAllEvent(s32 result) s32 i; for (i = 0; i < 3; i++) { - n_alSeqpStop((N_ALSeqPlayer *)var80094ed8[i].seqp); + n_alSeqpStop((N_ALSeqPlayer *)g_SeqInstances[i].seqp); var800aaa38[i].tracktype = 0; var800aaa38[i].unk04 = 0; @@ -245,8 +245,8 @@ glabel var70053fec /* 11950: 0311c021 */ addu $t8,$t8,$s1 /* 11954: 15e00023 */ bnez $t7,.L000119e4 /* 11958: 0018c0c0 */ sll $t8,$t8,0x3 -/* 1195c: 3c198009 */ lui $t9,%hi(var80094ed8) -/* 11960: 27394ed8 */ addiu $t9,$t9,%lo(var80094ed8) +/* 1195c: 3c198009 */ lui $t9,%hi(g_SeqInstances) +/* 11960: 27394ed8 */ addiu $t9,$t9,%lo(g_SeqInstances) /* 11964: 03191821 */ addu $v1,$t8,$t9 /* 11968: 8c6400f8 */ lw $a0,0xf8($v1) /* 1196c: 0c00e344 */ jal n_alCSPGetState @@ -878,16 +878,16 @@ glabel musicTickEvents // if (g_MusicEventQueueLength); // // for (i = 0; i < 3; i++) { -// if (var800aaa38[i].unk04 == 0 && n_alCSPGetState(var80094ed8[i].seqp) == AL_PLAYING) { -// if (var80094ed8[i].seqp->chanState[0].unk0d <= var70053ca0[var800aaa38[i].tracktype]) { -// n_alSeqpStop((N_ALSeqPlayer *)var80094ed8[i].seqp); +// if (var800aaa38[i].unk04 == 0 && n_alCSPGetState(g_SeqInstances[i].seqp) == AL_PLAYING) { +// if (g_SeqInstances[i].seqp->chanState[0].unk0d <= var70053ca0[var800aaa38[i].tracktype]) { +// n_alSeqpStop((N_ALSeqPlayer *)g_SeqInstances[i].seqp); // // var800aaa38[i].tracktype = TRACKTYPE_NONE; // var800aaa38[i].unk04 = 0; // var800aaa38[i].unk08 = 0; // var800aaa38[i].unk0c = 0; -// } else if (var80094ed8[i].seqp->chanState[0].unk0d == var800aaa38[i].unk0c) { -// n_alSeqpStop((N_ALSeqPlayer *)var80094ed8[i].seqp); +// } else if (g_SeqInstances[i].seqp->chanState[0].unk0d == var800aaa38[i].unk0c) { +// n_alSeqpStop((N_ALSeqPlayer *)g_SeqInstances[i].seqp); // // var800aaa38[i].tracktype = TRACKTYPE_NONE; // var800aaa38[i].unk04 = 0; @@ -1140,7 +1140,7 @@ bool musicIsTrackTypePlaying(s32 tracktype) s32 i; for (i = 0; i < 3; i++) { - if (tracktype == var800aaa38[i].tracktype && n_alCSPGetState(var80094ed8[i].seqp) == AL_PLAYING) { + if (tracktype == var800aaa38[i].tracktype && n_alCSPGetState(g_SeqInstances[i].seqp) == AL_PLAYING) { return true; } } diff --git a/src/lib/snd.c b/src/lib/snd.c index f1feb3a1a..207820da3 100644 --- a/src/lib/snd.c +++ b/src/lib/snd.c @@ -41,12 +41,12 @@ struct var80094eb0 var80094eb0; u32 var80094ecc; u32 var80094ed0; u32 var80094ed4; -struct var80094ed8 var80094ed8[3]; +struct seqinstance g_SeqInstances[3]; ALHeap g_SndHeap; u32 var80095200; ALBank *var80095204; struct seqtable *g_SeqTable; -u32 var8009520c; +u32 g_SeqBufferSize; struct var80095210 var80095210; u8 var800952a0[0x4060]; @@ -2180,7 +2180,7 @@ glabel snd0000f49c ); #endif -void snd0000f67c(struct var80094ed8 *arg0) +void seqInit(struct seqinstance *seq) { u32 stack; ALSeqpConfig config; @@ -2194,17 +2194,17 @@ void snd0000f67c(struct var80094ed8 *arg0) func00030c98(&config); if (IS4MB()) { - var8009520c = 0x3800; + g_SeqBufferSize = 0x3800; } else { - var8009520c = 0x4800; + g_SeqBufferSize = 0x4800; } - arg0->unk0fc = alHeapAlloc(&g_SndHeap, 1, var8009520c); - arg0->seqp = alHeapAlloc(&g_SndHeap, 1, sizeof(N_ALCSPlayer)); + seq->data = alHeapAlloc(&g_SndHeap, 1, g_SeqBufferSize); + seq->seqp = alHeapAlloc(&g_SndHeap, 1, sizeof(N_ALCSPlayer)); - n_alCSPNew(arg0->seqp, &config); + n_alCSPNew(seq->seqp, &config); - func00037650(arg0->seqp, var80095204); + func00037650(seq->seqp, var80095204); } void snd0000f76c(void); @@ -2344,9 +2344,9 @@ void sndInit(void) g_SeqTable = alHeapDBAlloc(0, 0, &g_SndHeap, 1, len); dmaExec(g_SeqTable, seqromaddr, len + 0xf & 0xfffffff0); - // Promote segment-relative offsets to real pointers + // Promote segment-relative offsets to ROM addresses for (i = 0; i < g_SeqTable->count; i++) { - g_SeqTable->entries[i].data += seqromaddr; + g_SeqTable->entries[i].romaddr += seqromaddr; } synconfig.maxVVoices = 44; @@ -2388,7 +2388,7 @@ void sndInit(void) } for (i = 0; i < 3; i++) { - snd0000f67c(&var80094ed8[i]); + seqInit(&g_SeqInstances[i]); } osSyncPrintf("gsSndpNew\n"); @@ -2406,22 +2406,6 @@ void sndInit(void) } } -#if VERSION < VERSION_NTSC_1_0 -const char var70055250nb[] = "DMA-Crash %s %d Ram: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"; -const char var700552a8nb[] = "snd.c"; -const char var700552b0nb[] = "Snd Heap Check FAILED"; -#endif - -const char var70053be0[] = "Snd_Play_Universal : Overriding -> Link = %d\n"; - -#if VERSION < VERSION_NTSC_1_0 -const char var700552f0nb[] = "Snd_Play_Mpeg : sndId=%d, vol=%d, pan=%d\n"; -#endif - -const char var70053c10[] = "Snd_Play_Mpeg : SYSTEM IS DISABLED\n"; -const char var70053c34[] = "Snd_Play_Mpeg : Lib called -> Adr=%x\n"; -const char var70053c5c[] = "Snd_Play_Mpeg : Chunk size -> Adr=%x\n"; - bool sndIsMp3(u16 soundnum) { union soundnumhack tmp; @@ -2452,92 +2436,60 @@ void snd0000fc40(s32 arg0) } #if VERSION >= VERSION_NTSC_1_0 -GLOBAL_ASM( -glabel snd0000fc48 -/* fc48: 27bdebb8 */ addiu $sp,$sp,-5192 -/* fc4c: afb00018 */ sw $s0,0x18($sp) -/* fc50: 00808025 */ or $s0,$a0,$zero -/* fc54: afbf001c */ sw $ra,0x1c($sp) -/* fc58: afa5144c */ sw $a1,0x144c($sp) -/* fc5c: 0c00e344 */ jal n_alCSPGetState -/* fc60: 8c8400f8 */ lw $a0,0xf8($a0) -/* fc64: 3c0e8006 */ lui $t6,%hi(g_SndDisabled) -/* fc68: 8dcedda0 */ lw $t6,%lo(g_SndDisabled)($t6) -/* fc6c: 8fa4144c */ lw $a0,0x144c($sp) -/* fc70: 3c038009 */ lui $v1,%hi(g_SeqTable) -/* fc74: 51c00004 */ beqzl $t6,.L0000fc88 -/* fc78: ae040104 */ sw $a0,0x104($s0) -/* fc7c: 10000038 */ b .L0000fd60 -/* fc80: 00001025 */ or $v0,$zero,$zero -/* fc84: ae040104 */ sw $a0,0x104($s0) -.L0000fc88: -/* fc88: 10400003 */ beqz $v0,.L0000fc98 -/* fc8c: 8c635208 */ lw $v1,%lo(g_SeqTable)($v1) -/* fc90: 10000033 */ b .L0000fd60 -/* fc94: 00001025 */ or $v0,$zero,$zero -.L0000fc98: -/* fc98: 8e0f0104 */ lw $t7,0x104($s0) -/* fc9c: 3c010001 */ lui $at,0x1 -/* fca0: 000fc0c0 */ sll $t8,$t7,0x3 -/* fca4: 00781021 */ addu $v0,$v1,$t8 -/* fca8: 8c450004 */ lw $a1,0x4($v0) -/* fcac: 00a1082b */ sltu $at,$a1,$at -/* fcb0: 50200004 */ beqzl $at,.L0000fcc4 -/* fcb4: 94430008 */ lhu $v1,0x8($v0) -/* fcb8: 10000029 */ b .L0000fd60 -/* fcbc: 00001025 */ or $v0,$zero,$zero -/* fcc0: 94430008 */ lhu $v1,0x8($v0) -.L0000fcc4: -/* fcc4: 3c098009 */ lui $t1,%hi(var8009520c) -/* fcc8: 8d29520c */ lw $t1,%lo(var8009520c)($t1) -/* fccc: 2463000f */ addiu $v1,$v1,0xf -/* fcd0: 3479000f */ ori $t9,$v1,0xf -/* fcd4: 3b28000f */ xori $t0,$t9,0xf -/* fcd8: 25030040 */ addiu $v1,$t0,0x40 -/* fcdc: 0069082b */ sltu $at,$v1,$t1 -/* fce0: 54200004 */ bnezl $at,.L0000fcf4 -/* fce4: 9446000a */ lhu $a2,0xa($v0) -/* fce8: 1000001d */ b .L0000fd60 -/* fcec: 00001025 */ or $v0,$zero,$zero -/* fcf0: 9446000a */ lhu $a2,0xa($v0) -.L0000fcf4: -/* fcf4: 8e0700fc */ lw $a3,0xfc($s0) -/* fcf8: 24c6000f */ addiu $a2,$a2,0xf -/* fcfc: 34ca000f */ ori $t2,$a2,0xf -/* fd00: 3946000f */ xori $a2,$t2,0xf -/* fd04: 00e36021 */ addu $t4,$a3,$v1 -/* fd08: 01862023 */ subu $a0,$t4,$a2 -/* fd0c: afa40028 */ sw $a0,0x28($sp) -/* fd10: 0c003504 */ jal dmaExec -/* fd14: afa7143c */ sw $a3,0x143c($sp) -/* fd18: 8fa40028 */ lw $a0,0x28($sp) -/* fd1c: 8fa5143c */ lw $a1,0x143c($sp) -/* fd20: 0c001d3c */ jal rzipInflate -/* fd24: 27a60034 */ addiu $a2,$sp,0x34 -/* fd28: 02002025 */ or $a0,$s0,$zero -/* fd2c: 0c00e34c */ jal n_alCSeqNew -/* fd30: 8e0500fc */ lw $a1,0xfc($s0) -/* fd34: 8e0400f8 */ lw $a0,0xf8($s0) -/* fd38: 0c00e6f8 */ jal func00039be0 -/* fd3c: 02002825 */ or $a1,$s0,$zero -/* fd40: 0c003f5d */ jal sndGetMusicChannelVolume -/* fd44: 02002025 */ or $a0,$s0,$zero -/* fd48: 02002025 */ or $a0,$s0,$zero -/* fd4c: 0c003f67 */ jal sndSetMusicChannelVolume -/* fd50: 3045ffff */ andi $a1,$v0,0xffff -/* fd54: 0c00e70c */ jal func00039c30 -/* fd58: 8e0400f8 */ lw $a0,0xf8($s0) -/* fd5c: 24020001 */ addiu $v0,$zero,0x1 -.L0000fd60: -/* fd60: 8fbf001c */ lw $ra,0x1c($sp) -/* fd64: 8fb00018 */ lw $s0,0x18($sp) -/* fd68: 27bd1448 */ addiu $sp,$sp,0x1448 -/* fd6c: 03e00008 */ jr $ra -/* fd70: 00000000 */ nop -); +bool seqPlay(struct seqinstance *seq, s32 tracknum) +{ + u32 stack; + s32 binlen; + u8 *binstart; + s32 ziplen; + u8 *zipstart; + u8 scratch[1024 * 5]; + + s32 state = n_alCSPGetState(seq->seqp); + + if (g_SndDisabled) { + return false; + } + + seq->tracknum = tracknum; + + if (g_SeqTable && tracknum); + + if (state != AL_STOPPED) { + return false; + } + + if (g_SeqTable->entries[seq->tracknum].romaddr < 0x10000) { + return false; + } + + binlen = ALIGN16(g_SeqTable->entries[seq->tracknum].binlen) + 0x40; + + if (binlen >= g_SeqBufferSize) { + return false; + } + + ziplen = ALIGN16(g_SeqTable->entries[seq->tracknum].ziplen); + binstart = seq->data; + zipstart = binstart + binlen - ziplen; + + dmaExec(zipstart, g_SeqTable->entries[seq->tracknum].romaddr, ziplen); + + rzipInflate(zipstart, binstart, scratch); + + n_alCSeqNew(&seq->seq, seq->data); + func00039be0(seq->seqp, seq); + seqSetVolume(seq, seqGetVolume(seq)); + func00039c30(seq->seqp); + + return true; +} #else +const char var70055250nb[] = "DMA-Crash %s %d Ram: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"; +const char var700552a8nb[] = "snd.c"; + GLOBAL_ASM( -glabel snd0000fc48 +glabel seqPlay /* 100e0: 27bdeaf8 */ addiu $sp,$sp,-5384 /* 100e4: afb00058 */ sw $s0,0x58($sp) /* 100e8: 00808025 */ or $s0,$a0,$zero @@ -2651,10 +2603,10 @@ glabel snd0000fc48 /* 10284: 8e0400f8 */ lw $a0,0xf8($s0) /* 10288: 0c00ebec */ jal func00039be0 /* 1028c: 02002825 */ or $a1,$s0,$zero -/* 10290: 0c0040b1 */ jal sndGetMusicChannelVolume +/* 10290: 0c0040b1 */ jal seqGetVolume /* 10294: 02002025 */ or $a0,$s0,$zero /* 10298: 02002025 */ or $a0,$s0,$zero -/* 1029c: 0c0040bb */ jal sndSetMusicChannelVolume +/* 1029c: 0c0040bb */ jal seqSetVolume /* 102a0: 3045ffff */ andi $a1,$v0,0xffff /* 102a4: 0c00ec00 */ jal func00039c30 /* 102a8: 8e0400f8 */ lw $a0,0xf8($s0) @@ -2668,24 +2620,39 @@ glabel snd0000fc48 ); #endif -u16 sndGetMusicChannelVolume(struct var80094ed8 *arg0) +#if VERSION < VERSION_NTSC_1_0 +const char var700552b0nb[] = "Snd Heap Check FAILED"; +#endif + +const char var70053be0[] = "Snd_Play_Universal : Overriding -> Link = %d\n"; + +#if VERSION < VERSION_NTSC_1_0 +const char var700552f0nb[] = "Snd_Play_Mpeg : sndId=%d, vol=%d, pan=%d\n"; +#endif + +const char var70053c10[] = "Snd_Play_Mpeg : SYSTEM IS DISABLED\n"; +const char var70053c34[] = "Snd_Play_Mpeg : Lib called -> Adr=%x\n"; +const char var70053c5c[] = "Snd_Play_Mpeg : Chunk size -> Adr=%x\n"; + + +u16 seqGetVolume(struct seqinstance *seq) { - return g_SndDisabled ? 0x7fff : arg0->volume; + return g_SndDisabled ? 0x7fff : seq->volume; } -void sndSetMusicChannelVolume(struct var80094ed8 *arg0, u16 volume) +void seqSetVolume(struct seqinstance *seq, u16 volume) { if (!g_SndDisabled) { - u32 tmp = (var8005ecf8[arg0->unk104] * volume); + u32 tmp = (var8005ecf8[seq->tracknum] * volume); tmp >>= 15; - arg0->volume = volume; + seq->volume = volume; if (tmp > 0x7fff) { tmp = 0x7fff; } - n_alCSPSetVol(arg0->seqp, tmp); + n_alCSPSetVol(seq->seqp, tmp); } }