Files
tww/src/JSystem/JAudio/JASDSPBuf.cpp
T
2026-10-27 00:29:52 -04:00

118 lines
3.7 KiB
C++

//
// Generated by dtk
// Translation Unit: JASDSPBuf.cpp
//
#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/JAudio/JASDSPBuf.h"
#include "JSystem/JAudio/JASAudioThread.h"
#include "JSystem/JAudio/JASCallback.h"
#include "JSystem/JAudio/JASDSPChannel.h"
#include "JSystem/JAudio/JASDSPInterface.h"
#include "JSystem/JAudio/JASProbe.h"
#include "JSystem/JAudio/JASRate.h"
#include "JSystem/JAudio/JASSystemHeap.h"
#include "JSystem/JAudio/osdsp_task.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "dolphin/os/OS.h"
#include "global.h"
u8 JASystem::TDSP_DACBuffer::numDSPBuf = 3;
int JASystem::TDSP_DACBuffer::isInit;
s16** JASystem::TDSP_DACBuffer::dsp_buf;
u8 JASystem::TDSP_DACBuffer::writeBuffer;
u8 JASystem::TDSP_DACBuffer::readBuffer;
u8 JASystem::TDSP_DACBuffer::dspStatus;
static void dummy() {
DEAD_STRING("----- JASDSPBuf : DSP-DAC バッファの数を %d にしました\n");
}
/* 802892E0-802893E4 .text init__Q28JASystem14TDSP_DACBufferFv */
void JASystem::TDSP_DACBuffer::init() {
if (!isInit) {
u32 frameSamples = Kernel::getFrameSamples();
writeBuffer = numDSPBuf - 1;
readBuffer = 0;
dsp_buf = new (JASDram, 0x20) s16*[numDSPBuf];
for (int i = 0; i < numDSPBuf; i++) {
dsp_buf[i] = new (JASDram, 0x20) s16[frameSamples * 2];
for (u32 j = 0; j < frameSamples * 2; j++) {
dsp_buf[i][j] = 0;
}
DCStoreRange(dsp_buf[i], frameSamples * 4);
}
OSReport("DSP_DAC buffer size : %d\n", frameSamples * 2);
dspStatus = 0;
isInit = 1;
}
}
int JASystem::TDSP_DACBuffer::dacSyncCounter;
/* 802893E4-80289438 .text updateDSP__Q28JASystem14TDSP_DACBufferFv */
void JASystem::TDSP_DACBuffer::updateDSP() {
dacSyncCounter++;
Kernel::probeStart(3, "SFR-UPDATE");
DSPInterface::invalChannelAll();
Kernel::subframeCallback();
TDSPChannel::updateAll();
Kernel::aiCallback();
Kernel::probeFinish(3);
}
/* 80289438-80289568 .text mixDSP__Q28JASystem14TDSP_DACBufferFl */
s16* JASystem::TDSP_DACBuffer::mixDSP(s32) {
u8 var4 = readBuffer + 1;
u32 frameSamples = Kernel::getFrameSamples();
if (var4 == numDSPBuf) {
var4 = 0;
}
if (var4 == writeBuffer && numDSPBuf >= 3) {
s16 var1 = dsp_buf[readBuffer][frameSamples / 2 - 1];
s16 var2 = dsp_buf[readBuffer][frameSamples - 1];
for (u32 i = 0; i < frameSamples; i++) {
dsp_buf[readBuffer][i] = var1;
}
for (u32 i = frameSamples; i < frameSamples * 2; i++) {
dsp_buf[readBuffer][i] = var2;
}
if (dspStatus == 0) {
OSReport("----- JASDSPBuf::process DACSYNC -- DSP Wait\n");
finishDSPFrame();
}
} else {
readBuffer = var4;
DCInvalidateRange(dsp_buf[readBuffer], frameSamples * 4);
if (dspStatus == 0) {
finishDSPFrame();
}
}
return dsp_buf[readBuffer];
}
void (*JASystem::TDSP_DACBuffer::callback)(s16*, u32);
/* 80289568-8028963C .text finishDSPFrame__Q28JASystem14TDSP_DACBufferFv */
void JASystem::TDSP_DACBuffer::finishDSPFrame() {
u8 var2 = writeBuffer + 1;
u32 frameSamples = Kernel::getFrameSamples();
if (var2 == numDSPBuf) {
var2 = 0;
}
if (var2 == readBuffer) {
dspStatus = 0;
return;
}
writeBuffer = var2;
TAudioThread::setDSPSyncCount(Kernel::getSubFrames());
Kernel::probeStart(7, "DSP-MAIN");
DsyncFrame2(Kernel::getSubFrames(), u32(dsp_buf[writeBuffer]), u32(&dsp_buf[writeBuffer][frameSamples]));
dspStatus = 1;
updateDSP();
if (callback) {
callback(dsp_buf[writeBuffer], frameSamples);
}
}