summaryrefslogtreecommitdiff
path: root/src/code/audio_thread_manager.c
diff options
context:
space:
mode:
authorengineer124 <47598039+engineer124@users.noreply.github.com>2023-07-07 07:55:10 +1000
committerGitHub <noreply@github.com>2023-07-06 17:55:10 -0400
commitd307a3723313507726d5ebcfda0b5b9cef224d91 (patch)
tree0323cee010466202839a01911697709e8a10e989 /src/code/audio_thread_manager.c
parent0ce03133425867723dd81fc66f57bbb8d40aaf7a (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.c106
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);
+}