Files
tww/src/JSystem/JAudio/JASAudioThread.cpp
T
LagoLunatic d5a3227301 misc matches
2024-02-02 01:24:11 -05:00

141 lines
4.3 KiB
C++

//
// Generated by dtk
// Translation Unit: JASAudioThread.cpp
//
#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;
OSMessage JASystem::TAudioThread::saAudioMsgBuf[16];
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);
}
}
/* 80288F88-80289130 .text audioproc__Q28JASystem12TAudioThreadFPv */
void* JASystem::TAudioThread::audioproc(void*) {
JKRThread thread(&sAudioThread, 0);
OSInitFastCast();
OSInitMessageQueue(&sAudioprocMQ, saAudioMsgBuf, 16);
sAudioprocMQInit = 1;
Kernel::init();
TDSP_DACBuffer::init();
if (!sbIsDSPBoot) {
DspBoot(syncDSP);
sbIsDSPBoot = 1;
}
Driver::init();
AISetDSPSampleRate(Kernel::getAiSetting());
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*) {
while (!DSPCheckMailFromDSP()) {}
u32 var1 = DSPReadMailFromDSP();
if (var1 >> 16 != DSPInterface::JAS_DSP_PREFIX) {
OSReport("----- syncDSP : Mail format error %x\n", var1);
return;
}
switch (var1 & 0xff00) {
case 0xff00:
if (sAudioprocMQInit) {
if (!OSSendMessage(&sAudioprocMQ, OSMessage(1), OS_MESSAGE_NOBLOCK)) {
OSReport("----- syncDSP : Send Miss\n");
}
} else {
DSPReleaseHalt();
}
break;
default:
DspFinishWork(var1);
break;
}
}
/* 802891F0-8028920C .text setPriority__Q28JASystem12TAudioThreadFUcUc */
void JASystem::TAudioThread::setPriority(u8 dspPrio, u8 dvdPrio) {
sbIsPrioritySet = 1;
sDSPPrio = dspPrio;
sDVDPrio = dvdPrio;
}
/* 8028920C-802892E0 .text start__Q28JASystem12TAudioThreadFP12JKRSolidHeapUlUl */
void JASystem::TAudioThread::start(JKRSolidHeap* heap, u32 aramSize, u32 flag) {
if (!sbIsPrioritySet) {
s32 priority = OSGetThreadPriority(OSGetCurrentThread()) - 3;
sDSPPrio = priority;
sDVDPrio = priority - 1;
}
Kernel::sysDramSetup(heap);
Kernel::sysAramSetup(aramSize);
Dvd::createThread(sDVDPrio, 0x5a, 0x1000);
Dvd::resumeThread();
Kernel::stackInit((u64*)saAudioStack, 0x200);
if ((flag & 2)) {
OSCreateThread(&sAudioThread, audioproc, NULL, &saAudioStack[sizeof(saAudioStack)], sizeof(saAudioStack), sDSPPrio, 1);
OSResumeThread(&sAudioThread);
}
}