From 7b154c23e1c703b0d9f41b962b59c539f7a2d4f8 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Tue, 20 Jul 2021 09:49:29 +1000 Subject: [PATCH] AudioMgr OK and Mostly Documented (#208) * AudioMgr OK * Cleanup * Improve naming from PR Feedback --- include/functions.h | 60 +++++++-------- include/variables.h | 10 +-- include/z64.h | 77 ++++++++++++------- linker_scripts/code_script.txt | 6 +- src/boot_O2_g3/irqmgr.c | 12 +-- src/code/audioMgr.c | 136 +++++++++++++++++++++++++++++++++ tables/functions.txt | 14 ++-- tables/objects.txt | 2 +- tables/variables.txt | 10 +-- 9 files changed, 241 insertions(+), 86 deletions(-) create mode 100644 src/code/audioMgr.c diff --git a/include/functions.h b/include/functions.h index 1801183bca..14c3fc257c 100644 --- a/include/functions.h +++ b/include/functions.h @@ -37,8 +37,8 @@ void* Yaz0_FirstDMA(void); void* Yaz0_NextDMA(void* curSrcPos); s32 Yaz0_DecompressImpl(u8* hdr, u8* dst); void Yaz0_Decompress(u32 romStart, void* dst, u32 size); -void IrqMgr_AddClient(IrqMgr* irqmgr, OSMesgQueueListNode* param_2, OSMesgQueue* param_3); -void IrqMgr_RemoveClient(IrqMgr* irqmgr, OSMesgQueueListNode* remove); +void IrqMgr_AddClient(IrqMgr* irqmgr, IrqMgrClient* add, OSMesgQueue* msgQ); +void IrqMgr_RemoveClient(IrqMgr* irqmgr, IrqMgrClient* remove); void IrqMgr_SendMesgForClient(IrqMgr* irqmgr, OSMesg msg); void IrqMgr_JamMesgForClient(IrqMgr* irqmgr, OSMesg msg); void IrqMgr_HandlePreNMI(IrqMgr* irqmgr); @@ -174,7 +174,7 @@ void func_800863AC(u32 param_1, s32 param_2, s32 param_3, UNK_PTR param_4); // void func_800864EC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // void func_80086588(void); void StartHeap_Init(u32 base, u32 size); -s32 func_80086620(OSMesgQueue* param_1, PadmgrThreadStruct* param_2, OSContStatus* param_3); +s32 func_80086620(OSMesgQueue* param_1, PadMgr* param_2, OSContStatus* param_3); // void func_80086760(void); // void func_80086794(void); // void func_800867B4(void); @@ -3143,12 +3143,12 @@ void THA_Init(TwoHeadArena* tha); void THA_Ct(TwoHeadArena* tha, void* ptr, u32 size); void THA_Dt(TwoHeadArena* tha); void func_80172BC0(void); -void func_80172C30(AudioThreadStruct* audio); -void func_80172C68(AudioThreadStruct* audio); -// void Audio_Stop(void); -void Audio_ThreadEntry(AudioThreadStruct* audio); -void Audio_WaitForInit(AudioThreadStruct* param_1); -void Audio_Start(AudioThreadStruct* audio, s32* audioThreadStackEnd, OSPri pri, OSId id, SchedThreadStruct* sched, IrqMgr* irq); +void func_80172C30(AudioMgr* audioMgr); +void AudioMgr_HandleRetrace(AudioMgr* audioMgr); +void AudioMgr_HandlePRENMI(AudioMgr* audioMgr); +void AudioMgr_ThreadEntry(void* arg); +void AudioMgr_Unlock(AudioMgr* audioMgr); +void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr); void TitleSetup_GameStateResetContext(void); void TitleSetup_InitImpl(GameState* gameState); void TitleSetup_Destroy(GameState* gameState); @@ -3223,32 +3223,32 @@ void Padmgr_CalcStickEdges(Input* input); void func_80175E68(Input* input, s32 param_2); void Padmgr_GetInput(Input* input, s32 param_2); void Padmgr_GetInput2(Input* input, s32 param_2); -void Padmgr_ThreadEntry(PadmgrThreadStruct* padmgr); +void Padmgr_ThreadEntry(PadMgr* padmgr); void Padmgr_Start(OSMesgQueue* siEventCallbackQueue, IrqMgr* irqmgr, OSId threadId, OSPri threadPri, void* stack); // void func_80176280(void); // void func_80176314(void); -void Sched_Nop80176364(SchedThreadStruct* sched); -void func_80176370(SchedThreadStruct* sched); -void func_80176394(SchedThreadStruct* sched); -void func_801764F0(SchedThreadStruct* sched); -void func_8017668C(SchedThreadStruct* sched, UNK_PTR puParm2); +void Sched_Nop80176364(SchedContext* sched); +void func_80176370(SchedContext* sched); +void func_80176394(SchedContext* sched); +void func_801764F0(SchedContext* sched); +void func_8017668C(SchedContext* sched, UNK_PTR puParm2); // void func_801766F0(void); // void func_80176748(void); // void func_801767B8(void); // void func_801768E0(void); // void func_8017691C(void); // void func_80176988(void); -void func_80176B34(SchedThreadStruct* sched); -void func_80176C24(SchedThreadStruct* sched); -void func_80176CF4(SchedThreadStruct* sched); -void func_80176F2C(SchedThreadStruct* sched); -void func_80177018(SchedThreadStruct* sched); -void func_8017703C(SchedThreadStruct* sched); -void func_80177060(SchedThreadStruct* sched); -void func_80177084(SchedThreadStruct* sched); -void Sched_ThreadEntry(SchedThreadStruct* sched); +void func_80176B34(SchedContext* sched); +void func_80176C24(SchedContext* sched); +void func_80176CF4(SchedContext* sched); +void func_80176F2C(SchedContext* sched); +void Sched_SendEntryMsg(SchedContext* sched); +void func_8017703C(SchedContext* sched); +void func_80177060(SchedContext* sched); +void func_80177084(SchedContext* sched); +void Sched_ThreadEntry(SchedContext* sched); // void func_80177280(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE1 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11, UNK_TYPE4 param_12); -// void Sched_Start(SchedThreadStruct* sched, void* stack, OSPri pri, UNK_TYPE4 param_4, UNK_TYPE4 param_5, IrqMgr* irqmgrStruct); +// void Sched_Start(SchedContext* sched, void* stack, OSPri pri, UNK_TYPE4 param_4, UNK_TYPE4 param_5, IrqMgr* irqmgrStruct); // void func_80177390(void); void func_801773A0(void* arg0); void func_801773C4(void* arg0); @@ -3644,7 +3644,7 @@ s32 func_80185F90(u32 param_1); // void func_8019075C(void); // void func_8019077C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // void func_80190B08(void); -// void func_80190B38(void); +void func_80190B38(void* callback); // void func_80190B50(void); // void func_80190BB0(void); // void func_80190F50(void); @@ -3676,7 +3676,7 @@ s32 func_80185F90(u32 param_1); // void func_80192AE8(void); // void func_80192B54(void); // void func_80192BAC(void); -// void func_80192BE0(void); +AudioTask* func_80192BE0(void); // void func_80192C00(void); // void func_8019319C(void); // void func_801936D8(void); @@ -3967,7 +3967,7 @@ void audio_setBGM(u32 bgmID); // void func_801A4348(void); // void func_801A4380(void); // void func_801A4428(void); -// void func_801A44A4(void); +void Audio_PreNMI(void); // void func_801A44C4(void); // void func_801A44D4(void); // void func_801A46F8(void); @@ -3977,9 +3977,9 @@ void audio_setBGM(u32 bgmID); // void func_801A48E0(void); // void func_801A4A28(void); // void func_801A4B80(void); -// void func_801A4C30(void); +void func_801A4C30(void); // void func_801A4C54(void); -// void func_801A4D00(void); +void func_801A4D00(void); // void func_801A4D50(void); // void func_801A4DA4(void); // void func_801A4DF4(void); diff --git a/include/variables.h b/include/variables.h index f32aefdfc4..e95d3d7af1 100644 --- a/include/variables.h +++ b/include/variables.h @@ -1669,7 +1669,7 @@ extern u32 D_801D1514[3]; extern s32 gScreenWidth; extern s32 gScreenHeight; // extern UNK_TYPE4 startHeapSize; -extern PadmgrThreadStruct* padmgrContext; +extern PadMgr* padmgrContext; // extern UNK_TYPE4 controllerInputsCaptured; // extern UNK_TYPE4 D_801D1538; extern UNK_PTR D_801D1540; @@ -3443,8 +3443,8 @@ extern u64 lastRenderFrameTimestamp; extern OSMesgQueue siEventCallbackQueue; extern OSMesg siEventCallbackBuffer[1]; extern u32 gSegments[NUM_SEGMENTS]; -extern SchedThreadStruct schedContext; -extern OSMesgQueueListNode mainIrqmgrCallbackNode; +extern SchedContext schedContext; +extern IrqMgrClient mainIrqmgrCallbackNode; extern OSMesgQueue mainIrqmgrCallbackQueue; extern OSMesg mainIrqCallbackBuffer[60]; extern OSThread graphOSThread; @@ -3456,8 +3456,8 @@ extern StackEntry graphStackEntry; extern StackEntry schedStackEntry; extern StackEntry audioStackEntry; extern StackEntry padmgrStackEntry; -extern AudioThreadStruct audioContext; -extern PadmgrThreadStruct D_801FB620; +extern AudioMgr audioContext; +extern PadMgr D_801FB620; // extern UNK_TYPE1 D_801FBAA0; // extern UNK_TYPE1 D_801FBAB0; // extern UNK_TYPE1 D_801FBAB4; diff --git a/include/z64.h b/include/z64.h index ea158b1543..1e67fbffdf 100644 --- a/include/z64.h +++ b/include/z64.h @@ -1221,8 +1221,6 @@ struct FileChooseContext { /* 0x24550 */ s16 unk_24550; }; // size = 0x24558 -typedef struct AudioThreadStruct AudioThreadStruct; - typedef struct GlobalContext GlobalContext; typedef s32 (*ColChkResetFunc)(GlobalContext*, Collider*); @@ -1373,10 +1371,10 @@ typedef enum { QUAKE2_SETUP, } Quake2State; -typedef struct OSMesgQueueListNode_t { - /* 0x0 */ struct OSMesgQueueListNode_t* next; +typedef struct IrqMgrClient_t { + /* 0x0 */ struct IrqMgrClient_t* next; /* 0x4 */ OSMesgQueue* queue; -} OSMesgQueueListNode; // size = 0x8 +} IrqMgrClient; // size = 0x8 typedef struct { /* 0x000 */ OSScMsg verticalRetraceMesg; @@ -1385,7 +1383,7 @@ typedef struct { /* 0x060 */ OSMesgQueue irqQueue; /* 0x078 */ OSMesg irqBuffer[8]; /* 0x098 */ OSThread thread; - /* 0x248 */ OSMesgQueueListNode* callbacks; + /* 0x248 */ IrqMgrClient* callbacks; /* 0x24C */ u8 prenmiStage; /* 0x250 */ OSTime lastPrenmiTime; /* 0x258 */ OSTimer prenmiTimer; @@ -1402,7 +1400,7 @@ typedef struct { /* 0x04C */ OSMesgQueue siEventCallbackQueue; /* 0x064 */ OSMesgQueue lock; /* 0x07C */ OSMesgQueue irqmgrCallbackQueue; - /* 0x094 */ OSMesgQueueListNode irqmgrCallbackQueueNode; + /* 0x094 */ IrqMgrClient irqmgrCallbackQueueNode; /* 0x09C */ IrqMgr* irqmgr; /* 0x0A0 */ OSThread thread; /* 0x250 */ Input input[4]; @@ -1413,13 +1411,23 @@ typedef struct { /* 0x47D */ u8 unk47D; /* 0x47E */ u8 hasStopped; /* 0x47F */ UNK_TYPE1 pad47F[0x1]; -} PadmgrThreadStruct; // size = 0x480 +} PadMgr; // size = 0x480 + +#define OS_SC_NEEDS_RDP 0x0001 +#define OS_SC_NEEDS_RSP 0x0002 +#define OS_SC_DRAM_DLIST 0x0004 +#define OS_SC_PARALLEL_TASK 0x0010 +#define OS_SC_LAST_TASK 0x0020 +#define OS_SC_SWAPBUFFER 0x0040 + +#define OS_SC_RCP_MASK 0x0003 +#define OS_SC_TYPE_MASK 0x0007 typedef struct { - /* 0x000 */ OSMesgQueue unk0; - /* 0x018 */ UNK_TYPE4 unk18[64]; - /* 0x118 */ OSMesgQueue unk118; - /* 0x130 */ UNK_TYPE4 unk130[8]; + /* 0x000 */ OSMesgQueue interruptQ; + /* 0x018 */ OSMesg intMsgBuf[64]; + /* 0x118 */ OSMesgQueue cmdQ; + /* 0x130 */ OSMesg cmdMsgBuf[8]; /* 0x150 */ OSThread thread; /* 0x300 */ UNK_TYPE4 unk300; /* 0x304 */ UNK_TYPE4 unk304; @@ -1433,23 +1441,8 @@ typedef struct { /* 0x324 */ UNK_TYPE4 unk324; /* 0x328 */ UNK_TYPE1 pad328[0x7]; /* 0x32F */ s8 unk32F; - /* 0x330 */ OSMesgQueueListNode unk330; -} SchedThreadStruct; // size = 0x338 - -struct AudioThreadStruct { - /* 0x000 */ IrqMgr* irqmgr; - /* 0x004 */ SchedThreadStruct* sched; - /* 0x008 */ UNK_TYPE1 pad8[0x58]; - /* 0x060 */ UNK_TYPE4 unk60; - /* 0x064 */ OSMesgQueue irqQueue; - /* 0x07C */ OSMesg irqBuffer[30]; - /* 0x0F4 */ OSMesgQueue unkF4; - /* 0x10C */ UNK_TYPE4 unk10C; - /* 0x110 */ OSMesgQueue initDoneCallback; - /* 0x128 */ OSMesg initDoneCallbackMsgBuffer[1]; - /* 0x12C */ UNK_TYPE1 pad12C[0x4]; - /* 0x130 */ OSThread thread; -}; // size = 0x2E0 + /* 0x330 */ IrqMgrClient irqClient; +} SchedContext; // size = 0x338 typedef struct StackEntry_t { /* 0x00 */ struct StackEntry_t* next; @@ -1485,6 +1478,32 @@ struct ActorListEntry { /* 0x8 */ UNK_TYPE1 pad8[0x4]; }; // size = 0xC +#define OS_SC_RETRACE_MSG 1 +#define OS_SC_DONE_MSG 2 +#define OS_SC_NMI_MSG 3 // name is made up, 3 is OS_SC_RDP_DONE_MSG in the original sched.c +#define OS_SC_PRE_NMI_MSG 4 + +typedef struct { + /* 0x0000 */ OSTask task; + /* 0x0040 */ OSMesgQueue* taskQueue; + /* 0x0044 */ char unk_44[0xC]; +} AudioTask; // size = 0x50 + +typedef struct { + /* 0x000 */ IrqMgr* irqMgr; + /* 0x004 */ SchedContext* sched; + /* 0x008 */ OSScTask audioTask; + /* 0x060 */ AudioTask* rspTask; + /* 0x064 */ OSMesgQueue interruptMsgQ; + /* 0x07C */ OSMesg interruptMsgBuf[30]; + /* 0x0F4 */ OSMesgQueue cmdQ; + /* 0x10C */ OSMesg cmdMsgBuf[1]; + /* 0x110 */ OSMesgQueue lockMsgQ; + /* 0x128 */ OSMesg lockMsgBuf[1]; + /* 0x12C */ UNK_TYPE1 pad_12C[0x4]; + /* 0x130 */ OSThread thread; +} AudioMgr; // size = 0x2E0 + typedef struct { /* 0x00 */ MtxF displayMatrix; /* 0x40 */ Actor* actor; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index 1b9f99f455..967e7413db 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -447,7 +447,7 @@ SECTIONS build/src/code/TwoHeadGfxArena.o(.text) build/src/code/TwoHeadArena.o(.text) build/asm/code/code_0x80172BC0.o(.text) - build/asm/code/code_0x80172C30.o(.text) + build/src/code/audioMgr.o(.text) build/src/code/title_setup.o(.text) build/src/code/game.o(.text) build/asm/code/gamealloc.o(.text) @@ -549,7 +549,7 @@ SECTIONS build/asm/code/code_data_z_fbdemo_circle.o(.data) build/asm/code/code_data_z_play.o(.data) build/asm/code/code_data_z_play_hireso.o(.data) - build/asm/code/code_data_0x80172C30.o(.data) + build/src/code/audioMgr.o(.data) build/src/code/game.o(.data) build/asm/code/code_data_graph.o(.data) build/asm/code/code_data_padmgr.o(.data) @@ -623,7 +623,7 @@ SECTIONS build/asm/code/code_rodata_z_play_hireso.o(.rodata) build/asm/code/code_rodata_PreRender.o(.rodata) build/asm/code/code_rodata_0x80172BC0.o(.rodata) - build/asm/code/code_rodata_0x80172C30.o(.rodata) + build/src/code/audioMgr.o(.rodata) build/src/code/game.o(.rodata) build/asm/code/code_rodata_graph.o(.rodata) build/asm/code/code_rodata_main.o(.rodata) diff --git a/src/boot_O2_g3/irqmgr.c b/src/boot_O2_g3/irqmgr.c index 3d592e210d..48bad2c48b 100644 --- a/src/boot_O2_g3/irqmgr.c +++ b/src/boot_O2_g3/irqmgr.c @@ -6,7 +6,7 @@ volatile OSTime sIrqMgrResetTime = 0; volatile OSTime sIrqMgrRetraceTime = 0; s32 sIrqMgrRetraceCount = 0; -void IrqMgr_AddClient(IrqMgr* irqmgr, OSMesgQueueListNode* param_2, OSMesgQueue* param_3) { +void IrqMgr_AddClient(IrqMgr* irqmgr, IrqMgrClient* param_2, OSMesgQueue* param_3) { u32 saveMask; saveMask = osSetIntMask(1); @@ -25,9 +25,9 @@ void IrqMgr_AddClient(IrqMgr* irqmgr, OSMesgQueueListNode* param_2, OSMesgQueue* } } -void IrqMgr_RemoveClient(IrqMgr* irqmgr, OSMesgQueueListNode* remove) { - OSMesgQueueListNode* iter; - OSMesgQueueListNode* last; +void IrqMgr_RemoveClient(IrqMgr* irqmgr, IrqMgrClient* remove) { + IrqMgrClient* iter; + IrqMgrClient* last; u32 saveMask; iter = irqmgr->callbacks; @@ -52,7 +52,7 @@ void IrqMgr_RemoveClient(IrqMgr* irqmgr, OSMesgQueueListNode* remove) { } void IrqMgr_SendMesgForClient(IrqMgr* irqmgr, OSMesg msg) { - OSMesgQueueListNode* iter = irqmgr->callbacks; + IrqMgrClient* iter = irqmgr->callbacks; while (iter != NULL) { osSendMesg(iter->queue, msg, 0); @@ -61,7 +61,7 @@ void IrqMgr_SendMesgForClient(IrqMgr* irqmgr, OSMesg msg) { } void IrqMgr_JamMesgForClient(IrqMgr* irqmgr, OSMesg msg) { - OSMesgQueueListNode* iter = irqmgr->callbacks; + IrqMgrClient* iter = irqmgr->callbacks; while (iter != NULL) { if (iter->queue->validCount < iter->queue->msgCount) { diff --git a/src/code/audioMgr.c b/src/code/audioMgr.c new file mode 100644 index 0000000000..c1a7b753c2 --- /dev/null +++ b/src/code/audioMgr.c @@ -0,0 +1,136 @@ +#include "global.h" + +void func_80172C30(AudioMgr* audioMgr) { + AudioTask* task = audioMgr->rspTask; + + if (audioMgr->rspTask->taskQueue != NULL) { + osSendMesg(task->taskQueue, NULL, OS_MESG_BLOCK); + } +} + +void AudioMgr_HandleRetrace(AudioMgr* audioMgr) { + static s32 retryCount = 10; + AudioTask* rspTask; + s32 timerMsgVal = 666; + OSTimer timer; + s32 msg; + + if (SREG(20) > 0) { + audioMgr->rspTask = NULL; + } + + while (audioMgr->cmdQ.validCount != 0) { + osRecvMesg(&audioMgr->cmdQ, NULL, OS_MESG_NOBLOCK); + } + + if (audioMgr->rspTask != NULL) { + audioMgr->audioTask.next = NULL; + audioMgr->audioTask.flags = OS_SC_NEEDS_RSP; + audioMgr->audioTask.framebuffer = NULL; + + audioMgr->audioTask.list = audioMgr->rspTask->task; + audioMgr->audioTask.msgQ = &audioMgr->cmdQ; + + audioMgr->audioTask.msg = NULL; + osSendMesg(&audioMgr->sched->cmdQ, &audioMgr->audioTask, OS_MESG_BLOCK); + Sched_SendEntryMsg(audioMgr->sched); + } + + if (SREG(20) >= 2) { + rspTask = NULL; + } else { + rspTask = func_80192BE0(); + } + + if (audioMgr->rspTask != NULL) { + while (true) { + osSetTimer(&timer, OS_USEC_TO_CYCLES(32000), 0, &audioMgr->cmdQ, (OSMesg)timerMsgVal); + osRecvMesg(&audioMgr->cmdQ, (OSMesg*)&msg, OS_MESG_BLOCK); + osStopTimer(&timer); + if (msg == timerMsgVal) { + Fault_Log("AUDIO SP TIMEOUT %08x %08x\n", audioMgr->rspTask, audioMgr->rspTask->task); + if (retryCount >= 0) { + retryCount--; + func_8017703C(audioMgr->sched); + } else { + Fault_Log("audioMgr.c:もうダメ!死ぬ!\n"); + osDestroyThread(NULL); + break; + } + } else { + break; + } + } + + func_80172C30(audioMgr); + } + + audioMgr->rspTask = rspTask; +} + +void AudioMgr_HandlePRENMI(AudioMgr* audioMgr) { + Audio_PreNMI(); +} + +void AudioMgr_ThreadEntry(void* arg) { + AudioMgr* audioMgr = (AudioMgr*)arg; + IrqMgrClient irqClient; + s16* msg = NULL; + s32 exit; + + func_801A4C30(); + func_80190B38(DmaMgr_DmaCallback0); + func_801A4D00(); + osSendMesg(&audioMgr->lockMsgQ, NULL, OS_MESG_BLOCK); + IrqMgr_AddClient(audioMgr->irqMgr, &irqClient, &audioMgr->interruptMsgQ); + + exit = false; + while (!exit) { + osRecvMesg(&audioMgr->interruptMsgQ, (OSMesg*)&msg, OS_MESG_BLOCK); + switch (*msg) { + case OS_SC_RETRACE_MSG: + AudioMgr_HandleRetrace(audioMgr); + while (audioMgr->interruptMsgQ.validCount != 0) { + osRecvMesg(&audioMgr->interruptMsgQ, (OSMesg*)&msg, OS_MESG_BLOCK); + switch (*msg) { + case OS_SC_RETRACE_MSG: + break; + case OS_SC_PRE_NMI_MSG: + AudioMgr_HandlePRENMI(audioMgr); + break; + case OS_SC_NMI_MSG: + exit = true; + break; + } + } + break; + case OS_SC_PRE_NMI_MSG: + AudioMgr_HandlePRENMI(audioMgr); + break; + case OS_SC_NMI_MSG: + exit = true; + break; + } + } + + IrqMgr_RemoveClient(audioMgr->irqMgr, &irqClient); +} + +void AudioMgr_Unlock(AudioMgr* audioMgr) { + osRecvMesg(&audioMgr->lockMsgQ, NULL, OS_MESG_BLOCK); +} + +void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr) { + bzero(audioMgr, sizeof(AudioMgr)); + + audioMgr->sched = sched; + audioMgr->irqMgr = irqMgr; + audioMgr->rspTask = NULL; + + osCreateMesgQueue(&audioMgr->cmdQ, audioMgr->cmdMsgBuf, ARRAY_COUNT(audioMgr->cmdMsgBuf)); + osCreateMesgQueue(&audioMgr->interruptMsgQ, audioMgr->interruptMsgBuf, ARRAY_COUNT(audioMgr->interruptMsgBuf)); + osCreateMesgQueue(&audioMgr->lockMsgQ, audioMgr->lockMsgBuf, ARRAY_COUNT(audioMgr->lockMsgBuf)); + + osCreateThread(&audioMgr->thread, id, AudioMgr_ThreadEntry, audioMgr, stack, pri); + osStartThread(&audioMgr->thread); +} diff --git a/tables/functions.txt b/tables/functions.txt index 174602b89e..ba61e27e63 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -3120,11 +3120,11 @@ 0x80172B9C:("THA_Dt",), 0x80172BC0:("func_80172BC0",), 0x80172C30:("func_80172C30",), - 0x80172C68:("func_80172C68",), - 0x80172EAC:("Audio_Stop",), - 0x80172ED0:("Audio_ThreadEntry",), - 0x80173048:("Audio_WaitForInit",), - 0x80173074:("Audio_Start",), + 0x80172C68:("AudioMgr_HandleRetrace",), + 0x80172EAC:("AudioMgr_HandlePRENMI",), + 0x80172ED0:("AudioMgr_ThreadEntry",), + 0x80173048:("AudioMgr_Unlock",), + 0x80173074:("AudioMgr_Init",), 0x80173130:("TitleSetup_GameStateResetContext",), 0x801732DC:("TitleSetup_InitImpl",), 0x8017332C:("TitleSetup_Destroy",), @@ -3218,7 +3218,7 @@ 0x80176C24:("func_80176C24",), 0x80176CF4:("func_80176CF4",), 0x80176F2C:("func_80176F2C",), - 0x80177018:("func_80177018",), + 0x80177018:("Sched_SendEntryMsg",), 0x8017703C:("func_8017703C",), 0x80177060:("func_80177060",), 0x80177084:("func_80177084",), @@ -4005,7 +4005,7 @@ 0x801A4348:("func_801A4348",), 0x801A4380:("func_801A4380",), 0x801A4428:("func_801A4428",), - 0x801A44A4:("func_801A44A4",), + 0x801A44A4:("Audio_PreNMI",), 0x801A44C4:("func_801A44C4",), 0x801A44D4:("func_801A44D4",), 0x801A46F8:("func_801A46F8",), diff --git a/tables/objects.txt b/tables/objects.txt index 9bc7e53f22..b600ee724b 100644 --- a/tables/objects.txt +++ b/tables/objects.txt @@ -351,7 +351,7 @@ 0x801727F0:"TwoHeadGfxArena", 0x80172A00:"TwoHeadArena", 0x80172BC0:"", - 0x80172C30:"", + 0x80172C30:"audioMgr", 0x80173130:"game", 0x80173BF0:"gamealloc", 0x80173D30:"graph", diff --git a/tables/variables.txt b/tables/variables.txt index 17d1c5c492..fe9738ada0 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -2265,7 +2265,7 @@ 0x801D1520:("gScreenWidth","s32","",0x4), 0x801D1524:("gScreenHeight","s32","",0x4), 0x801D1528:("startHeapSize","UNK_TYPE4","",0x4), - 0x801D1530:("padmgrContext","PadmgrThreadStruct*","",0x4), + 0x801D1530:("padmgrContext","PadMgr*","",0x4), 0x801D1534:("controllerInputsCaptured","UNK_TYPE4","",0x4), 0x801D1538:("D_801D1538","UNK_TYPE4","",0x4), 0x801D1540:("D_801D1540","UNK_PTR","",0x4), @@ -4210,8 +4210,8 @@ 0x801F8160:("siEventCallbackQueue","OSMesgQueue","",0x18), 0x801F8178:("siEventCallbackBuffer","OSMesg","[1]",0x4), 0x801F8180:("gSegments","u32","[16]",0x40), - 0x801F81C0:("schedContext","SchedThreadStruct","",0x338), - 0x801F84F8:("mainIrqmgrCallbackNode","OSMesgQueueListNode","",0x8), + 0x801F81C0:("schedContext","SchedContext","",0x338), + 0x801F84F8:("mainIrqmgrCallbackNode","IrqMgrClient","",0x8), 0x801F8500:("mainIrqmgrCallbackQueue","OSMesgQueue","",0x18), 0x801F8518:("mainIrqCallbackBuffer","OSMesg","[60]",0xf0), 0x801F8608:("graphOSThread","OSThread","",0x1b0), @@ -4223,8 +4223,8 @@ 0x801FB2D8:("schedStackEntry","StackEntry","",0x1c), 0x801FB2F8:("audioStackEntry","StackEntry","",0x1c), 0x801FB318:("padmgrStackEntry","StackEntry","",0x1c), - 0x801FB338:("audioContext","AudioThreadStruct","",0x2e0), - 0x801FB620:("D_801FB620","PadmgrThreadStruct","",0x480), + 0x801FB338:("audioContext","AudioMgr","",0x2e0), + 0x801FB620:("D_801FB620","PadMgr","",0x480), 0x801FBAA0:("D_801FBAA0","UNK_TYPE1","",0x1), 0x801FBAB0:("D_801FBAB0","UNK_TYPE1","",0x1), 0x801FBAB4:("D_801FBAB4","UNK_TYPE1","",0x1),