Lots of matches in the audio code (#417)

* Lots of audio matches

Fully matched heap.c, lots of load.c and some stuff in seqplayer.c

Matched heap.c's BSS segement and moved some BSS stuff out of
 load.c into data.c, since that where it appears to belong
 according to SM64.

Signed-off-by: Taggerung <tyler.taggerung@email.com>
This commit is contained in:
Tyler McGavran
2023-09-14 00:36:27 -04:00
committed by GitHub
parent 4ee09e005f
commit 86c86c8bcd
41 changed files with 1828 additions and 6077 deletions
+17
View File
@@ -425,3 +425,20 @@ f32 gDefaultPanVolume[128] = {
0.184465f, 0.172295f, 0.160098f, 0.147877f, 0.135634f, 0.12337f, 0.111087f, 0.098786f,
0.086471f, 0.074143f, 0.061803f, 0.049454f, 0.037097f, 0.024734f, 0.012368f, 0.0f
};
s32 D_803B70C0;
s32 D_803B70C4;
u64 *gAudioCmdBuffers[2]; // probably wrong
u64 *gAudioCmd;
struct SPTask *gAudioTask; // gAudioTask?
struct SPTask gAudioTasks[2]; // gAudioTasks?
f32 D_803B7178;
s32 gRefreshRate;
s16 *gAiBuffers[3]; // unconfirmed, osAiSetNextBuffer vaddr
u32 D_803B718C; // osAiSetNextBuffer nbytes
s16 load_bss_pad3;
u16 D_803B7192; // unconfirmed
u32 gAudioRandom;
s32 gAudioErrorFlags;
u32 D_803B71A0[4]; // unconfirmed
u8 D_803B71B0[4]; // unconfirmed
+23
View File
@@ -7,6 +7,9 @@
#define AUDIO_LOCK_NOT_LOADING 0x76557364
#define AUDIO_LOCK_LOADING 0x19710515
#define NUMAIBUFFERS 3
#define AIBUFFER_LEN (0xa0 * 16)
// number of DMAs performed during this frame
extern s32 gCurrAudioFrameDmaCount;
@@ -33,4 +36,24 @@ extern f32 gStereoPanVolume[128];
extern f32 gDefaultPanVolume[128];
extern u32 gAudioRandom;
extern s16 gTatumsPerBeat; // D_800EA5CC
extern volatile s32 gAudioLoadLock; // D_800EA5DC
extern s32 D_803B70C0;
extern s32 D_803B70C4;
extern u64 *gAudioCmdBuffers[2]; // probably wrong
extern u64 *gAudioCmd; // D_803B70D0
extern struct SPTask *gAudioTask; // D_803B70D4
extern struct SPTask gAudioTasks[2]; // D_803B70D8
extern f32 D_803B7178;
extern s32 gRefreshRate;
extern s16 *gAiBuffers[NUMAIBUFFERS]; // D_803B7180
extern u32 D_803B718C; // osAiSetNextBuffer nbytes
extern s16 load_bss_pad3;
extern u16 D_803B7192; // unconfirmed
extern u32 gAudioRandom;
extern s32 gAudioErrorFlags;
extern u32 D_803B71A0[4]; // unconfirmed
extern u8 D_803B71B0[4]; // unconfirmed
#endif
+19
View File
@@ -4,6 +4,25 @@
#include "common_structs.h"
#include "camera.h"
#define ADSR_STATE_DISABLED 0
#define ADSR_STATE_INITIAL 1
#define ADSR_STATE_START_LOOP 2
#define ADSR_STATE_LOOP 3
#define ADSR_STATE_FADE 4
#define ADSR_STATE_HANG 5
#define ADSR_STATE_DECAY 6
#define ADSR_STATE_RELEASE 7
#define ADSR_STATE_SUSTAIN 8
#define ADSR_ACTION_RELEASE 0x10
#define ADSR_ACTION_DECAY 0x20
#define ADSR_ACTION_HANG 0x40
#define ADSR_DISABLE 0
#define ADSR_HANG -1
#define ADSR_GOTO -2
#define ADSR_RESTART -3
// Sequence arguments, passed to seq_player_play_sequence. seqId may be bit-OR'ed with
// SEQ_VARIATION; this will load the same sequence, but set a variation
// bit which may be read by the sequence script.
+369 -571
View File
File diff suppressed because it is too large Load Diff
+31 -7
View File
@@ -99,26 +99,41 @@ void *soundAlloc(struct SoundAllocPool *pool, u32 size);
void sound_alloc_pool_init(struct SoundAllocPool *pool, void *memAddr, u32 size);
void persistent_pool_clear(struct PersistentPool *persistent);
void temporary_pool_clear(struct TemporaryPool *temporary);
void *get_bank_or_seq(s32 poolIdx, s32 arg1, s32 id);
void *get_bank_or_seq_inner(s32 poolIdx, s32 arg1, s32 bankId);
void func_800B9BE4(f32, f32, u16*);
void func_800B90E0(struct SoundAllocPool *pool);
void func_800B90F0(s32);
void func_800B914C(struct PoolSplit*);
void func_800B9FB8(void);
void seq_and_bank_pool_init(struct PoolSplit2 *a);
void persistent_pools_init(struct PoolSplit *a);
void temporary_pools_init(struct PoolSplit *a);
void *alloc_bank_or_seq(struct SoundMultiPool*, s32, s32, s32, s32);
void *get_bank_or_seq(s32 poolIdx, s32 arg1, s32 id);
void *get_bank_or_seq_inner(s32 poolIdx, s32 arg1, s32 bankId);
void func_800B9BE4(f32, f32, u16*);
void decrease_reverb_gain(void);
s32 audio_shut_down_and_reset_step(void);
void audio_reset_session(void);
void *unk_pool1_lookup(s32 poolIdx, s32 id);
void func_800BA8B0(s32, s32);
extern s32 D_800EA5D0;
extern u8 D_803B71B0[];
extern u8 gAudioResetPresetIdToLoad; // D_803B0501
extern s32 gMaxAudioCmds; // D_803B70AC
extern s16 gTempoInternalToExternal; // D_803B70B4
extern u64 *gAudioCmdBuffers[]; // D_803B70C8
extern f32 D_803B7178;
extern s32 gRefreshRate; // D_803B717C
extern u32 gSampleDmaNumListItems; // D_803B6E58
extern struct AudioSessionSettingsEU gAudioSessionPresets[]; // D_800EA4D8
// Note: In some .asm files D_803AFBC8 has been replaced with gLeftVolRampings
// That is almost certainly incorrect, but I don't know how to fix it at this point
extern s16 gVolume; // D_803AFBC0
extern s8 gUseReverb;
extern s8 gNumSynthesisReverbs; // D_803AFBC3
extern struct SoundAllocPool gLeftVolRampings;
extern struct NoteSubEu *gNoteSubsEu;
extern struct SoundAllocPool gAudioSessionPool; // D_803AFBC8
extern struct SoundAllocPool gAudioInitPool; // D_803AFBD8
extern struct SoundAllocPool gNotesAndBuffersPool;
@@ -126,11 +141,20 @@ extern struct SoundAllocPool gPersistentCommonPool; // D_803AFC28
extern struct SoundAllocPool gTemporaryCommonPool; // D_803AFC38
extern struct SoundMultiPool gSeqLoadedPool; // D_803AFC48
extern struct SoundMultiPool gBankLoadedPool; // D_803AFE18
extern struct SoundMultiPool gUnusedLoadedPool;
extern struct Unk1Pool gUnkPool1; // D_803B01B8
extern struct PoolSplit sSessionPoolSplit; // D_803B0348
extern struct PoolSplit2 sSeqAndBankPoolSplit; // D_803B0358
extern struct PoolSplit sPersistentCommonPoolSplit; // D_803B0360;
extern struct PoolSplit sTemporaryCommonPoolSplit; // D_803B0370;
extern struct SoundMultiPool gUnusedLoadedPool; // D_803AFFE8
extern struct SoundAllocPool gSeqAndBankPool; // D_803AFC18
extern u8 gBankLoadStatus[64]; // D_803B03C0
extern u8 gUnkLoadStatus[64];
extern u8 gSeqLoadStatus[256]; // D_803B0400
extern struct SoundMultiPool gUnusedLoadedPool; // D_803AFFE8
extern struct SoundAllocPool gSeqAndBankPool; // D_803AFC18
extern volatile u8 gAudioResetStatus; // D_803B0500
extern u8 gAudioResetPresetIdToLoad;
extern s32 gAudioResetFadeOutFramesLeft; // D_803B0504
extern struct Note *gNotes;
#endif // AUDIO_HEAP_H
+35 -2
View File
@@ -512,8 +512,10 @@ struct AudioSessionSettingsEU {
/* 0x0E */ u16 unk3; // always 0
/* 0x10 */ u32 persistentSeqMem;
/* 0x14 */ u32 persistentBankMem;
/* 0x18, 0x1C */ u32 temporarySeqMem;
/* 0x1C, 0x20 */ u32 temporaryBankMem;
/* 0x18 */ u32 unk_18;
/* 0x1C */ u32 temporarySeqMem;
/* 0x20 */ u32 temporaryBankMem;
/* 0x24 */ u32 unk_24;
}; // 0x30 on shindou
struct AudioSessionSettings {
@@ -545,6 +547,17 @@ struct AudioBufferParametersEU {
/*0x1C*/ f32 unkUpdatesPerFrameScaled; // 3.0f / (1280.0f * updatesPerFrame)
};
/**
* This definition comes from SM64. For reasons not fully understood
* eu_process_audio_cmd does not match properly if this definition
* is used.
* We're either:
* Missing a compiler -D for IS_BIG_ENDIAN
* or
* The version of that function in MK64 is significantly different
* from its SM64 counterpart
* Or we just have a poor understanding of this part of the system.
struct EuAudioCmd {
union {
#if IS_BIG_ENDIAN
@@ -583,5 +596,25 @@ struct EuAudioCmd {
#endif
} u2;
};
**/
struct EuAudioCmd {
union {
struct {
u8 op;
u8 arg1;
u8 arg2;
u8 arg3;
} s;
s32 first;
} u;
union {
s32 as_s32;
u32 as_u32;
f32 as_f32;
u8 as_u8;
s8 as_s8;
} u2;
};
#endif // AUDIO_INTERNAL_H
+316 -461
View File
@@ -46,36 +46,20 @@ u8 sSampleDmaReuseQueueTail2; // sSampleDmaReuseQueueTail2
u8 sSampleDmaReuseQueueHead1; // sSampleDmaReuseQueueHead1
u8 sSampleDmaReuseQueueHead2; // sSampleDmaReuseQueueHead2
s32 D_803B706C;
s32 D_803B7070;
s32 D_803B7074;
ALSeqFile *gSeqFileHeader;
ALSeqFile *gAlCtlHeader;
ALSeqFile *gAlTbl;
u8 *gAlBankSets;
u16 D_803B707C;
u16 gSequenceCount;
struct CtlEntry *gCtlEntries;
struct AudioBufferParametersEU gAudioBufferParameters;
u32 D_803B70A8;
s32 D_803B70AC;
s32 gMaxAudioCmds;
s32 gMaxSimultaneousNotes;
s16 D_803B70B4;
s16 gTempoInternalToExternal;
s8 gAudioLibSoundMode;
s32 D_803B70B8; // According to sm64 this is s8 not s32
s32 gCurrAudioFrameDmaCount; // file split around here?
s32 D_803B70C0;
s32 D_803B70C4;
s32 D_803B70C8[2]; // probably wrong
s32 D_803B70D0;
struct SPTask *D_803B70D4; // gAudioTask?
struct SPTask D_803B70D8[2]; // gAudioTasks?
f32 D_803B7178;
s32 D_803B717C;
void *D_803B7180[3]; // unconfirmed, osAiSetNextBuffer vaddr
u32 D_803B718C; // osAiSetNextBuffer nbytes
s16 load_bss_pad3;
u16 D_803B7192; // unconfirmed
u32 gAudioRandom;
s32 gAudioErrorFlags;
u32 D_803B71A0[4]; // unconfirmed
u8 D_803B71B0[4]; // unconfirmed
extern OSMesgQueue D_803B6720;
extern OSIoMesg D_803B6740;
@@ -281,106 +265,103 @@ void *func_800BAD0C(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
return (devAddr - dmaDevAddr) + dma->buffer;
}
//generated by m2c commit b7eac665cffd02361f73cec283ef16d0a35a0e5b
extern s32 gCurrAudioFrameDmaCount;
extern ? gCurrAudioFrameDmaIoMesgBufs;
extern OSMesgQueue gCurrAudioFrameDmaQueue;
extern u32 sSampleDmaListSize1;
extern ? sSampleDmaReuseQueue1;
extern ? sSampleDmaReuseQueue2;
extern u8 sSampleDmaReuseQueueHead2;
extern u8 sSampleDmaReuseQueueTail1;
extern u8 sSampleDmaReuseQueueTail2;
extern ? sSampleDmas;
void *func_800BAD0C(u32 devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
struct SharedDma *sp40;
void *sp40;
s32 sp30;
s32 temp_t9;
s32 temp_t9_2;
s32 temp_t9_3;
s32 temp_v0_2;
s32 temp_v0_4;
s32 temp_v1_3;
s32 var_t2;
s32 var_t3;
struct SharedDma *temp_t0;
struct SharedDma *var_a0;
struct SharedDma *var_t0;
u16 temp_v0_6;
u32 temp_a1;
u32 temp_a1_2;
u32 temp_s0;
u32 var_v1;
u32 var_v1_2;
u8 *temp_v0_3;
u8 *temp_v0_5;
u8 temp_a0;
u8 temp_a1_3;
u8 temp_a1_4;
u8 temp_a3;
u8 temp_t2;
u8 temp_v0;
u8 temp_v1;
u8 temp_v1_2;
void *temp_t0;
void *var_a0;
void *var_t0;
var_t3 = 0;
if ((arg2 != 0) || (temp_a1 = sSampleDmaListSize1, temp_v0 = *dmaIndexRef, var_v1 = 0, ((temp_v0 < temp_a1) == 0))) {
temp_a1_2 = gSampleDmaNumListItems;
if ((arg2 != 0) || (temp_v0 = *dmaIndexRef, var_v1 = 0, ((temp_v0 < (u32) sSampleDmaListSize1) == 0))) {
var_v1_2 = sSampleDmaListSize1;
if (var_v1_2 < temp_a1_2) {
var_a0 = &sSampleDmas[var_v1_2];
if (var_v1_2 < (u32) gSampleDmaNumListItems) {
var_a0 = (var_v1_2 * 0x10) + &sSampleDmas;
loop_4:
temp_t0 = var_a0;
temp_v0_2 = devAddr - var_a0->source;
if ((temp_v0_2 >= 0) && ((u32) (var_a0->bufSize - size) >= (u32) temp_v0_2)) {
if (var_a0->ttl == 0) {
temp_a1_3 = sSampleDmaReuseQueueTail2;
if (sSampleDmaReuseQueueHead2 != temp_a1_3) {
temp_a3 = var_a0->reuseIndex;
temp_v0_3 = &sSampleDmaReuseQueue2[temp_a1_3];
if (temp_a1_3 != temp_a3) {
sSampleDmaReuseQueue2[temp_a3] = *temp_v0_3;
sSampleDmas[*temp_v0_3].reuseIndex = var_a0->reuseIndex;
}
sSampleDmaReuseQueueTail2 = temp_a1_3 + 1;
temp_v0_2 = devAddr - var_a0->unk4;
if ((temp_v0_2 >= 0) && ((u32) (var_a0->unkA - size) >= (u32) temp_v0_2)) {
if ((var_a0->unkE == 0) && (sSampleDmaReuseQueueHead2 != sSampleDmaReuseQueueTail2)) {
temp_a3 = var_a0->unkD;
temp_v0_3 = &sSampleDmaReuseQueue2 + sSampleDmaReuseQueueTail2;
if (sSampleDmaReuseQueueTail2 != temp_a3) {
*(&sSampleDmaReuseQueue2 + temp_a3) = *temp_v0_3;
(&sSampleDmas + (*temp_v0_3 * 0x10))->unkD = (u8) var_a0->unkD;
}
sSampleDmaReuseQueueTail2 += 1;
}
var_a0->ttl = 0x3C;
var_a0->unkE = 0x3CU;
*dmaIndexRef = (u8) var_v1_2;
return &var_a0->buffer[devAddr] - var_a0->source;
return (var_a0->unk0 + devAddr) - var_a0->unk4;
}
var_v1_2 += 1;
var_a0 += 0x10;
if (var_v1_2 >= temp_a1_2) {
if (var_v1_2 >= (u32) gSampleDmaNumListItems) {
sp40 = temp_t0;
goto block_14;
}
goto loop_4;
}
block_14:
temp_a1_4 = sSampleDmaReuseQueueTail2;
var_t0 = sp40;
if ((sSampleDmaReuseQueueHead2 != temp_a1_4) && (arg2 != 0)) {
temp_t2 = sSampleDmaReuseQueue2[temp_a1_4];
sSampleDmaReuseQueueTail2 = temp_a1_4 + 1;
var_t0 = &sSampleDmas[temp_t2];
if ((sSampleDmaReuseQueueHead2 != sSampleDmaReuseQueueTail2) && (arg2 != 0)) {
temp_t2 = *(&sSampleDmaReuseQueue2 + sSampleDmaReuseQueueTail2);
temp_t9 = temp_t2 * 0x10;
sSampleDmaReuseQueueTail2 += 1;
var_t0 = &sSampleDmas + temp_t9;
var_t3 = 1;
sp30 = (s32) temp_t2;
}
goto block_27;
}
var_t0 = &sSampleDmas[temp_v0];
if (temp_a1 != 0) {
var_t0 = &sSampleDmas + (temp_v0 * 0x10);
if (sSampleDmaListSize1 != 0) {
loop_19:
temp_t9 = var_v1 * 0x10;
temp_t9_2 = var_v1 * 0x10;
var_v1 += 1;
temp_v0_4 = devAddr - var_t0->source;
if ((temp_v0_4 >= 0) && ((u32) (var_t0->bufSize - size) >= (u32) temp_v0_4)) {
if (var_t0->ttl == 0) {
temp_v1 = sSampleDmaReuseQueueTail1;
temp_a0 = var_t0->reuseIndex;
temp_v0_5 = &sSampleDmaReuseQueue1[temp_v1];
if (temp_v1 != temp_a0) {
sSampleDmaReuseQueue1[temp_a0] = *temp_v0_5;
sSampleDmas[*temp_v0_5].reuseIndex = var_t0->reuseIndex;
temp_v0_4 = devAddr - var_t0->unk4;
if ((temp_v0_4 >= 0) && ((u32) (var_t0->unkA - size) >= (u32) temp_v0_4)) {
if (var_t0->unkE == 0) {
temp_a0 = var_t0->unkD;
temp_v0_5 = &sSampleDmaReuseQueue1 + sSampleDmaReuseQueueTail1;
if (sSampleDmaReuseQueueTail1 != temp_a0) {
*(&sSampleDmaReuseQueue1 + temp_a0) = *temp_v0_5;
(&sSampleDmas + (*temp_v0_5 * 0x10))->unkD = (u8) var_t0->unkD;
}
sSampleDmaReuseQueueTail1 = temp_v1 + 1;
sSampleDmaReuseQueueTail1 += 1;
}
var_t0->ttl = 2;
return &var_t0->buffer[devAddr] - var_t0->source;
var_t0->unkE = 2U;
return (var_t0->unk0 + devAddr) - var_t0->unk4;
}
var_t0 = sSampleDmas + temp_t9;
if (var_v1 >= temp_a1) {
var_t0 = &sSampleDmas + temp_t9_2;
if (var_v1 >= (u32) sSampleDmaListSize1) {
goto block_27;
}
goto loop_19;
@@ -388,23 +369,22 @@ loop_19:
block_27:
var_t2 = sp30;
if (var_t3 == 0) {
temp_v1_2 = sSampleDmaReuseQueueTail1;
var_t2 = (s32) sSampleDmaReuseQueue1[temp_v1_2];
sSampleDmaReuseQueueTail1 = temp_v1_2 + 1;
var_t0 = sSampleDmas + (var_t2 * 0x10);
var_t2 = (s32) *(&sSampleDmaReuseQueue1 + sSampleDmaReuseQueueTail1);
sSampleDmaReuseQueueTail1 += 1;
var_t0 = &sSampleDmas + (var_t2 * 0x10);
}
temp_v0_6 = var_t0->bufSize;
temp_v0_6 = var_t0->unkA;
temp_s0 = devAddr & ~0xF;
var_t0->ttl = 2;
var_t0->source = temp_s0;
var_t0->sizeUnused = temp_v0_6;
temp_v1_3 = gCurrAudioFrameDmaCount;
gCurrAudioFrameDmaCount = temp_v1_3 + 1;
var_t0->unkE = 2;
var_t0->unk4 = temp_s0;
var_t0->unk8 = temp_v0_6;
temp_t9_3 = gCurrAudioFrameDmaCount * 0x18;
gCurrAudioFrameDmaCount += 1;
sp30 = var_t2;
sp40 = var_t0;
osPiStartDma(&gCurrAudioFrameDmaIoMesgBufs[temp_v1_3], 0, 0, temp_s0, var_t0->buffer, (u32) temp_v0_6, &gCurrAudioFrameDmaQueue);
osPiStartDma(temp_t9_3 + &gCurrAudioFrameDmaIoMesgBufs, 0, 0, temp_s0, var_t0->unk0, (u32) temp_v0_6, &gCurrAudioFrameDmaQueue);
*dmaIndexRef = (u8) var_t2;
return &var_t0->buffer[devAddr - temp_s0];
return (devAddr - temp_s0) + var_t0->unk0;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BAD0C.s")
@@ -583,27 +563,23 @@ void patch_sound(struct AudioBankSound *sound, u8 *memBase, u8 *offsetBase) {
}
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
extern s32 D_803B7074;
void func_800BB584(s32 arg0) {
//generated by m2c commit 08138748803d75e73e4a94bb0c619a273754ee9c on Sep-12-2023
void func_800BB584(s32 bankId) {
s32 sp18;
s32 var_a1;
struct CtlEntry *temp_v0;
struct CtlEntry *temp_v0_2;
struct CtlEntry *temp_v0_3;
void *temp_v0;
u8 *var_a1;
temp_v0 = D_803B7074 + (arg0 * 8);
if (temp_v0->unk8 == 0) {
var_a1 = (D_803B7074 + (temp_v0->unk4 * 8))->unk4;
if (gAlTbl->seqArray[bankId].len == 0) {
var_a1 = gAlTbl->seqArray[(s32) gAlTbl->seqArray[bankId].offset].offset;
} else {
var_a1 = temp_v0->unk4;
var_a1 = gAlTbl->seqArray[bankId].offset;
}
temp_v0_2 = &gCtlEntries[arg0];
sp18 = arg0 * 0xC;
patch_audio_bank((struct AudioBank *) (temp_v0_2->instruments - 4), (u8 *) var_a1, (u32) temp_v0_2->numInstruments, (u32) temp_v0_2->numDrums);
temp_v0_3 = &gCtlEntries[arg0];
temp_v0_3->drums = temp_v0_3->instruments->unk-4;
temp_v0 = &gCtlEntries[bankId];
sp18 = bankId * 0xC;
patch_audio_bank((struct AudioBank *) (temp_v0->instruments - 4), var_a1, (u32) temp_v0->numInstruments, (u32) temp_v0->numDrums);
temp_v0_2 = &gCtlEntries[bankId];
temp_v0_2->drums = temp_v0_2->instruments->unk-4;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BB584.s")
@@ -678,168 +654,112 @@ void patch_audio_bank(struct AudioBank *mem, u8 *offset, u32 numInstruments, u32
#undef BASE_OFFSET
}
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
void *func_800B93BC(struct SoundMultiPool *, ?, u32, s32, s32); /* extern */
? func_800BB584(s32); /* extern */
extern s32 D_803B7070;
struct AudioBank *bank_load_immediate(s32 bankId, s32 arg1) {
s32 alloc;
s32 stackPadding0[4];
s32 stackPadding1[5];
struct AudioBank *ret;
u8 *ctlData;
void *func_800BB780(s32 arg0, s32 arg1) {
u32 sp54;
void *sp2C;
s32 sp28;
u32 temp_a2;
u8 *temp_v0_3;
void *temp_v0;
void *temp_v0_2;
temp_v0 = D_803B7070 + (arg0 * 8);
temp_a2 = ((temp_v0->unk8 + 0x1E) & ~0xF) - 0x10;
sp54 = temp_a2;
sp28 = temp_v0->unk4;
temp_v0_2 = func_800B93BC(&gBankLoadedPool, 1, temp_a2, arg1, arg0);
if (temp_v0_2 == NULL) {
alloc = gAlCtlHeader->seqArray[bankId].len + 0xf;
alloc = ALIGN16(alloc);
alloc -= 0x10;
ctlData = gAlCtlHeader->seqArray[bankId].offset;
ret = alloc_bank_or_seq(&gBankLoadedPool, 1, alloc, arg1, bankId);
if (ret == NULL) {
return NULL;
}
sp2C = temp_v0_2;
audio_dma_copy_immediate(sp28 + 0x10, temp_v0_2, temp_a2);
gCtlEntries[arg0].instruments = sp2C + 4;
func_800BB584(arg0);
temp_v0_3 = &gBankLoadStatus[arg0];
if (*temp_v0_3 != 5) {
*temp_v0_3 = 2;
audio_dma_copy_immediate((u32) (ctlData + 0x10), ret, (u32) alloc);
gCtlEntries[bankId].instruments = ret->instruments;
func_800BB584(bankId);
if (gBankLoadStatus[bankId] != 5) {
gBankLoadStatus[bankId] = 2;
}
return sp2C;
return ret;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BB780.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
u8 *func_800B93BC(struct SoundMultiPool *, ?, s32, s32, s32); /* extern */
extern s32 D_803B7070;
struct AudioBank *bank_load_async(s32 bankId, s32 arg1, struct SequencePlayer *seqPlayer) {
size_t alloc;
s32 stackPadding0[9];
struct AudioBank *ret;
u8 *ctlData;
s32 stackPadding1[2];
s32 func_800BB864(s32 arg0, s32 arg1, struct SequencePlayer *arg2) {
s32 sp64;
u8 *sp3C;
s32 sp38;
OSMesgQueue *sp2C;
OSMesgQueue *temp_a3;
s32 temp_a2;
u8 *temp_v0_2;
u8 *temp_v0_3;
void *temp_v0;
temp_v0 = D_803B7070 + (arg0 * 8);
temp_a2 = ((temp_v0->unk8 + 0x1E) & ~0xF) - 0x10;
sp64 = temp_a2;
sp38 = temp_v0->unk4;
temp_v0_2 = func_800B93BC(&gBankLoadedPool, 1, temp_a2, arg1, arg0);
sp3C = temp_v0_2;
if (temp_v0_2 == NULL) {
return 0;
}
arg2->loadingBankId = (u8) arg0;
gCtlEntries[arg0].instruments = (struct Instrument **) (temp_v0_2 + 4);
temp_a3 = &arg2->bankDmaMesgQueue;
gCtlEntries[arg0].drums = NULL;
arg2->bankDmaCurrMemAddr = temp_v0_2;
arg2->bankDmaRemaining = temp_a2;
arg2->bankDmaCurrDevAddr = sp38 + 0x10;
sp2C = temp_a3;
osCreateMesgQueue(temp_a3, &arg2->bankDmaMesg, 1);
arg2->unk0 = (u8) (arg2->unk0 | 8);
audio_dma_partial_copy_async(&arg2->bankDmaCurrDevAddr, &arg2->bankDmaCurrMemAddr, &arg2->bankDmaRemaining, temp_a3, &arg2->bankDmaIoMesg);
temp_v0_3 = &gBankLoadStatus[arg0];
if (*temp_v0_3 != 5) {
*temp_v0_3 = 1;
}
return (s32) sp3C;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BB864.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
void *func_800B93BC(struct SoundMultiPool *, ?, u32, s32, s32); /* extern */
extern s32 D_803B706C;
void *func_800BB99C(s32 arg0, s32 arg1) {
u32 sp2C;
void *sp28;
u32 sp24;
u32 temp_t9;
u8 *temp_v0_3;
void *temp_v0;
void *temp_v0_2;
temp_v0_2 = D_803B706C + (arg0 * 8);
temp_t9 = (temp_v0_2->unk8 + 0xF) & ~0xF;
sp2C = temp_t9;
sp24 = temp_v0_2->unk4;
temp_v0 = func_800B93BC(&gSeqLoadedPool, 1, temp_t9, arg1, arg0);
if (temp_v0 == NULL) {
alloc = gAlCtlHeader->seqArray[bankId].len + 0xF;
alloc = ALIGN16(alloc);
alloc -= 0x10;
ctlData = gAlCtlHeader->seqArray[bankId].offset;
ret = alloc_bank_or_seq(&gBankLoadedPool, 1, alloc, arg1, bankId);
if (ret == NULL) {
return NULL;
}
sp28 = temp_v0;
audio_dma_copy_immediate(sp24, temp_v0, sp2C);
temp_v0_3 = &gSeqLoadStatus[arg0];
if (*temp_v0_3 != 5) {
*temp_v0_3 = 2;
seqPlayer->loadingBankId = bankId;
gCtlEntries[bankId].instruments = ret->instruments;
gCtlEntries[bankId].drums = NULL;
seqPlayer->bankDmaCurrMemAddr = (u8*) ret;
seqPlayer->bankDmaCurrDevAddr = (uintptr_t) (ctlData + 0x10);
seqPlayer->bankDmaRemaining = alloc;
if (1) { }
osCreateMesgQueue(&seqPlayer->bankDmaMesgQueue, &seqPlayer->bankDmaMesg, 1);
seqPlayer->bankDmaInProgress = TRUE;
audio_dma_partial_copy_async(&seqPlayer->bankDmaCurrDevAddr, &seqPlayer->bankDmaCurrMemAddr, &seqPlayer->bankDmaRemaining, &seqPlayer->bankDmaMesgQueue, &seqPlayer->bankDmaIoMesg);
if (gBankLoadStatus[bankId] != 5) {
gBankLoadStatus[bankId] = 1;
}
return temp_v0;
return ret;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BB99C.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
void *func_800B93BC(struct SoundMultiPool *, ?, s32, s32, s32); /* extern */
extern s32 D_803B706C;
void *sequence_dma_immediate(s32 seqId, s32 arg1) {
s32 seqLength;
void *ptr;
u8 *seqData;
void *func_800BBA50(s32 arg0, s32 arg1, struct SequencePlayer *arg2) {
u32 sp3C;
OSMesgQueue *sp34;
OSMesgQueue *temp_a3;
s32 temp_a2;
u8 *temp_v0_3;
u8 *temp_v0_4;
void *temp_v0;
void *temp_v0_2;
temp_v0_2 = D_803B706C + (arg0 * 8);
temp_a2 = (temp_v0_2->unk8 + 0xF) & ~0xF;
sp3C = temp_v0_2->unk4;
temp_v0 = func_800B93BC(&gSeqLoadedPool, 1, temp_a2, arg1, arg0);
if (temp_v0 == NULL) {
seqLength = gSeqFileHeader->seqArray[seqId].len;
seqLength = ALIGN16(seqLength);
seqData = gSeqFileHeader->seqArray[seqId].offset;
ptr = alloc_bank_or_seq(&gSeqLoadedPool, 1, seqLength, arg1, seqId);
if (ptr == NULL) {
return NULL;
}
if (temp_a2 < 0x41) {
audio_dma_copy_immediate(sp3C, temp_v0, (u32) temp_a2);
temp_v0_3 = &gSeqLoadStatus[arg0];
if (*temp_v0_3 != 5) {
*temp_v0_3 = 2;
audio_dma_copy_immediate((uintptr_t) seqData, ptr, seqLength);
if (gSeqLoadStatus[seqId] != 5) {
gSeqLoadStatus[seqId] = 2;
}
return ptr;
}
void *sequence_dma_async(s32 seqId, s32 arg1, struct SequencePlayer *seqPlayer) {
s32 seqLength;
void *ptr;
u8 *seqData;
OSMesgQueue *mesgQueue;
seqLength = gSeqFileHeader->seqArray[seqId].len;
seqLength = ALIGN16(seqLength);
seqData = gSeqFileHeader->seqArray[seqId].offset;
ptr = alloc_bank_or_seq(&gSeqLoadedPool, 1, seqLength, arg1, seqId);
if (ptr == NULL) {
return NULL;
}
if (seqLength < 0x41) {
audio_dma_copy_immediate((uintptr_t) seqData, ptr, (u32) seqLength);
if (1) {}
if (gSeqLoadStatus[seqId] != 5) {
gSeqLoadStatus[seqId] = 2;
}
} else {
audio_dma_copy_immediate(sp3C, temp_v0, 0x00000040U);
temp_a3 = &arg2->seqDmaMesgQueue;
sp34 = temp_a3;
osCreateMesgQueue(temp_a3, &arg2->seqDmaMesg, 1);
*arg2 = (u8) (*arg2 | 0x10);
audio_dma_copy_async(sp3C + 0x40, temp_v0 + 0x40, temp_a2 - 0x40, temp_a3, &arg2->seqDmaIoMesg);
temp_v0_4 = &gSeqLoadStatus[arg0];
if (*temp_v0_4 != 5) {
*temp_v0_4 = 1;
audio_dma_copy_immediate((uintptr_t) seqData, ptr, 0x00000040U);
mesgQueue = &seqPlayer->seqDmaMesgQueue;
osCreateMesgQueue(mesgQueue, &seqPlayer->seqDmaMesg, 1);
seqPlayer->seqDmaInProgress = TRUE;
audio_dma_copy_async((uintptr_t) (seqData + 0x40), (u8*) ptr + 0x40, seqLength - 0x40, mesgQueue, &seqPlayer->seqDmaIoMesg);
if (gSeqLoadStatus[seqId] != 5) {
gSeqLoadStatus[seqId] = 1;
}
}
return temp_v0;
return ptr;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BBA50.s")
#endif
u8 get_missing_bank(u32 seqId, s32 *nonNullCount, s32 *nullCount) {
void *temp;
@@ -871,219 +791,154 @@ u8 get_missing_bank(u32 seqId, s32 *nonNullCount, s32 *nullCount) {
return ret;
}
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
void *func_800BB780(u8, ?); /* extern */
struct AudioBank *load_banks_immediate(s32 seqId, u8 *outDefaultBank) {
void *ret;
u32 bankId;
u16 offset;
u8 i;
void *func_800BBCD0(s32 arg0, s8 *arg1) {
void *sp34;
s32 sp30;
s32 var_s1;
u16 temp_s1;
u8 temp_s0;
u8 temp_t4;
u8 temp_t6;
u8 var_s2;
void *var_v1;
offset = ((u16 *) gAlBankSets)[seqId];
for (i = gAlBankSets[offset++]; i != 0; i--) {
bankId = gAlBankSets[offset++];
temp_s1 = *(gAlBankSets + (arg0 * 2));
var_s2 = gAlBankSets[temp_s1];
var_s1 = (temp_s1 + 1) & 0xFFFF;
if (var_s2 != 0) {
do {
temp_s0 = gAlBankSets[var_s1];
temp_t4 = gBankLoadStatus[temp_s0];
var_s1 = (var_s1 + 1) & 0xFFFF;
var_v1 = NULL;
if ((((s32) temp_t4 < 2) ^ 1) == 1) {
var_v1 = get_bank_or_seq(1, 2, (s32) temp_s0);
}
if (var_v1 == NULL) {
var_v1 = func_800BB780(temp_s0, 2);
}
temp_t6 = (var_s2 - 1) & 0xFF;
var_s2 = temp_t6;
} while (temp_t6 != 0);
sp34 = var_v1;
sp30 = (s32) temp_s0;
if (IS_BANK_LOAD_COMPLETE(bankId) == TRUE) {
ret = get_bank_or_seq(1, 2, bankId);
} else {
ret = NULL;
}
if (ret == NULL) {
ret = bank_load_immediate(bankId, 2);
}
}
*arg1 = (s8) sp30;
return sp34;
*outDefaultBank = bankId;
return ret;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BBCD0.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
s32 func_800BB99C(u32, ?, u32); /* extern */
? func_800BBCD0(u32, ? *, u32); /* extern */
extern s32 D_803B706C;
extern u16 D_803B707C;
static s32 D_800EA5DC = 0;
void preload_sequence(u32 seqId, u8 preloadMask) {
void *sequenceData;
u8 temp;
void func_800BBDDC(u32 arg0, s32 arg1) {
? sp23;
s32 sp1C;
s32 temp_t6;
s32 var_v1;
u32 var_a2;
void *temp_v0;
void *temp_v0_2;
void *var_v1_2;
if (seqId >= gSequenceCount) {
return;
}
temp_t6 = arg1 & 0xFF;
var_a2 = arg0;
if (arg0 < (u16) D_803B707C) {
temp_v0 = D_803B706C + (arg0 * 8);
if (temp_v0->unk8 == 0) {
var_a2 = temp_v0->unk4;
if (gSeqFileHeader->seqArray[seqId].len == 0) {
seqId = (u32) gSeqFileHeader->seqArray[seqId].offset;
}
gAudioLoadLock = AUDIO_LOCK_LOADING;
if (preloadMask & PRELOAD_BANKS) {
load_banks_immediate(seqId, &temp);
}
if (preloadMask & PRELOAD_SEQUENCE) {
// @bug should be IS_SEQ_LOAD_COMPLETE
if (IS_BANK_LOAD_COMPLETE(seqId) == TRUE) {
sequenceData = get_bank_or_seq(0, 2, seqId);
} else {
sequenceData = NULL;
}
D_800EA5DC = 0x19710515;
var_v1 = temp_t6;
if (temp_t6 & 2) {
sp1C = var_v1;
arg0 = var_a2;
func_800BBCD0(var_a2, &sp23, var_a2);
var_v1 = sp1C;
var_a2 = arg0;
if (sequenceData == NULL && sequence_dma_immediate(seqId, 2) == NULL) {
gAudioLoadLock = AUDIO_LOCK_NOT_LOADING;
return;
}
if (var_v1 & 1) {
var_v1_2 = NULL;
if ((((s32) gBankLoadStatus[var_a2] < 2) ^ 1) == 1) {
arg0 = var_a2;
temp_v0_2 = get_bank_or_seq(0, 2, (s32) var_a2);
var_a2 = arg0;
var_v1_2 = temp_v0_2;
}
if ((var_v1_2 == NULL) && (func_800BB99C(var_a2, 2, var_a2) == 0)) {
D_800EA5DC = 0x76557364;
}
gAudioLoadLock = AUDIO_LOCK_NOT_LOADING;
}
void load_sequence(u32 player, u32 seqId, s32 loadAsync) {
if (!loadAsync) {
gAudioLoadLock = AUDIO_LOCK_LOADING;
}
load_sequence_internal(player, seqId, loadAsync);
if (!loadAsync) {
gAudioLoadLock = AUDIO_LOCK_NOT_LOADING;
}
}
void load_sequence_internal(u32 player, u32 seqId, s32 loadAsync) {
void *sequenceData;
struct SequencePlayer *seqPlayer = &gSequencePlayers[player];
UNUSED u32 padding[2];
if (seqId >= gSequenceCount) {
return;
}
if (gSeqFileHeader->seqArray[seqId].len == 0) {
seqId = (u32) gSeqFileHeader->seqArray[seqId].offset;
}
sequence_player_disable(seqPlayer);
if (loadAsync) {
s32 numMissingBanks = 0;
s32 dummy = 0;
s32 bankId = get_missing_bank(seqId, &dummy, &numMissingBanks);
if (numMissingBanks == 1) {
if (bank_load_async(bankId, 2, seqPlayer) == NULL) {
return;
}
goto block_11;
}
block_11:
D_800EA5DC = 0x76557364;
}
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BBDDC.s")
#endif
//load_sequence
void func_800BBEF0(u32 player, u32 seqId, s32 loadAsync) {
if (!loadAsync) {
D_800EA5DC = AUDIO_LOCK_LOADING; // gAudioLoadLock
}
func_800BBF44(player, seqId, loadAsync);
if (!loadAsync) {
D_800EA5DC = AUDIO_LOCK_NOT_LOADING;
}
}
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
s32 func_800BB864(u8, ?, struct SequencePlayer *); /* extern */
u8 *func_800BB99C(u32, ?); /* extern */
u8 *func_800BBA50(u32, ?, struct SequencePlayer *); /* extern */
s32 func_800BBCD0(u32, u8 *, s32 *); /* extern */
extern s32 D_803B706C;
extern u16 D_803B707C;
//load_sequence_internal
void func_800BBF44(u32 arg0, u32 arg1, s32 arg2) {
u8 *sp3C;
s32 sp2C;
s32 sp28;
s32 sp24;
struct SequencePlayer *temp_s0;
u32 var_s1;
u8 *temp_v0_3;
u8 *var_v0;
u8 *var_v1;
u8 temp_a0;
u8 temp_v0_2;
void *temp_v0;
var_s1 = arg1;
if (arg1 < (u16) D_803B707C) {
temp_v0 = D_803B706C + (arg1 * 8);
if (temp_v0->unk8 == 0) {
var_s1 = temp_v0->unk4;
}
temp_s0 = &gSequencePlayers[arg0];
sequence_player_disable(temp_s0);
if (arg2 != 0) {
sp2C = 0;
sp28 = 0;
temp_v0_2 = get_missing_bank(var_s1, &sp28, &sp2C);
temp_a0 = temp_v0_2;
if (sp2C == 1) {
sp24 = (s32) temp_v0_2;
if (func_800BB864(temp_a0, 2, temp_s0) != 0) {
temp_s0->defaultBank[0] = (u8) sp24;
goto block_10;
}
} else {
if (func_800BBCD0(var_s1, temp_s0->defaultBank) == 0) {
return;
}
goto block_10;
}
} else if (func_800BBCD0(var_s1, temp_s0->defaultBank, &sp2C) != 0) {
block_10:
temp_s0->seqId = (u8) var_s1;
temp_v0_3 = get_bank_or_seq(0, 2, (s32) var_s1);
var_v1 = temp_v0_3;
if (temp_v0_3 == NULL) {
if (!(temp_s0->unk0 & 0x10000000)) {
if (arg2 != 0) {
var_v0 = func_800BBA50(var_s1, 2, temp_s0);
} else {
var_v0 = func_800BB99C(var_s1, 2);
}
var_v1 = var_v0;
if (var_v0 != NULL) {
goto block_16;
}
}
} else {
block_16:
sp3C = var_v1;
init_sequence_player(arg0);
temp_s0->scriptState.depth = 0;
temp_s0->delay = 0;
temp_s0->unk0 = (s8) ((u8) temp_s0->unk0 | 0x80);
temp_s0->seqData = var_v1;
temp_s0->scriptState.pc = var_v1;
// @bug This should set the last bank (i.e. the first in the JSON)
// as default, not the missing one. This code path never gets
// taken, though -- all sequence loading is synchronous.
seqPlayer->defaultBank[0] = bankId;
} else {
if (load_banks_immediate(seqId, &seqPlayer->defaultBank[0]) == NULL) {
return;
}
}
} else if (load_banks_immediate(seqId, &seqPlayer->defaultBank[0]) == NULL) {
return;
}
seqPlayer->seqId = seqId;
sequenceData = get_bank_or_seq(0, 2, seqId);
if (sequenceData == NULL) {
if (seqPlayer->seqDmaInProgress) {
return;
}
if (loadAsync) {
sequenceData = sequence_dma_async(seqId, 2, seqPlayer);
} else {
sequenceData = sequence_dma_immediate(seqId, 2);
}
if (sequenceData == NULL) {
return;
}
}
init_sequence_player(player);
seqPlayer->scriptState.depth = 0;
seqPlayer->delay = 0;
seqPlayer->enabled = TRUE;
seqPlayer->seqData = sequenceData;
seqPlayer->scriptState.pc = sequenceData;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/func_800BBF44.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
? func_800B90F0(s32); /* extern */
? func_800BA00C(); /* extern */
? audio_shut_down_and_reset_step(); /* extern */
? func_800BB43C(s32 *, ? *); /* extern */
extern s8 D_803B0500;
extern s8 D_803B0501;
extern s8 gAudioResetStatus;
extern s8 gAudioResetPresetIdToLoad;
extern OSMesgQueue D_803B6720;
extern s32 *D_803B706C;
extern s32 *D_803B7070;
extern s32 *D_803B7074;
extern s16 D_803B707C;
extern void *D_803B6738;
extern s32 *gSeqFileHeader;
extern s32 *gAlCtlHeader;
extern s32 *gAlTbl;
extern s16 gSequenceCount;
extern s32 D_803B70B8;
extern s32 D_803B70C0;
extern s32 D_803B70C4;
extern s32 D_803B70D4;
extern ? D_803B70D8;
extern s32 gAudioTask;
extern ? gAudioTasks;
extern f32 D_803B7178;
extern s32 D_803B717C;
extern void *D_803B7180;
extern s32 gRefreshRate;
extern void *gAiBuffers;
extern ? D_803B718C;
extern ? D_803B7192;
extern ? D_803B71A0;
@@ -1098,7 +953,7 @@ extern s32 gSampleDmaNumListItems;
static s32 D_800EA5D0 = 0x00048C00;
static s32 D_800EA5D4 = 0x00002600;
static u32 D_800EA5D8 = 0;
static s32 D_800EA5DC = 0;
static s32 gAudioLoadLock = 0;
void audio_init(void) {
s32 sp8C;
@@ -1126,7 +981,7 @@ void audio_init(void) {
void *temp_t3;
void *temp_t7_2;
D_800EA5DC = 0;
gAudioLoadLock = 0;
temp_t7 = (s32) D_800EA5D0 / 8;
if (temp_t7 > 0) {
var_v0 = &D_803B71B0;
@@ -1149,16 +1004,16 @@ void audio_init(void) {
switch (osTvType) { /* irregular */
case 0:
D_803B7178 = 20.03042f;
D_803B717C = 0x00000032;
gRefreshRate = 0x00000032;
break;
case 2:
D_803B7178 = 16.546f;
D_803B717C = 0x0000003C;
gRefreshRate = 0x0000003C;
break;
default:
case 1:
D_803B7178 = 16.713f;
D_803B717C = 0x0000003C;
gRefreshRate = 0x0000003C;
break;
}
func_800CBF48(&gGfxSPTaskOutputBufferSize);
@@ -1171,15 +1026,15 @@ void audio_init(void) {
D_803B70C0 = 0;
D_803B70C4 = 0;
gAudioLibSoundMode = 0;
D_803B70D4 = 0;
D_803B70D8.unk34 = 0;
D_803B70D8.unk84 = 0;
gAudioTask = 0;
gAudioTasks.unk34 = 0;
gAudioTasks.unk84 = 0;
osCreateMesgQueue(&D_803B6720, &D_803B6738, 1);
osCreateMesgQueue(&gCurrAudioFrameDmaQueue, &gCurrAudioFrameDmaMesgBufs, 0x00000040);
gCurrAudioFrameDmaCount = 0;
gSampleDmaNumListItems = 0;
func_800B90F0(D_800EA5D4);
var_a2 = &D_803B7180;
var_a2 = &gAiBuffers;
do {
sp3C = var_a2;
var_v1 = 0;
@@ -1196,26 +1051,26 @@ loop_18:
}
var_a2 += 4;
} while ((u32) var_a2 < (u32) &D_803B718C);
D_803B0501 = 0;
D_803B0500 = 1;
func_800BA00C();
D_803B706C = &sp60;
gAudioResetPresetIdToLoad = 0;
gAudioResetStatus = 1;
audio_shut_down_and_reset_step();
gSeqFileHeader = &sp60;
audio_dma_copy_immediate((u32) &_sequencesSegmentRomStart, &sp60, 0x00000010U);
temp_t1 = D_803B706C->unk2;
temp_t1 = gSeqFileHeader->unk2;
temp_a1 = (((temp_t1 & 0xFFFF) * 8) + 0x13) & ~0xF;
D_803B707C = temp_t1;
gSequenceCount = temp_t1;
temp_v0 = soundAlloc(&gAudioInitPool, temp_a1);
D_803B706C = temp_v0;
gSeqFileHeader = temp_v0;
audio_dma_copy_immediate((u32) &_sequencesSegmentRomStart, temp_v0, temp_a1);
func_800BB43C(D_803B706C, &_sequencesSegmentRomStart);
D_803B7070 = &sp60;
func_800BB43C(gSeqFileHeader, &_sequencesSegmentRomStart);
gAlCtlHeader = &sp60;
audio_dma_copy_immediate((u32) &_audio_banksSegmentRomStart, &sp60, 0x00000010U);
temp_s3 = D_803B7070->unk2;
temp_s3 = gAlCtlHeader->unk2;
temp_a1_2 = ((temp_s3 * 8) + 0x13) & ~0xF;
temp_v0_2 = soundAlloc(&gAudioInitPool, temp_a1_2);
D_803B7070 = temp_v0_2;
gAlCtlHeader = temp_v0_2;
audio_dma_copy_immediate((u32) &_audio_banksSegmentRomStart, temp_v0_2, temp_a1_2);
func_800BB43C(D_803B7070, &_audio_banksSegmentRomStart);
func_800BB43C(gAlCtlHeader, &_audio_banksSegmentRomStart);
gCtlEntries = soundAlloc(&gAudioInitPool, temp_s3 * 0xC);
var_v1_2 = 0;
if (temp_s3 > 0) {
@@ -1223,7 +1078,7 @@ loop_18:
var_s0_2 = 0;
do {
sp8C = var_v1_2;
audio_dma_copy_immediate((D_803B7070 + var_s1)->unk4, &sp60, 0x00000010U);
audio_dma_copy_immediate((gAlCtlHeader + var_s1)->unk4, &sp60, 0x00000010U);
(gCtlEntries + var_s0_2)->unk1 = (s8) sp60;
var_v1_2 = sp8C + 1;
temp_t3 = gCtlEntries + var_s0_2;
@@ -1232,19 +1087,19 @@ loop_18:
temp_t3->unk2 = (s8) sp64;
} while (var_v1_2 != temp_s3);
}
D_803B7074 = &sp60;
gAlTbl = &sp60;
audio_dma_copy_immediate((u32) &_audio_tablesSegmentRomStart, &sp60, 0x00000010U);
temp_a1_3 = ((D_803B7074->unk2 * 8) + 0x13) & ~0xF;
temp_a1_3 = ((gAlTbl->unk2 * 8) + 0x13) & ~0xF;
temp_v0_3 = soundAlloc(&gAudioInitPool, temp_a1_3);
D_803B7074 = temp_v0_3;
gAlTbl = temp_v0_3;
audio_dma_copy_immediate((u32) &_audio_tablesSegmentRomStart, temp_v0_3, temp_a1_3);
func_800BB43C(D_803B7074, &_audio_tablesSegmentRomStart);
func_800BB43C(gAlTbl, &_audio_tablesSegmentRomStart);
temp_v0_4 = soundAlloc(&gAudioInitPool, 0x00000100U);
gAlBankSets = temp_v0_4;
audio_dma_copy_immediate((u32) &_instrument_setsSegmentRomStart, temp_v0_4, 0x00000100U);
sound_alloc_pool_init(&gUnkPool1.pool, soundAlloc(&gAudioInitPool, D_800EA5D8), D_800EA5D8);
init_sequence_players();
D_800EA5DC = 0x76557364;
gAudioLoadLock = 0x76557364;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/load/audio_init.s")
+14 -3
View File
@@ -18,11 +18,18 @@ void decrease_sample_dma_ttls(void);
void func_800BB030(s32);
s32 func_800BB304(struct AudioBankSample*);
s32 func_800BB388(s32 bankId, s32 instId, s32 arg2);
void func_800BBEF0(u32 player, u32 seqId, s32 loadAsync);
void func_800BBF44(u32 player, u32 seqId, s32 loadAsync);
u8 get_missing_bank(u32 seqId, s32 *nonNullCount, s32 *nullCount);
void patch_sound(struct AudioBankSound *sound, u8 *memBase, u8 *offsetBase);
void func_800BB584(s32);
void patch_audio_bank(struct AudioBank *mem, u8 *offset, u32 numInstruments, u32 numDrums);
struct AudioBank *bank_load_immediate(s32, s32);
struct AudioBank *bank_load_async(s32, s32, struct SequencePlayer*);
void *sequence_dma_immediate(s32, s32);
void *sequence_dma_async(s32, s32, struct SequencePlayer*);
u8 get_missing_bank(u32 seqId, s32 *nonNullCount, s32 *nullCount);
struct AudioBank *load_banks_immediate(s32, u8*);
void preload_sequence(u32, u8);
void load_sequence(u32, u32, s32);
void load_sequence_internal(u32, u32, s32);
extern u32 D_803B70A8; // sDmaBufSize
// This is really data, not a volatile
@@ -37,6 +44,10 @@ extern struct SequenceChannel gSequenceChannelNone;
extern struct AudioListItem gLayerFreeList;
extern struct NotePool gNoteFreeLists;
extern u8 *gAlBankSets;
extern ALSeqFile *gSeqFileHeader; // D_803B706C
extern ALSeqFile *gAlCtlHeader; // D_803B7070
extern ALSeqFile *gAlTbl; // D_803B7074
extern u16 gSequenceCount; // D_803B707C
extern struct CtlEntry *gCtlEntries;
extern struct AudioBufferParametersEU gAudioBufferParameters;
extern s32 gMaxSimultaneousNotes;
+93 -104
View File
@@ -1,6 +1,7 @@
#include <ultra64.h>
#include <macros.h>
#include "audio/seqplayer.h"
#include "audio/port_eu.h"
#include "audio/load.h"
@@ -9,7 +10,7 @@ OSMesgQueue D_801937D8;
OSMesgQueue D_801937F0;
OSMesgQueue D_80193808;
struct EuAudioCmd D_80193820[0x100];
struct EuAudioCmd sAudioCmd[0x100];
// Seems oversized by 1
OSMesg D_80194020[2];
@@ -44,17 +45,17 @@ char port_eu_unused_string7[] = "Undefined Port Command %d\n";
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
s32 func_800B70EC(s32, s32 *, s32, s16); /* extern */
s32 func_800BA00C(); /* extern */
s32 audio_shut_down_and_reset_step(); /* extern */
? func_800CBCB0(void *); /* extern */
extern u8 D_803B0500;
extern u8 D_803B0501;
extern u8 gAudioResetStatus;
extern u8 gAudioResetPresetIdToLoad;
extern s32 D_803B70B8;
extern s32 D_803B70C0;
extern s32 D_803B70C4;
extern ? D_803B70C8;
extern s32 D_803B70D0;
extern ? D_803B70D8;
extern ? D_803B7180;
extern ? gAudioCmdBuffers;
extern s32 gAudioCmd;
extern ? gAudioTasks;
extern ? gAiBuffers;
extern ? D_803B718C;
extern ? aspMainDataEnd;
extern ? aspMainDataStart;
@@ -94,7 +95,7 @@ void *create_next_audio_frame_task(void) {
sp74 = osAiGetLength() >> 2;
temp_v1 = *(&D_803B718C + (temp_hi_2 * 2));
if (temp_v1 != 0) {
osAiSetNextBuffer(*(&D_803B7180 + (temp_hi_2 * 4)), temp_v1 * 4);
osAiSetNextBuffer(*(&gAiBuffers + (temp_hi_2 * 4)), temp_v1 * 4);
}
var_s1 = gCurrAudioFrameDmaCount;
var_s0 = 0;
@@ -128,18 +129,18 @@ void *create_next_audio_frame_task(void) {
gCurrAudioFrameDmaCount = 0;
decrease_sample_dma_ttls();
if (osRecvMesg(D_800EA3B0, &sp58, 0) != -1) {
D_803B0501 = (u8) sp58;
D_803B0500 = 5;
gAudioResetPresetIdToLoad = (u8) sp58;
gAudioResetStatus = 5;
}
if ((D_803B0500 != 0) && (func_800BA00C() == 0)) {
if (D_803B0500 == 0) {
osSendMesg(D_800EA3B4, (void *) D_803B0501, 0);
if ((gAudioResetStatus != 0) && (audio_shut_down_and_reset_step() == 0)) {
if (gAudioResetStatus == 0) {
osSendMesg(D_800EA3B4, (void *) gAudioResetPresetIdToLoad, 0);
}
return NULL;
}
D_803B70D4 = (D_803B70C0 * 0x50) + &D_803B70D8;
temp_a3 = (D_803B70C4 * 4) + &D_803B7180;
D_803B70D0 = *(&D_803B70C8 + (D_803B70C0 * 4));
gAudioTask = (D_803B70C0 * 0x50) + &gAudioTasks;
temp_a3 = (D_803B70C4 * 4) + &gAiBuffers;
gAudioCmd = *(&gAudioCmdBuffers + (D_803B70C0 * 4));
sp60 = *temp_a3;
temp_s1_2 = (D_803B70C4 * 2) + &D_803B718C;
*temp_s1_2 = (((gAudioBufferParameters.samplesPerFrameTarget - sp74) + 0x40) & 0xFFF0) + 0x10;
@@ -153,92 +154,83 @@ void *create_next_audio_frame_task(void) {
if (osRecvMesg(D_800EA3AC, &sp54, 0) != -1) {
func_800CBCB0(sp54);
}
D_803B70D0 = func_800B70EC(D_803B70D0, &sp70, sp60, *temp_s1_2);
gAudioCmd = func_800B70EC(gAudioCmd, &sp70, sp60, *temp_s1_2);
gAudioRandom = osGetCount() * (gAudioRandom + D_803B70B8);
gAudioRandom += *(*sp40 + ((D_803B70B8 & 0xFF) * 2));
D_803B70D4->unk40 = 0;
D_803B70D4->unk44 = 0;
D_803B70D4->unk0 = 2;
D_803B70D4->unk4 = 0;
D_803B70D4->unk8 = rspbootTextStart;
D_803B70D4->unkC = (s32) (rspbootTextEnd - rspbootTextStart);
D_803B70D4->unk10 = &aspMainTextStart;
D_803B70D4->unk18 = &aspMainDataStart;
D_803B70D4->unk14 = 0x00001000;
D_803B70D4->unk1C = (s32) (((s32) (&aspMainDataEnd - &aspMainDataStart) >> 3) * 8);
D_803B70D4->unk20 = 0;
D_803B70D4->unk24 = 0;
D_803B70D4->unk28 = 0;
D_803B70D4->unk2C = 0;
D_803B70D4->unk30 = (s32) *(&D_803B70C8 + (D_803B70C0 * 4));
D_803B70D4->unk38 = 0;
D_803B70D4->unk3C = 0;
D_803B70D4->unk34 = (s32) (sp70 * 8);
gAudioTask->unk40 = 0;
gAudioTask->unk44 = 0;
gAudioTask->unk0 = 2;
gAudioTask->unk4 = 0;
gAudioTask->unk8 = rspbootTextStart;
gAudioTask->unkC = (s32) (rspbootTextEnd - rspbootTextStart);
gAudioTask->unk10 = &aspMainTextStart;
gAudioTask->unk18 = &aspMainDataStart;
gAudioTask->unk14 = 0x00001000;
gAudioTask->unk1C = (s32) (((s32) (&aspMainDataEnd - &aspMainDataStart) >> 3) * 8);
gAudioTask->unk20 = 0;
gAudioTask->unk24 = 0;
gAudioTask->unk28 = 0;
gAudioTask->unk2C = 0;
gAudioTask->unk30 = (s32) *(&gAudioCmdBuffers + (D_803B70C0 * 4));
gAudioTask->unk38 = 0;
gAudioTask->unk3C = 0;
gAudioTask->unk34 = (s32) (sp70 * 8);
if (D_800EA484 < sp70) {
D_800EA484 = sp70;
}
return D_803B70D4;
return gAudioTask;
}
#else
GLOBAL_ASM("asm/non_matchings/audio/port_eu/create_next_audio_frame_task.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
? func_800BBDDC(u8, ?); /* extern */
void eu_process_audio_cmd(struct EuAudioCmd *cmd) {
s32 i;
void func_800CB818(void *arg0) {
s32 temp_a1;
struct SequencePlayer *temp_a0;
u8 temp_v0;
u8 temp_v0_2;
switch (cmd->u.s.op) {
case 0x81:
preload_sequence(cmd->u.s.arg2, 3);
break;
temp_v0 = arg0->unk0;
switch (temp_v0) { /* irregular */
case 0x81:
func_800BBDDC(arg0->unk2, 3);
return;
case 0x82:
case 0x88:
func_800BBEF0((u32) arg0->unk1, (u32) arg0->unk2, (s32) arg0->unk3);
func_800CBA64((s32) arg0->unk1, arg0->unk4);
return;
case 0x83:
temp_v0_2 = arg0->unk1;
temp_a0 = &gSequencePlayers[temp_v0_2];
if (((u32) *temp_a0 >> 0x1F) != 0) {
temp_a1 = arg0->unk4;
if (temp_a1 == 0) {
sequence_player_disable(temp_a0);
return;
case 0x82:
case 0x88:
load_sequence(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
func_800CBA64(cmd->u.s.arg1, cmd->u2.as_s32);
break;
case 0x83:
if (gSequencePlayers[cmd->u.s.arg1].enabled != FALSE) {
if (cmd->u2.as_s32 == 0) {
sequence_player_disable(&gSequencePlayers[cmd->u.s.arg1]);
}
else {
seq_player_fade_to_zero_volume(cmd->u.s.arg1, cmd->u2.as_s32);
}
}
seq_player_fade_to_zero_volume((s32) temp_v0_2, temp_a1);
return;
}
return;
case 0xF0:
gAudioLibSoundMode = (s8) arg0->unk4;
return;
case 0xF1:
gSequencePlayers[0] |= 0x24;
gSequencePlayers[1] |= 0x24;
gSequencePlayers[2] |= 0x24;
gSequencePlayers[3] |= 0x24;
return;
case 0xF2:
gSequencePlayers[0] = (gSequencePlayers[0] & 0xFFDF) | 4;
gSequencePlayers[1] = (gSequencePlayers[1] & 0xFFDF) | 4;
gSequencePlayers[2] = (gSequencePlayers[2] & 0xFFDF) | 4;
gSequencePlayers[3] = (gSequencePlayers[3] & 0xFFDF) | 4;
return;
break;
case 0xf0:
gAudioLibSoundMode = cmd->u2.as_s32;
break;
case 0xf1:
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = TRUE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
break;
case 0xf2:
for (i = 0; i < 4; i++) {
gSequencePlayers[i].muted = FALSE;
gSequencePlayers[i].recalculateVolume = TRUE;
}
break;
case 0xF3:
func_800BB388((s32) arg0->unk1, (s32) arg0->unk2, (s32) arg0->unk3);
func_800BB388(cmd->u.s.arg1, cmd->u.s.arg2, cmd->u.s.arg3);
break;
}
}
#else
GLOBAL_ASM("asm/non_matchings/audio/port_eu/func_800CB818.s")
#endif
void seq_player_fade_to_zero_volume(s32 arg0, s32 fadeOutTime) {
struct SequencePlayer *player;
@@ -275,7 +267,7 @@ void func_800CBAB4(void) {
}
void func_800CBB48(s32 arg0, s32 *arg1) {
struct EuAudioCmd *cmd = &D_80193820[D_800EA3A0[0] & 0xff];
struct EuAudioCmd *cmd = &sAudioCmd[D_800EA3A0[0] & 0xff];
cmd->u.first = arg0;
cmd->u2.as_u32 = *arg1;
D_800EA3A0[0]++;
@@ -316,11 +308,8 @@ void func_800CBC24(void)
D_800EA3A4[0] = D_800EA3A0[0];
}
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
? func_800CB818(struct EuAudioCmd *); /* extern */
//generated by m2c commit 08138748803d75e73e4a94bb0c619a273754ee9c on Sep-13-2023
void func_800CBCB0(u32 arg0) {
s32 temp_t8;
s32 var_s1;
@@ -339,16 +328,16 @@ void func_800CBCB0(u32 arg0) {
if (temp_t8 != var_s1) {
do {
temp_s0 = &D_80193820[var_v0 & 0xFF];
temp_a0 = temp_s0->u.s.arg3;
temp_a0 = temp_s0->u.s.op;
var_s1 = (var_s1 + 1) & 0xFF;
if ((temp_a0 & 0xF0) == 0xF0) {
func_800CB818(temp_s0);
eu_process_audio_cmd(temp_s0);
} else {
temp_v0 = temp_s0->u.s.arg2;
temp_v0 = temp_s0->u.s.arg1;
if ((s32) temp_v0 < 4) {
temp_v1 = &gSequencePlayers[temp_v0];
if (temp_a0 & 0x80) {
func_800CB818(temp_s0);
eu_process_audio_cmd(temp_s0);
} else if (temp_a0 & 0x40) {
switch (temp_a0) { /* switch 1; irregular */
case 0x41: /* switch 1 */
@@ -359,14 +348,14 @@ void func_800CBCB0(u32 arg0) {
temp_v1->tempo = temp_s0->u2.as_s32 * 0x30;
break;
case 0x48: /* switch 1 */
temp_v1->transposition = (s16) (s8) temp_s0->u2.pad0[0];
temp_v1->transposition = (s16) (s8) temp_s0->u2.as_u8;
break;
case 0x46: /* switch 1 */
temp_v1->seqVariationEu[temp_s0->u.s.op] = (s8) temp_s0->u2.pad0[0];
temp_v1->seqVariationEu[temp_s0->u.s.arg3] = (s8) temp_s0->u2.as_u8;
break;
}
} else if (((u32) temp_v1->unk0 >> 0x1F) != 0) {
temp_a1 = temp_s0->u.s.arg1;
temp_a1 = temp_s0->u.s.arg2;
if ((s32) temp_a1 < 0x10) {
temp_v0_2 = temp_v1->channels[temp_a1];
if (temp_v0_2 != &gSequenceChannelNone) {
@@ -381,23 +370,23 @@ void func_800CBCB0(u32 arg0) {
break;
case 3:
temp_v0_2->changes.as_u8 |= 0x20;
temp_v0_2->newPan = (u8) (s8) temp_s0->u2.pad0[0];
temp_v0_2->newPan = (u8) (s8) temp_s0->u2.as_u8;
break;
case 4:
temp_v0_2->changes.as_u8 |= 0x80;
temp_v0_2->freqScale = (bitwise f32) temp_s0->u2.as_s32;
break;
case 5:
temp_v0_2->reverbVol = (u8) (s8) temp_s0->u2.pad0[0];
temp_v0_2->reverbVol = (u8) (s8) temp_s0->u2.as_u8;
break;
case 6:
temp_v1_2 = temp_s0->u.s.op;
temp_v1_2 = temp_s0->u.s.arg3;
if ((s32) temp_v1_2 < 8) {
temp_v0_2->soundScriptIO[temp_v1_2] = (s8) temp_s0->u2.pad0[0];
temp_v0_2->soundScriptIO[temp_v1_2] = (s8) temp_s0->u2.as_u8;
}
break;
case 8:
temp_v0_2->unk0 = (u8) ((((s8) temp_s0->u2.pad0[0] * 0x10) & 0x10) | (temp_v0_2->unk0 & 0xFFEF));
temp_v0_2->unk0 = (u8) ((((s8) temp_s0->u2.as_u8 * 0x10) & 0x10) | (temp_v0_2->unk0 & 0xFFEF));
break;
}
}
@@ -406,7 +395,7 @@ void func_800CBCB0(u32 arg0) {
}
}
var_v0 = var_s1;
temp_s0->u.s.arg3 = 0;
temp_s0->u.s.op = 0;
} while (temp_t8 != var_s1);
}
}
+3 -2
View File
@@ -3,6 +3,7 @@
#include "audio/internal.h"
void eu_process_audio_cmd(struct EuAudioCmd*);
void seq_player_fade_to_zero_volume(s32 arg0, s32 fadeOutTime);
void func_800CBA64(s32 playerIndex, s32 fadeInTime);
void func_800CBAB4(void);
@@ -17,7 +18,7 @@ extern OSMesgQueue D_801937D8;
extern OSMesgQueue D_801937F0;
extern OSMesgQueue D_80193808;
extern struct EuAudioCmd D_80193820[0x100];
extern struct EuAudioCmd sAudioCmd[0x100];
extern OSMesg D_80194020[];
extern OSMesg D_80194028[];
@@ -31,4 +32,4 @@ extern OSMesgQueue *D_800EA3B4;
extern s32 D_800EA484;
extern s32 D_800EA4A4;
#endif
#endif
+806 -841
View File
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -32,9 +32,11 @@ s16 m64_read_s16(struct M64ScriptState *state);
u16 m64_read_compressed_u16(struct M64ScriptState *state);
void seq_channel_layer_process_script(struct SequenceChannelLayer *layer);
u8 get_instrument(struct SequenceChannel *seqChannel, u8 instId, struct Instrument **instOut, struct AdsrSettings *adsr);
void sequence_player_process_sequence(struct SequencePlayer*);
void process_sequences(s32);
void set_instrument(struct SequenceChannel *seqChannel, u8 instId);
void sequence_channel_set_volume(struct SequenceChannel *seqChannel, u8 volume);
// void process_sequences(s32 iterationsRemaining);
void sequence_channel_process_script(struct SequenceChannel*);
void init_sequence_player(u32 player);
void init_sequence_players(void);
+9 -8
View File
@@ -1,7 +1,7 @@
#include <ultra64.h>
#include <macros.h>
#include "audio/synthesis.h"
//#include "audio/heap.h"
#include "audio/heap.h"
//#include "audio/data.h"
#include "audio/load.h"
//#include "audio/seqplayer.h"
@@ -39,12 +39,13 @@ u32 gGfxSPTaskOutputBufferSize;
u32 padding3[2];
struct SynthesisReverb gSynthesisReverbs[4];
u8 sAudioSynthesisPad[0x10];
s16 gVolume;
s8 gUseReverb;
s8 gNumSynthesisReverbs;
struct NoteSubEu *gNoteSubsEu;
f32 gLeftVolRampings;
// s16 gVolume;
// s8 gUseReverb;
// s8 gNumSynthesisReverbs;
// struct NoteSubEu *gNoteSubsEu;
//f32 gLeftVolRampings;
//f32 gRightVolRampings[3][1024];
//f32 *gCurrentLeftVolRamping; // Points to any of the three left buffers above
//f32 *gCurrentRightVolRamping; // Points to any of the three right buffers above
@@ -160,7 +161,7 @@ void synthesis_load_note_subs_eu(s32 updateIndex) {
#ifdef MIPS_TO_C
//generated by m2c commit eefca95b040d7ee0c617bc58f9ac6cd1cf7bce87 on Aug-14-2023
Acmd *func_800B775C(s16 *, s32, Acmd *, s32); /* extern */
? func_800C1138(s16); /* extern */
? process_sequences(s16); /* extern */
void *func_800B70EC(Acmd *acmd, s32 *writtenCmds, s16 *aiBuf, s32 bufLen) {
Acmd *temp_v0;
@@ -184,7 +185,7 @@ void *func_800B70EC(Acmd *acmd, s32 *writtenCmds, s16 *aiBuf, s32 bufLen) {
if (var_s4 > 0) {
do {
temp_s0 = var_s4 - 1;
func_800C1138(temp_s0);
process_sequences(temp_s0);
synthesis_load_note_subs_eu(gAudioBufferParameters.updatesPerFrame - var_s4);
var_s4 = temp_s0;
} while (temp_s0 > 0);
+1 -2
View File
@@ -97,8 +97,7 @@ extern struct AudioBufferParametersEU gAudioBufferParameters;
extern s32 gMaxSimultaneousNotes;
extern struct SynthesisReverb gSynthesisReverbs[4];
extern s8 gNumSynthesisReverbs;
extern struct NoteSubEu *gNoteSubsEu;
/*
SO
gLeftVolRampings is almost certainly gAudioSessionPool (D_803AFBC8) in disguise, but since