diff options
| author | engineer124 <47598039+engineer124@users.noreply.github.com> | 2023-07-07 07:55:10 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-06 17:55:10 -0400 |
| commit | d307a3723313507726d5ebcfda0b5b9cef224d91 (patch) | |
| tree | 0323cee010466202839a01911697709e8a10e989 /src/code/audio_thread_manager.c | |
| parent | 0ce03133425867723dd81fc66f57bbb8d40aaf7a (diff) | |
Reorganize Audio Files & Name Remaining Audio Files (#1494)
* reorganize audio files
* audio code files
* split audio and libaudio
* audio_init_params to audio_configuration
* simplify file names
* move aisetnextbuf to libaudio
* move src/audio -> src/code/audio
* adjust makefile comment
* reorganize again into internal/external
* adjust comment
* restructure again
Diffstat (limited to 'src/code/audio_thread_manager.c')
| -rw-r--r-- | src/code/audio_thread_manager.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/code/audio_thread_manager.c b/src/code/audio_thread_manager.c new file mode 100644 index 000000000..01bf54397 --- /dev/null +++ b/src/code/audio_thread_manager.c @@ -0,0 +1,106 @@ +#include "global.h" + +void func_800C3C80(AudioMgr* audioMgr) { + AudioTask* task = audioMgr->rspTask; + + if (audioMgr->rspTask->msgQueue != NULL) { + osSendMesg(task->msgQueue, NULL, OS_MESG_BLOCK); + } +} + +void AudioMgr_HandleRetrace(AudioMgr* audioMgr) { + AudioTask* rspTask; + + if (SREG(20) > 0) { + audioMgr->rspTask = NULL; + } + 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.msgQueue = &audioMgr->taskQueue; + + audioMgr->audioTask.msg = NULL; + osSendMesg(&audioMgr->sched->cmdQueue, (OSMesg)&audioMgr->audioTask, OS_MESG_BLOCK); + Sched_Notify(audioMgr->sched); + } + + gAudioThreadUpdateTimeStart = osGetTime(); + if (SREG(20) >= 2) { + rspTask = NULL; + } else { + rspTask = func_800E4FE0(); + } + gAudioThreadUpdateTimeAcc += osGetTime() - gAudioThreadUpdateTimeStart; + gAudioThreadUpdateTimeStart = 0; + + if (audioMgr->rspTask != NULL) { + osRecvMesg(&audioMgr->taskQueue, NULL, OS_MESG_BLOCK); + func_800C3C80(audioMgr); + } + audioMgr->rspTask = rspTask; +} + +void AudioMgr_HandlePreNMI(AudioMgr* audioMgr) { + // "Audio manager received OS_SC_PRE_NMI_MSG" + osSyncPrintf("オーディオマネージャが OS_SC_PRE_NMI_MSG を受け取りました\n"); + Audio_PreNMI(); +} + +void AudioMgr_ThreadEntry(void* arg0) { + AudioMgr* audioMgr = (AudioMgr*)arg0; + IrqMgrClient irqClient; + s16* msg = NULL; + + osSyncPrintf("オーディオマネージャスレッド実行開始\n"); // "Start running audio manager thread" + Audio_Init(); + AudioLoad_SetDmaHandler(DmaMgr_AudioDmaHandler); + Audio_InitSound(); + osSendMesg(&audioMgr->lockQueue, NULL, OS_MESG_BLOCK); + IrqMgr_AddClient(audioMgr->irqMgr, &irqClient, &audioMgr->interruptQueue); + + while (true) { + osRecvMesg(&audioMgr->interruptQueue, (OSMesg*)&msg, OS_MESG_BLOCK); + switch (*msg) { + case OS_SC_RETRACE_MSG: + AudioMgr_HandleRetrace(audioMgr); + while (!MQ_IS_EMPTY(&audioMgr->interruptQueue)) { + osRecvMesg(&audioMgr->interruptQueue, (OSMesg*)&msg, OS_MESG_BLOCK); + switch (*msg) { + case OS_SC_RETRACE_MSG: + break; + case OS_SC_PRE_NMI_MSG: + AudioMgr_HandlePreNMI(audioMgr); + break; + } + } + break; + case OS_SC_PRE_NMI_MSG: + AudioMgr_HandlePreNMI(audioMgr); + break; + } + } +} + +void AudioMgr_Unlock(AudioMgr* audioMgr) { + osRecvMesg(&audioMgr->lockQueue, NULL, OS_MESG_BLOCK); +} + +void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, Scheduler* sched, IrqMgr* irqMgr) { + bzero(audioMgr, sizeof(AudioMgr)); + + audioMgr->sched = sched; + audioMgr->irqMgr = irqMgr; + audioMgr->rspTask = NULL; + + osCreateMesgQueue(&audioMgr->taskQueue, audioMgr->taskMsgBuf, ARRAY_COUNT(audioMgr->taskMsgBuf)); + osCreateMesgQueue(&audioMgr->interruptQueue, audioMgr->interruptMsgBuf, ARRAY_COUNT(audioMgr->interruptMsgBuf)); + osCreateMesgQueue(&audioMgr->lockQueue, audioMgr->lockMsgBuf, ARRAY_COUNT(audioMgr->lockMsgBuf)); + + osSendMesg(&audioMgr->taskQueue, NULL, OS_MESG_BLOCK); + + osCreateThread(&audioMgr->thread, id, AudioMgr_ThreadEntry, audioMgr, stack, pri); + osStartThread(&audioMgr->thread); +} |
