summaryrefslogtreecommitdiff
path: root/src/JSystem/JAudio/JASAudioThread.cpp
diff options
context:
space:
mode:
authorJcw87 <Jcw87@users.noreply.github.com>2023-10-22 23:51:13 -0700
committerJcw87 <Jcw87@users.noreply.github.com>2023-10-23 00:05:07 -0700
commitf06341af41e3a81758e5efeea733b81be4400946 (patch)
tree9d1d83fd89cf51bffddbb1d34088ed170d4dd565 /src/JSystem/JAudio/JASAudioThread.cpp
parenta9280b86cfc0e890e4c0c29bf53525fb36ce2fce (diff)
JASAiCtrl, JASAudioThread, JASDSPBuf, JASDSPChannel, JASDriverIF
Diffstat (limited to 'src/JSystem/JAudio/JASAudioThread.cpp')
-rw-r--r--src/JSystem/JAudio/JASAudioThread.cpp121
1 files changed, 114 insertions, 7 deletions
diff --git a/src/JSystem/JAudio/JASAudioThread.cpp b/src/JSystem/JAudio/JASAudioThread.cpp
index 622dcfe3..198ce4ce 100644
--- a/src/JSystem/JAudio/JASAudioThread.cpp
+++ b/src/JSystem/JAudio/JASAudioThread.cpp
@@ -3,31 +3,138 @@
// Translation Unit: JASAudioThread.cpp
//
-#include "JASAudioThread.h"
-#include "dolphin/types.h"
+#include "JSystem/JAudio/JASAudioThread.h"
+#include "JSystem/JAudio/JASAiCtrl.h"
+#include "JSystem/JAudio/JASDSPBuf.h"
+#include "JSystem/JAudio/JASDSPInterface.h"
+#include "JSystem/JAudio/JASDriverIF.h"
+#include "JSystem/JAudio/JASDvdThread.h"
+#include "JSystem/JAudio/JASKernelDebug.h"
+#include "JSystem/JAudio/JASProbe.h"
+#include "JSystem/JAudio/JASRate.h"
+#include "JSystem/JAudio/JASSystemHeap.h"
+#include "JSystem/JAudio/dspproc.h"
+#include "JSystem/JAudio/dsptask.h"
+#include "JSystem/JKernel/JKRThread.h"
+#include "JSystem/JUtility/JUTAssert.h"
+#include "dolphin/ai/ai.h"
+
+OSThread JASystem::TAudioThread::sAudioThread;
+u8 JASystem::TAudioThread::saAudioStack[4096];
+OSMessageQueue JASystem::TAudioThread::sAudioprocMQ;
+
+u32 JASystem::TAudioThread::sAudioprocMQInit;
+int JASystem::TAudioThread::sbIsPrioritySet;
+s32 JASystem::TAudioThread::sDSPPrio;
+s32 JASystem::TAudioThread::sDVDPrio;
+vs32 JASystem::TAudioThread::snIntCount;
+int JASystem::TAudioThread::sbIsDSPBoot;
/* 80288F08-80288F88 .text syncAudio__Q28JASystem12TAudioThreadFv */
void JASystem::TAudioThread::syncAudio() {
+ static u32 first = 1;
+ if (first == 0) {
+ Kernel::probeFinish(4);
+ }
+ first = 0;
+ Kernel::probeStart(4, "UPDATE-DAC");
+ if (sAudioprocMQInit) {
+ OSSendMessage(&sAudioprocMQ, NULL, OS_MESSAGE_NOBLOCK);
+ }
/* Nonmatching */
}
/* 80288F88-80289130 .text audioproc__Q28JASystem12TAudioThreadFPv */
-void JASystem::TAudioThread::audioproc(void*) {
+void* JASystem::TAudioThread::audioproc(void*) {
/* Nonmatching */
+ JKRThread thread(&sAudioThread, 0);
+ i_OSInitFastCast();
+ OSInitMessageQueue(&sAudioprocMQ, saAudioMsgBuf, 16);
+ sAudioprocMQInit = 1;
+ Kernel::init();
+ TDSP_DACBuffer::init();
+ if (!sbIsDSPBoot) {
+ DspBoot(syncDSP);
+ sbIsDSPBoot = 1;
+ }
+ Driver::init();
+ AISetDSPSampleRate(Kernel::gAiSetting);
+ AIRegisterDMACallback(syncAudio);
+ AIStartDMA();
+ while (true) {
+ OSMessage message;
+ OSReceiveMessage(&sAudioprocMQ, &message, 1);
+ switch (int(message)) {
+ case 0:
+ Kernel::updateDac();
+ break;
+ case 1:
+ JUT_ASSERT(145, snIntCount != 0);
+ snIntCount--;
+ if (snIntCount == 0) {
+ Kernel::probeFinish(7);
+ TDSP_DACBuffer::finishDSPFrame();
+ } else {
+ Kernel::probeStart(2, (char*)"SFR_DSP");
+ TDSP_DACBuffer::updateDSP();
+ Kernel::probeFinish(2);
+ }
+ break;
+ case 2:
+ break;
+ case 3:
+ OSReport("----- Audio thread stops\n");
+ OSExitThread(0);
+ break;
+ }
+ }
+ return NULL;
}
/* 80289130-802891F0 .text syncDSP__Q28JASystem12TAudioThreadFPv */
void JASystem::TAudioThread::syncDSP(void*) {
/* Nonmatching */
+ while (!DSPCheckMailFromDSP()) {}
+ u32 var1 = DSPReadMailFromDSP();
+ if (var1 >> 16 != DSPInterface::JAS_DSP_PREFIX) {
+ OSReport("----- syncDSP : Mail format error %x\n");
+ return;
+ }
+ if ((var1 & 0xff00) == 0xff00) {
+ if (sAudioprocMQInit) {
+ if (!OSSendMessage(&sAudioprocMQ, OSMessage(1), OS_MESSAGE_NOBLOCK)) {
+ OSReport("----- syncDSP : Send Miss\n");
+ }
+ } else {
+ DSPReleaseHalt();
+ }
+ } else {
+ DspFinishWork(var1);
+ }
}
/* 802891F0-8028920C .text setPriority__Q28JASystem12TAudioThreadFUcUc */
-void JASystem::TAudioThread::setPriority(unsigned char, unsigned char) {
- /* Nonmatching */
+void JASystem::TAudioThread::setPriority(u8 param_1, u8 param_2) {
+ sbIsPrioritySet = 1;
+ sDSPPrio = param_1;
+ sDVDPrio = param_2;
}
/* 8028920C-802892E0 .text start__Q28JASystem12TAudioThreadFP12JKRSolidHeapUlUl */
-void JASystem::TAudioThread::start(JKRSolidHeap*, unsigned long, unsigned long) {
+void JASystem::TAudioThread::start(JKRSolidHeap* param_1, u32 param_2, u32 param_3) {
/* Nonmatching */
+ if (!sbIsPrioritySet) {
+ s32 priority = OSGetThreadPriority(OSGetCurrentThread());
+ sDSPPrio = priority - 3;
+ sDVDPrio = priority - 1;
+ }
+ Kernel::sysDramSetup(param_1);
+ Kernel::sysAramSetup(param_2);
+ Dvd::createThread(sDVDPrio, 0x5a, 0x1000);
+ Dvd::resumeThread();
+ Kernel::stackInit((u64*)saAudioStack, 0x200);
+ if ((param_3 & 2)) {
+ OSCreateThread(&sAudioThread, audioproc, NULL, &saAudioStack[sizeof(saAudioStack)], sizeof(saAudioStack), sDSPPrio, 1);
+ OSResumeThread(&sAudioThread);
+ }
}
-