mirror of
https://github.com/n64decomp/mk64
synced 2026-06-12 21:14:51 -04:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
+31
-7
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user