mirror of
https://github.com/open-goal/jak-project
synced 2026-07-01 04:10:32 -04:00
201 lines
6.2 KiB
C++
201 lines
6.2 KiB
C++
#include "vblank_handler.h"
|
|
|
|
#include <cstring>
|
|
|
|
#include "common/log/log.h"
|
|
#include "common/util/Assert.h"
|
|
|
|
#include "game/overlord/jak3/dma.h"
|
|
#include "game/overlord/jak3/iso.h"
|
|
#include "game/overlord/jak3/sbank.h"
|
|
#include "game/overlord/jak3/srpc.h"
|
|
#include "game/overlord/jak3/ssound.h"
|
|
#include "game/overlord/jak3/streamlist.h"
|
|
#include "game/overlord/jak3/vag.h"
|
|
#include "game/sce/iop.h"
|
|
|
|
namespace jak3 {
|
|
using namespace iop;
|
|
u32 g_nInfoEE = 0;
|
|
SoundIOPInfo g_SRPCSoundIOPInfo;
|
|
bool g_bVBlankInitialized = false;
|
|
s32 g_nVBlankThreadID = -1;
|
|
s32 g_nVBlankSemaphoreID = -1;
|
|
bool g_bVBlankRegistered = false;
|
|
u32 g_nIopTicks = 0;
|
|
u32 g_nFrameNum = 0;
|
|
void jak3_overlord_init_globals_vblank_handler() {
|
|
g_nInfoEE = 0;
|
|
g_SRPCSoundIOPInfo = {};
|
|
g_bVBlankInitialized = false;
|
|
g_nVBlankThreadID = -1;
|
|
g_nVBlankSemaphoreID = -1;
|
|
g_bVBlankRegistered = false;
|
|
g_nIopTicks = 0;
|
|
g_nFrameNum = 0;
|
|
}
|
|
|
|
int VBlankHandler(void*);
|
|
u32 VBlankThread();
|
|
|
|
void VBlank_Initialize() {
|
|
ThreadParam thread_param;
|
|
SemaParam sema_param;
|
|
|
|
if (g_bVBlankInitialized == 0) {
|
|
thread_param.attr = 0x2000000;
|
|
thread_param.stackSize = 0x800;
|
|
thread_param.initPriority = 0x34;
|
|
thread_param.option = 0;
|
|
thread_param.entry = VBlankThread;
|
|
strcpy(thread_param.name, "vblank");
|
|
g_nVBlankThreadID = CreateThread(&thread_param);
|
|
ASSERT(g_nVBlankThreadID >= 0);
|
|
sema_param.max_count = 200; // hack
|
|
sema_param.attr = 0;
|
|
sema_param.init_count = 0;
|
|
sema_param.option = 0;
|
|
g_nVBlankSemaphoreID = CreateSema(&sema_param);
|
|
ASSERT(g_nVBlankSemaphoreID >= 0);
|
|
int ret = StartThread(g_nVBlankThreadID, 0);
|
|
ASSERT(ret == 0);
|
|
RegisterVblankHandler(0, 0x40, VBlankHandler, 0);
|
|
g_bVBlankInitialized = true;
|
|
g_bVBlankRegistered = true;
|
|
}
|
|
}
|
|
|
|
int VBlankHandler(void*) {
|
|
if ((g_bVBlankInitialized != 0) && (-1 < g_nVBlankSemaphoreID)) {
|
|
SignalSema(g_nVBlankSemaphoreID); // was iSignalSema
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
u32 VBlankThread() {
|
|
// char *pcVar1;
|
|
// int iVar2;
|
|
// uint uVar3;
|
|
// SoundBankInfo *pSVar4;
|
|
// ISO_VAGCommand *cmd;
|
|
// SoundBankInfo **ppSVar5;
|
|
// uint *puVar6;
|
|
// uint uVar7;
|
|
// int iVar8;
|
|
// int iVar9;
|
|
// SoundIOPInfo *local_30;
|
|
// void *local_2c;
|
|
// undefined4 local_28;
|
|
// undefined4 local_24;
|
|
// undefined4 local_20 [2];
|
|
|
|
do {
|
|
while ((g_bVBlankInitialized == 0 || (g_nVBlankSemaphoreID < 0))) {
|
|
DelayThread(1000000);
|
|
}
|
|
WaitSema(g_nVBlankSemaphoreID);
|
|
g_nIopTicks = g_nIopTicks + 1;
|
|
if (g_bSoundEnable != 0) {
|
|
CheckVagStreamsProgress();
|
|
if ((g_nIopTicks & 1U) != 0) {
|
|
StreamListThread();
|
|
}
|
|
if (g_nMusicFadeDir < 0) {
|
|
g_nMusicFade = g_nMusicFade + -0x200;
|
|
if (g_nMusicFade < 0) {
|
|
g_nMusicFade = 0;
|
|
LAB_00011f60:
|
|
g_nMusicFadeDir = 0;
|
|
}
|
|
} else {
|
|
if ((0 < g_nMusicFadeDir) &&
|
|
(g_nMusicFade = g_nMusicFade + 0x400, 0x10000 < g_nMusicFade)) {
|
|
g_nMusicFade = 0x10000;
|
|
goto LAB_00011f60;
|
|
}
|
|
}
|
|
if (g_nInfoEE) {
|
|
g_nFrameNum = g_nFrameNum + 1;
|
|
// puVar6 = g_SRPCSoundIOPInfo.stream_status;
|
|
for (int i = 0; i < 4; i++) {
|
|
auto* cmd = &g_aVagCmds[i];
|
|
u32 stream_status = cmd->pack_flags();
|
|
|
|
if ((cmd->flags.file_disappeared != 0) && (cmd->flags.paused == 0)) {
|
|
auto uVar3 = CalculateVAGPitch(0x400, cmd->pitch_cmd);
|
|
if (g_nFPS == 0) {
|
|
ASSERT_NOT_REACHED();
|
|
}
|
|
cmd->clockd = cmd->clockd + uVar3 / g_nFPS;
|
|
}
|
|
|
|
if ((cmd->flags.saw_chunks1 == 0) && (cmd->flags.clocks_set != 0)) {
|
|
g_SRPCSoundIOPInfo.stream_status[i] = stream_status;
|
|
g_SRPCSoundIOPInfo.stream_id[i] = cmd->id;
|
|
g_SRPCSoundIOPInfo.stream_position[i] = 0;
|
|
} else {
|
|
g_SRPCSoundIOPInfo.stream_status[i] = stream_status;
|
|
g_SRPCSoundIOPInfo.stream_id[i] = cmd->id;
|
|
g_SRPCSoundIOPInfo.stream_position[i] = cmd->position_for_ee;
|
|
}
|
|
}
|
|
// CpuSuspendIntr(local_20);
|
|
|
|
// CpuResumeIntr(local_20[0]);
|
|
g_SRPCSoundIOPInfo.iop_ticks = g_nIopTicks;
|
|
g_SRPCSoundIOPInfo.freemem = 12345; // hack
|
|
g_SRPCSoundIOPInfo.frame = g_nFrameNum;
|
|
g_SRPCSoundIOPInfo.freemem2 = QueryTotalFreeMemSize();
|
|
g_SRPCSoundIOPInfo.nocd = 0; // hack
|
|
g_SRPCSoundIOPInfo.dirtycd = 0; // hack
|
|
g_SRPCSoundIOPInfo.dupseg = -1;
|
|
g_SRPCSoundIOPInfo.diskspeed[0] = 0;
|
|
g_SRPCSoundIOPInfo.diskspeed[1] = 0;
|
|
g_SRPCSoundIOPInfo.lastspeed = 0;
|
|
|
|
memset(&g_SRPCSoundIOPInfo.sound_bank0[0], 0, 8 * 16);
|
|
|
|
if (gBanks[0]->in_use && gBanks[0]->loaded) {
|
|
strcpy(g_SRPCSoundIOPInfo.sound_bank0, gBanks[0]->m_name1);
|
|
}
|
|
if (gBanks[1]->in_use && gBanks[1]->loaded) {
|
|
strcpy(g_SRPCSoundIOPInfo.sound_bank1, gBanks[1]->m_name1);
|
|
}
|
|
if (gBanks[2]->in_use && gBanks[2]->loaded) {
|
|
strcpy(g_SRPCSoundIOPInfo.sound_bank2, gBanks[2]->m_name1);
|
|
}
|
|
if (gBanks[3]->in_use && gBanks[3]->loaded) {
|
|
strcpy(g_SRPCSoundIOPInfo.sound_bank3, gBanks[3]->m_name1);
|
|
}
|
|
if (gBanks[4]->in_use && gBanks[4]->loaded) {
|
|
strcpy(g_SRPCSoundIOPInfo.sound_bank4, gBanks[4]->m_name1);
|
|
}
|
|
if (gBanks[5]->in_use && gBanks[5]->loaded) {
|
|
strcpy(g_SRPCSoundIOPInfo.sound_bank5, gBanks[5]->m_name1);
|
|
}
|
|
if (gBanks[6]->in_use && gBanks[6]->loaded) {
|
|
strcpy(g_SRPCSoundIOPInfo.sound_bank6, gBanks[6]->m_name1);
|
|
}
|
|
if (gBanks[7]->in_use && gBanks[7]->loaded) {
|
|
strcpy(g_SRPCSoundIOPInfo.sound_bank7, gBanks[7]->m_name1);
|
|
}
|
|
|
|
for (int i = 0; i < 48; i++) {
|
|
g_SRPCSoundIOPInfo.chinfo[i] = (snd_GetVoiceStatus(i) != 1) - 1;
|
|
}
|
|
|
|
sceSifDmaData dma;
|
|
dma.data = &g_SRPCSoundIOPInfo;
|
|
dma.addr = (void*)(u64)g_nInfoEE;
|
|
dma.size = sizeof(g_SRPCSoundIOPInfo);
|
|
static_assert(sizeof(g_SRPCSoundIOPInfo) == 0x2d0);
|
|
dma.mode = 0;
|
|
/*dmaid =*/sceSifSetDma(&dma, 1);
|
|
}
|
|
}
|
|
RunDeferredVoiceTrans();
|
|
// Poll(&g_DvdDriver);
|
|
} while (true);
|
|
}
|
|
|
|
} // namespace jak3
|