mirror of
https://github.com/open-goal/jak-project
synced 2026-08-21 06:38:33 -04:00
[jak 2] Fix possible stereo desync in overlord (#2663)
Normally, when they allocate a VagCmd, they do a bunch of stuff to clear all the status bits and reset things in particular the InitVAGCmd function does a lot  but for the stereo command, they do a lot less:  Which means that the new_stereo_command can just have random status bits left over from whatever the last user had. we seem to end up in a state where byte21 is set, and this causes everything else to be wrong and off-by-one dma transfer. My guess is that the original game avoided this bug due to lucky timing that I don't understand. I think the fix of just clearing byte21 is ok because there's no way that the old value of the byte is useful after the command is repurposed.
This commit is contained in:
@@ -39,7 +39,7 @@ bool get_va(const goos::Object& rest, std::string* err_string, goos::Arguments*
|
||||
return true;
|
||||
}
|
||||
|
||||
bool get_va_no_named(const goos::Object& rest, std::string* err_string, goos::Arguments* result) {
|
||||
void get_va_no_named(const goos::Object& rest, goos::Arguments* result) {
|
||||
goos::Arguments args;
|
||||
// loop over forms in list
|
||||
goos::Object current = rest;
|
||||
@@ -48,7 +48,6 @@ bool get_va_no_named(const goos::Object& rest, std::string* err_string, goos::Ar
|
||||
current = current.as_pair()->cdr;
|
||||
}
|
||||
*result = args;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool va_check(
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
namespace goos {
|
||||
bool get_va(const goos::Object& rest, std::string* err_string, goos::Arguments* result);
|
||||
bool get_va_no_named(const goos::Object& rest, std::string* err_string, goos::Arguments* result);
|
||||
void get_va_no_named(const goos::Object& rest, goos::Arguments* result);
|
||||
bool va_check(
|
||||
const goos::Arguments& args,
|
||||
const std::vector<std::optional<goos::ObjectType>>& unnamed,
|
||||
|
||||
@@ -45,7 +45,9 @@ std::string get_string(const goos::Object& x) {
|
||||
* Each entry should be (id "line for 1st language" "line for 2nd language" ...)
|
||||
* This adds the text line to each of the specified languages.
|
||||
*/
|
||||
void parse_text(const goos::Object& data, GameTextDB& db, const GameTextDefinitionFile& file_info) {
|
||||
void parse_text(const goos::Object& data,
|
||||
GameTextDB& db,
|
||||
const GameTextDefinitionFile& /*file_info*/) {
|
||||
const GameTextFontBank* font = nullptr;
|
||||
std::vector<std::shared_ptr<GameTextBank>> banks;
|
||||
std::string possible_group_name;
|
||||
|
||||
@@ -3320,7 +3320,7 @@ void FunctionCallElement::update_from_stack(const Env& env,
|
||||
"TASK_MANAGER_UPDATE_HOOK", "TASK_MANAGER_CODE_HOOK",
|
||||
"TASK_MANAGER_COMPLETE_HOOK", "TASK_MANAGER_FAIL_HOOK",
|
||||
"TASK_MANAGER_EVENT_HOOK"};
|
||||
if (hook >= 0 && hook < hook_names.size()) {
|
||||
if (hook >= 0 && hook < (int)hook_names.size()) {
|
||||
arg_forms.at(2) = pool.alloc_single_element_form<ConstantTokenElement>(
|
||||
arg_forms.at(2)->parent_element, hook_names.at(hook));
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ void BlitDisplays::init_textures(TexturePool& texture_pool, GameVersion version)
|
||||
|
||||
void BlitDisplays::render(DmaFollower& dma,
|
||||
SharedRenderState* render_state,
|
||||
ScopedProfilerNode& prof) {
|
||||
ScopedProfilerNode& /*prof*/) {
|
||||
auto back = render_state->back_fbo;
|
||||
bool valid = back && back->valid;
|
||||
|
||||
|
||||
@@ -827,7 +827,7 @@ void DirectRenderer::handle_trxreg(u64 val) {
|
||||
|
||||
void DirectRenderer::handle_trxdir(u64 dir,
|
||||
SharedRenderState* render_state,
|
||||
ScopedProfilerNode& prof) {
|
||||
ScopedProfilerNode& /*prof*/) {
|
||||
ASSERT(m_blit_buf_state.expect == 3);
|
||||
m_blit_buf_state.expect++;
|
||||
|
||||
@@ -847,17 +847,21 @@ void DirectRenderer::handle_trxdir(u64 dir,
|
||||
case 0: { // host->local
|
||||
fmt::print("-- FROM EE\n");
|
||||
auto dst_tex = get_tex_func("dst", m_blit_buf_state.dbp);
|
||||
(void)dst_tex;
|
||||
// ASSERT_MSG(false, "nyi trxdir host->local");
|
||||
} break;
|
||||
case 1: { // local->host
|
||||
fmt::print("-- FROM GS\n");
|
||||
auto src_tex = get_tex_func("src", m_blit_buf_state.sbp);
|
||||
(void)src_tex;
|
||||
// ASSERT_MSG(false, "nyi trxdir local->host");
|
||||
} break;
|
||||
case 2: { // local->local
|
||||
fmt::print("-- GS <-> GS\n");
|
||||
auto src_tex = get_tex_func("src", m_blit_buf_state.sbp);
|
||||
auto dst_tex = get_tex_func("dst", m_blit_buf_state.dbp);
|
||||
(void)src_tex;
|
||||
(void)dst_tex;
|
||||
} break;
|
||||
case 3: // disable
|
||||
fmt::print("-- HUH???\n");
|
||||
|
||||
@@ -75,7 +75,8 @@ void OceanTexture::init_textures(TexturePool& pool, GameVersion version) {
|
||||
|
||||
void OceanTexture::draw_debug_window() {
|
||||
if (m_tex0_gpu) {
|
||||
ImGui::Image((void*)m_tex0_gpu->gpu_textures.at(0).gl, ImVec2(m_tex0_gpu->w, m_tex0_gpu->h));
|
||||
ImGui::Image((void*)(u64)m_tex0_gpu->gpu_textures.at(0).gl,
|
||||
ImVec2(m_tex0_gpu->w, m_tex0_gpu->h));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ void Sprite3::opengl_setup_normal() {
|
||||
void Sprite3::handle_sprite_frame_setup(DmaFollower& dma,
|
||||
GameVersion version,
|
||||
SharedRenderState* render_state,
|
||||
ScopedProfilerNode& prof) {
|
||||
ScopedProfilerNode& /*prof*/) {
|
||||
// first is some direct data
|
||||
auto direct_data = dma.read_and_advance();
|
||||
ASSERT(direct_data.size_bytes == 3 * 16);
|
||||
|
||||
@@ -205,7 +205,7 @@ void Sprite3::render_distorter(DmaFollower& dma,
|
||||
*/
|
||||
void Sprite3::distort_dma(GameVersion version, DmaFollower& dma, ScopedProfilerNode& /*prof*/) {
|
||||
// set the expected values per game version first
|
||||
int expect_zbp, expect_th;
|
||||
u32 expect_zbp, expect_th;
|
||||
switch (version) {
|
||||
case GameVersion::Jak1:
|
||||
expect_zbp = 0x1c0;
|
||||
|
||||
@@ -220,11 +220,11 @@ void TexturePool::handle_upload_now(const u8* tpage, int mode, const u8* memory_
|
||||
} else {
|
||||
slot.source->remove_slot(tex.dest[mip_idx]);
|
||||
slot.source = get_gpu_texture_for_slot(current_id, tex.dest[mip_idx]);
|
||||
ASSERT(slot.gpu_texture != (u64)-1);
|
||||
ASSERT(slot.gpu_texture != (GLuint)-1);
|
||||
}
|
||||
} else {
|
||||
slot.source = get_gpu_texture_for_slot(current_id, tex.dest[mip_idx]);
|
||||
ASSERT(slot.gpu_texture != (u64)-1);
|
||||
ASSERT(slot.gpu_texture != (GLuint)-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -354,7 +354,7 @@ void TexturePool::draw_debug_for_tex(const std::string& name, GpuTexture* tex, u
|
||||
if (ImGui::TreeNode(fmt::format("{}) {}", slot, name).c_str())) {
|
||||
ImGui::Text("P: %s sz: %d x %d", get_debug_texture_name(tex->tex_id).c_str(), tex->w, tex->h);
|
||||
if (!tex->is_placeholder) {
|
||||
ImGui::Image((void*)tex->gpu_textures.at(0).gl, ImVec2(tex->w, tex->h));
|
||||
ImGui::Image((void*)(u64)tex->gpu_textures.at(0).gl, ImVec2(tex->w, tex->h));
|
||||
} else {
|
||||
ImGui::Text("PLACEHOLDER");
|
||||
}
|
||||
|
||||
@@ -131,12 +131,14 @@ int SpuDmaIntr(int, void*) {
|
||||
} else {
|
||||
sceSdSetParam((u16)DmaStereoVagCmd->voice | 0x200, 0);
|
||||
sceSdSetParam((u16)DmaVagCmd->voice | 0x200, 0);
|
||||
sceSdkey_off_jak2_voice(DmaStereoVagCmd->voice);
|
||||
}
|
||||
sceSdkey_off_jak2_voice(DmaVagCmd->voice);
|
||||
goto hack;
|
||||
}
|
||||
|
||||
// mark as paused manually and unpause to start playback.
|
||||
printf("start playing from dma unpause\n");
|
||||
DmaVagCmd->sb_paused = 1;
|
||||
UnPauseVAG(DmaVagCmd, 0);
|
||||
hack:;
|
||||
|
||||
@@ -243,7 +243,7 @@ void IsoQueueVagStream(VagCmd* cmd, int param_2) {
|
||||
new_cmd->unk_196 = cmd->unk_196;
|
||||
new_cmd->num_processed_chunks = cmd->num_processed_chunks;
|
||||
new_cmd->xfer_size = cmd->xfer_size;
|
||||
new_cmd->unk_248 = cmd->unk_248;
|
||||
new_cmd->sample_rate = cmd->sample_rate;
|
||||
new_cmd->unk_260 = cmd->unk_260;
|
||||
new_cmd->unk_264 = cmd->unk_264;
|
||||
new_cmd->unk_268 = cmd->unk_268;
|
||||
@@ -276,9 +276,16 @@ void IsoQueueVagStream(VagCmd* cmd, int param_2) {
|
||||
new_cmd = nullptr;
|
||||
} else {
|
||||
// set up stereo command.
|
||||
if ((*(u32*)&new_stereo_cmd->status_bytes[BYTE4] & 0xffff00) != 0) {
|
||||
// if ((*(u32*)&new_stereo_cmd->status_bytes[BYTE4] & 0xffff00) != 0) {
|
||||
if (new_stereo_cmd->byte5 || new_stereo_cmd->byte6) {
|
||||
IsoStopVagStream(new_stereo_cmd, 0);
|
||||
}
|
||||
|
||||
// ADDED this line: seems random if this is set or not and other code relies on it not
|
||||
// being set. I don't understand why this doesn't happen on the real game, but it could just
|
||||
// be dma timing differences.
|
||||
new_stereo_cmd->byte21 = 0;
|
||||
|
||||
new_stereo_cmd->status_bytes[BYTE11] = true;
|
||||
new_cmd->stereo_sibling = new_stereo_cmd;
|
||||
new_stereo_cmd->stereo_sibling = new_cmd;
|
||||
@@ -1062,8 +1069,6 @@ void IsoStopVagStream(VagCmd* param_1, int param_2) {
|
||||
if (param_1->id == 0) {
|
||||
if (param_1->name[0] != false) {
|
||||
while (pRVar2 = FindVagStreamName(param_1->name), pRVar2 != nullptr) {
|
||||
printf("terminate from IsoStop 1");
|
||||
|
||||
TerminateVAG(pRVar2, 0);
|
||||
bVar1 = true;
|
||||
}
|
||||
@@ -1071,7 +1076,6 @@ void IsoStopVagStream(VagCmd* param_1, int param_2) {
|
||||
} else {
|
||||
pRVar2 = FindThisVagStream(param_1->name, param_1->id);
|
||||
if (pRVar2 != nullptr) {
|
||||
printf("terminate from IsoStop 2");
|
||||
TerminateVAG(pRVar2, 0);
|
||||
bVar1 = true;
|
||||
}
|
||||
|
||||
@@ -75,20 +75,20 @@ int ProcessVAGData(CmdHeader* param_1_in, Buffer* param_2) {
|
||||
param_2->decompressed_size = 0;
|
||||
goto LAB_0000fecc;
|
||||
}
|
||||
param_1->unk_248 = piVar6[4];
|
||||
param_1->sample_rate = piVar6[4];
|
||||
iVar2 = piVar6[3];
|
||||
param_1->unk_204 = 0;
|
||||
param_1->xfer_size = iVar2;
|
||||
if (*piVar6 == 0x70474156) {
|
||||
uVar3 = param_1->unk_248;
|
||||
uVar3 = param_1->sample_rate;
|
||||
uVar5 = param_1->xfer_size;
|
||||
param_1->unk_248 =
|
||||
param_1->sample_rate =
|
||||
uVar3 >> 0x18 | ((int)uVar3 >> 8 & 0xff00U) | (uVar3 & 0xff00) << 8 | uVar3 << 0x18;
|
||||
param_1->xfer_size =
|
||||
uVar5 >> 0x18 | ((int)uVar5 >> 8 & 0xff00U) | (uVar5 & 0xff00) << 8 | uVar5 << 0x18;
|
||||
}
|
||||
if (pRVar7 != 0x0) {
|
||||
pRVar7->unk_248 = piVar6[4];
|
||||
pRVar7->sample_rate = piVar6[4];
|
||||
iVar2 = piVar6[3];
|
||||
pRVar7->unk_204 = 0;
|
||||
pRVar7->xfer_size = iVar2;
|
||||
@@ -97,7 +97,7 @@ int ProcessVAGData(CmdHeader* param_1_in, Buffer* param_2) {
|
||||
iVar2 = iVar4 + 0x30;
|
||||
param_1->unk_264 = 0x4000;
|
||||
param_1->xfer_size = iVar2;
|
||||
param_1->pitch1 = (u32)(param_1->unk_248 << 0xc) / 48000;
|
||||
param_1->pitch1 = (u32)(param_1->sample_rate << 0xc) / 48000;
|
||||
if ((iVar2 < 0x2001) && (0x3fff < (u32)param_1->unk_264)) {
|
||||
iVar1 = 0x10;
|
||||
if (0x1f < iVar2) {
|
||||
@@ -105,7 +105,7 @@ int ProcessVAGData(CmdHeader* param_1_in, Buffer* param_2) {
|
||||
}
|
||||
param_1->unk_264 = iVar1;
|
||||
if (pRVar7 != 0x0) {
|
||||
pRVar7->unk_248 = param_1->unk_248;
|
||||
pRVar7->sample_rate = param_1->sample_rate;
|
||||
iVar2 = param_1->xfer_size;
|
||||
pRVar7->unk_204 = 0;
|
||||
pRVar7->xfer_size = iVar2;
|
||||
@@ -247,14 +247,10 @@ LAB_0000fecc:
|
||||
}
|
||||
|
||||
int GetVAGStreamPos(VagCmd* param_1) {
|
||||
bool bVar1;
|
||||
u32 uVar2;
|
||||
u32 uVar3;
|
||||
u32 uVar4;
|
||||
u32 uVar5;
|
||||
u32 primary_dma_offset;
|
||||
int iVar6;
|
||||
VagCmd* pRVar7;
|
||||
u32 uVar8;
|
||||
u32 secondary_dma_offset;
|
||||
u32 uVar9;
|
||||
u32 uVar10;
|
||||
|
||||
@@ -283,66 +279,41 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
pRVar7->unk_200 = pRVar7->unk_180;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// this is inheriting what was calculated from the primary, if we're the "Stereo" second stream.
|
||||
if (param_1->byte11 != '\0') {
|
||||
param_1->unk_200 = param_1->unk_180;
|
||||
return 0;
|
||||
}
|
||||
// CpuSuspendIntr(local_30);
|
||||
uVar9 = param_1->spu_stream_dma_mem_addr;
|
||||
uVar8 = (param_1->voice & 0xffffU) | 0x2240;
|
||||
do {
|
||||
uVar10 = 0;
|
||||
do {
|
||||
uVar2 = sceSdGetAddr(uVar8);
|
||||
uVar3 = sceSdGetAddr(uVar8);
|
||||
uVar4 = sceSdGetAddr(uVar8);
|
||||
if ((uVar2 == uVar3) ||
|
||||
((uVar3 != uVar4 && (bVar1 = uVar2 == uVar4, uVar4 = uVar10, bVar1)))) {
|
||||
uVar4 = uVar2;
|
||||
}
|
||||
uVar10 = uVar4;
|
||||
} while (uVar4 == 0);
|
||||
} while ((uVar4 < uVar9) || (uVar9 + 0x4040 <= uVar4));
|
||||
uVar4 = uVar4 - param_1->spu_stream_dma_mem_addr;
|
||||
primary_dma_offset = GetSpuRamAddress(param_1);
|
||||
primary_dma_offset = primary_dma_offset - param_1->spu_stream_dma_mem_addr;
|
||||
if (pRVar7 == 0x0) {
|
||||
uVar8 = 0;
|
||||
secondary_dma_offset = 0;
|
||||
} else {
|
||||
uVar10 = pRVar7->spu_stream_dma_mem_addr;
|
||||
uVar9 = (pRVar7->voice & 0xffffU) | 0x2240;
|
||||
do {
|
||||
uVar2 = 0;
|
||||
do {
|
||||
uVar3 = sceSdGetAddr(uVar9);
|
||||
uVar5 = sceSdGetAddr(uVar9);
|
||||
uVar8 = sceSdGetAddr(uVar9);
|
||||
if ((uVar3 == uVar5) ||
|
||||
((uVar5 != uVar8 && (bVar1 = uVar3 == uVar8, uVar8 = uVar2, bVar1)))) {
|
||||
uVar8 = uVar3;
|
||||
}
|
||||
uVar2 = uVar8;
|
||||
} while (uVar8 == 0);
|
||||
} while ((uVar8 < uVar10) || (uVar10 + 0x4040 <= uVar8));
|
||||
uVar8 = uVar8 - pRVar7->spu_stream_dma_mem_addr;
|
||||
secondary_dma_offset = GetSpuRamAddress(pRVar7);
|
||||
secondary_dma_offset = secondary_dma_offset - pRVar7->spu_stream_dma_mem_addr;
|
||||
}
|
||||
// CpuResumeIntr(local_30[0]);
|
||||
if (pRVar7 != 0x0) {
|
||||
if ((((uVar4 < 0x4000) && (uVar8 < 0x4000)) && (param_1->byte20 == '\0')) &&
|
||||
if ((((primary_dma_offset < 0x4000) && (secondary_dma_offset < 0x4000)) &&
|
||||
(param_1->byte20 == '\0')) &&
|
||||
(pRVar7->byte20 == '\0')) {
|
||||
iVar6 = (int)((uVar4 - uVar8) * 0x40000) >> 0x12;
|
||||
iVar6 = (int)((primary_dma_offset - secondary_dma_offset) * 0x40000) >> 0x12;
|
||||
if (iVar6 < 0) {
|
||||
iVar6 = -iVar6;
|
||||
}
|
||||
if (4 < iVar6) {
|
||||
PauseVAG(param_1, 1);
|
||||
uVar4 = param_1->spu_addr_to_start_playing - param_1->spu_stream_dma_mem_addr;
|
||||
uVar8 = pRVar7->spu_addr_to_start_playing - pRVar7->spu_stream_dma_mem_addr;
|
||||
primary_dma_offset = param_1->spu_addr_to_start_playing - param_1->spu_stream_dma_mem_addr;
|
||||
secondary_dma_offset = pRVar7->spu_addr_to_start_playing - pRVar7->spu_stream_dma_mem_addr;
|
||||
UnPauseVAG(param_1, 1);
|
||||
}
|
||||
}
|
||||
if (pRVar7 == 0x0)
|
||||
goto LAB_00010860;
|
||||
// CpuSuspendIntr(local_30);
|
||||
if ((0x4000 < uVar4) && (param_1->byte20 == '\0')) {
|
||||
if ((0x4000 < primary_dma_offset) && (param_1->byte20 == '\0')) {
|
||||
param_1->byte20 = '\x01';
|
||||
param_1->byte21 = '\0';
|
||||
param_1->byte22 = '\0';
|
||||
@@ -350,8 +321,9 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
pRVar7->byte21 = '\0';
|
||||
pRVar7->byte22 = '\0';
|
||||
}
|
||||
if (uVar8 < 0x4001) {
|
||||
if (uVar4 < 0x2000) {
|
||||
|
||||
if (secondary_dma_offset < 0x4001) {
|
||||
if (primary_dma_offset < 0x2000) {
|
||||
if (param_1->byte21 == '\0') {
|
||||
iVar6 = param_1->unk_204;
|
||||
param_1->byte21 = '\x01';
|
||||
@@ -366,7 +338,8 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
param_1->byte21 = '\0';
|
||||
goto LAB_00010234;
|
||||
}
|
||||
if (uVar8 < 0x2000) {
|
||||
|
||||
if (secondary_dma_offset < 0x2000) {
|
||||
if (pRVar7->byte21 == '\0') {
|
||||
iVar6 = pRVar7->unk_204;
|
||||
pRVar7->byte21 = '\x01';
|
||||
@@ -380,6 +353,7 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
pRVar7->byte22 = '\x01';
|
||||
pRVar7->byte21 = '\0';
|
||||
goto LAB_00010288;
|
||||
} else {
|
||||
}
|
||||
} else if (pRVar7->byte20 == '\0') {
|
||||
param_1->byte20 = '\x01';
|
||||
@@ -405,8 +379,8 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
(pRVar7->sb_even_buffer_dma_complete == '\0')) {
|
||||
if ((param_1->byte20 == '\0') && (pRVar7->byte20 == '\0'))
|
||||
goto switchD_000102c4_caseD_1;
|
||||
uVar4 = 0x2000;
|
||||
uVar8 = 0x2000;
|
||||
primary_dma_offset = 0x2000;
|
||||
secondary_dma_offset = 0x2000;
|
||||
param_1->byte17 = '\x01';
|
||||
param_1->byte16 = '\0';
|
||||
pRVar7->byte17 = '\x01';
|
||||
@@ -432,8 +406,8 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
// CpuResumeIntr(local_30[0]);
|
||||
goto switchD_000102c4_caseD_1;
|
||||
}
|
||||
uVar4 = 0x2000;
|
||||
uVar8 = 0x2000;
|
||||
primary_dma_offset = 0x2000;
|
||||
secondary_dma_offset = 0x2000;
|
||||
RestartVag(param_1, 1, 1);
|
||||
iVar6 = 9;
|
||||
}
|
||||
@@ -442,8 +416,8 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
goto switchD_000102c4_caseD_1;
|
||||
case 3:
|
||||
if ((param_1->byte20 != '\0') || (pRVar7->byte20 != '\0')) {
|
||||
uVar4 = 0x2000;
|
||||
uVar8 = 0x2000;
|
||||
primary_dma_offset = 0x2000;
|
||||
secondary_dma_offset = 0x2000;
|
||||
RestartVag(param_1, 1, 1);
|
||||
iVar6 = 9;
|
||||
break;
|
||||
@@ -464,8 +438,8 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
iVar6 = 5;
|
||||
goto LAB_000106d4;
|
||||
case 4:
|
||||
uVar4 = param_1->unk_196;
|
||||
uVar8 = pRVar7->unk_196;
|
||||
primary_dma_offset = param_1->unk_196;
|
||||
secondary_dma_offset = pRVar7->unk_196;
|
||||
if ((param_1->sb_even_buffer_dma_complete == '\0') ||
|
||||
(pRVar7->sb_even_buffer_dma_complete == '\0'))
|
||||
goto switchD_000102c4_caseD_1;
|
||||
@@ -477,8 +451,8 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
(pRVar7->sb_odd_buffer_dma_complete == '\0')) {
|
||||
if (param_1->byte20 == '\0')
|
||||
goto switchD_000102c4_caseD_1;
|
||||
uVar4 = 0x4000;
|
||||
uVar8 = 0x4000;
|
||||
primary_dma_offset = 0x4000;
|
||||
secondary_dma_offset = 0x4000;
|
||||
param_1->byte16 = '\x01';
|
||||
param_1->byte17 = '\0';
|
||||
pRVar7->byte16 = '\x01';
|
||||
@@ -498,8 +472,8 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
iVar6 = 6;
|
||||
goto LAB_000106d4;
|
||||
}
|
||||
uVar4 = 0x4000;
|
||||
uVar8 = 0x4000;
|
||||
primary_dma_offset = 0x4000;
|
||||
secondary_dma_offset = 0x4000;
|
||||
RestartVag(param_1, 0, 1);
|
||||
iVar6 = 8;
|
||||
}
|
||||
@@ -522,14 +496,14 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
iVar6 = 2;
|
||||
goto LAB_000106d4;
|
||||
}
|
||||
uVar4 = 0x4000;
|
||||
uVar8 = 0x4000;
|
||||
primary_dma_offset = 0x4000;
|
||||
secondary_dma_offset = 0x4000;
|
||||
RestartVag(param_1, 0, 1);
|
||||
iVar6 = 8;
|
||||
break;
|
||||
case 7:
|
||||
uVar8 = param_1->unk_196;
|
||||
uVar4 = uVar8;
|
||||
secondary_dma_offset = param_1->unk_196;
|
||||
primary_dma_offset = secondary_dma_offset;
|
||||
if ((param_1->sb_odd_buffer_dma_complete == '\0') ||
|
||||
(pRVar7->sb_odd_buffer_dma_complete == '\0'))
|
||||
goto switchD_000102c4_caseD_1;
|
||||
@@ -538,16 +512,16 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
break;
|
||||
case 8:
|
||||
if ((param_1->byte21 == '\0') || (iVar6 = 6, pRVar7->byte21 == '\0')) {
|
||||
uVar8 = param_1->unk_196;
|
||||
uVar4 = uVar8;
|
||||
secondary_dma_offset = param_1->unk_196;
|
||||
primary_dma_offset = secondary_dma_offset;
|
||||
goto switchD_000102c4_caseD_1;
|
||||
}
|
||||
param_1->byte16 = '\0';
|
||||
goto LAB_00010744;
|
||||
case 9:
|
||||
if ((param_1->byte22 == '\0') || (iVar6 = 3, pRVar7->byte22 == '\0')) {
|
||||
uVar8 = pRVar7->unk_196;
|
||||
uVar4 = param_1->unk_196;
|
||||
secondary_dma_offset = pRVar7->unk_196;
|
||||
primary_dma_offset = param_1->unk_196;
|
||||
goto switchD_000102c4_caseD_1;
|
||||
}
|
||||
param_1->byte17 = '\0';
|
||||
@@ -557,19 +531,19 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
pRVar7->unk_236 = iVar6;
|
||||
switchD_000102c4_caseD_1:
|
||||
if (param_1->unk_204 == 0) {
|
||||
param_1->unk_188 = uVar4;
|
||||
pRVar7->unk_188 = uVar4;
|
||||
param_1->unk_188 = primary_dma_offset;
|
||||
pRVar7->unk_188 = primary_dma_offset;
|
||||
} else {
|
||||
param_1->unk_188 = uVar4 + (param_1->unk_204 + -1) * 0x2000;
|
||||
pRVar7->unk_188 = uVar8 + (pRVar7->unk_204 + -1) * 0x2000;
|
||||
if (0x2000 < uVar4) {
|
||||
param_1->unk_188 = primary_dma_offset + (param_1->unk_204 + -1) * 0x2000;
|
||||
pRVar7->unk_188 = secondary_dma_offset + (pRVar7->unk_204 + -1) * 0x2000;
|
||||
if (0x2000 < primary_dma_offset) {
|
||||
param_1->unk_188 = param_1->unk_188 + -0x2000;
|
||||
}
|
||||
if (0x2000 < uVar8) {
|
||||
if (0x2000 < secondary_dma_offset) {
|
||||
pRVar7->unk_188 = pRVar7->unk_188 + -0x2000;
|
||||
}
|
||||
}
|
||||
uVar9 = param_1->unk_248;
|
||||
uVar9 = param_1->sample_rate;
|
||||
if (uVar9 == 0) {
|
||||
uVar10 = 0;
|
||||
} else {
|
||||
@@ -581,8 +555,8 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
}
|
||||
param_1->unk_180 = uVar10 << 2;
|
||||
param_1->unk_200 = uVar10 << 2;
|
||||
param_1->unk_196 = uVar4;
|
||||
uVar9 = pRVar7->unk_248;
|
||||
param_1->unk_196 = primary_dma_offset;
|
||||
uVar9 = pRVar7->sample_rate;
|
||||
if (uVar9 == 0) {
|
||||
uVar10 = 0;
|
||||
} else {
|
||||
@@ -594,12 +568,12 @@ int GetVAGStreamPos(VagCmd* param_1) {
|
||||
}
|
||||
pRVar7->unk_180 = uVar10 << 2;
|
||||
pRVar7->unk_200 = uVar10 << 2;
|
||||
pRVar7->unk_196 = uVar8;
|
||||
pRVar7->unk_196 = secondary_dma_offset;
|
||||
return 0;
|
||||
}
|
||||
LAB_00010860:
|
||||
if (uVar4 < 0x4001) {
|
||||
if (uVar4 < 0x2000) {
|
||||
if (primary_dma_offset < 0x4001) {
|
||||
if (primary_dma_offset < 0x2000) {
|
||||
if (param_1->byte21 == '\0') {
|
||||
iVar6 = param_1->unk_204;
|
||||
param_1->byte21 = '\x01';
|
||||
@@ -628,7 +602,7 @@ LAB_00010860:
|
||||
case 2:
|
||||
if (param_1->sb_even_buffer_dma_complete == '\0') {
|
||||
if (param_1->byte20 != '\0') {
|
||||
uVar4 = 0x2000;
|
||||
primary_dma_offset = 0x2000;
|
||||
param_1->byte17 = '\x01';
|
||||
iVar6 = 4;
|
||||
LAB_00010b7c:
|
||||
@@ -646,7 +620,7 @@ LAB_00010860:
|
||||
param_1->unk_236 = iVar6;
|
||||
// CpuResumeIntr(local_30[0]);
|
||||
} else {
|
||||
uVar4 = 0x2000;
|
||||
primary_dma_offset = 0x2000;
|
||||
LAB_00010a1c:
|
||||
RestartVag(param_1, 1, 1);
|
||||
param_1->unk_236 = 9;
|
||||
@@ -655,7 +629,7 @@ LAB_00010860:
|
||||
goto switchD_000108fc_caseD_1;
|
||||
case 3:
|
||||
if (param_1->byte20 != '\0') {
|
||||
uVar4 = 0x2000;
|
||||
primary_dma_offset = 0x2000;
|
||||
goto LAB_00010a1c;
|
||||
}
|
||||
if (param_1->byte22 == '\0')
|
||||
@@ -669,7 +643,7 @@ LAB_00010860:
|
||||
iVar6 = 5;
|
||||
goto LAB_00010b30;
|
||||
case 4:
|
||||
uVar4 = param_1->unk_196;
|
||||
primary_dma_offset = param_1->unk_196;
|
||||
if (param_1->sb_even_buffer_dma_complete == '\0')
|
||||
goto switchD_000108fc_caseD_1;
|
||||
goto LAB_00010a1c;
|
||||
@@ -677,7 +651,7 @@ LAB_00010860:
|
||||
if (param_1->sb_odd_buffer_dma_complete == '\0') {
|
||||
if (param_1->byte20 == '\0')
|
||||
goto switchD_000108fc_caseD_1;
|
||||
uVar4 = 0x4000;
|
||||
primary_dma_offset = 0x4000;
|
||||
param_1->byte16 = '\x01';
|
||||
iVar6 = 7;
|
||||
param_1->byte17 = '\0';
|
||||
@@ -692,7 +666,7 @@ LAB_00010860:
|
||||
iVar6 = 6;
|
||||
goto LAB_00010b30;
|
||||
}
|
||||
uVar4 = 0x4000;
|
||||
primary_dma_offset = 0x4000;
|
||||
break;
|
||||
case 6:
|
||||
if (param_1->byte20 == '\0') {
|
||||
@@ -707,10 +681,10 @@ LAB_00010860:
|
||||
iVar6 = 2;
|
||||
goto LAB_00010b30;
|
||||
}
|
||||
uVar4 = 0x4000;
|
||||
primary_dma_offset = 0x4000;
|
||||
break;
|
||||
case 7:
|
||||
uVar4 = param_1->unk_196;
|
||||
primary_dma_offset = param_1->unk_196;
|
||||
if (param_1->sb_odd_buffer_dma_complete == '\0')
|
||||
goto switchD_000108fc_caseD_1;
|
||||
break;
|
||||
@@ -718,7 +692,7 @@ LAB_00010860:
|
||||
iVar6 = 6;
|
||||
if (param_1->byte21 == '\0') {
|
||||
LAB_00010b88:
|
||||
uVar4 = param_1->unk_196;
|
||||
primary_dma_offset = param_1->unk_196;
|
||||
goto switchD_000108fc_caseD_1;
|
||||
}
|
||||
goto LAB_00010b7c;
|
||||
@@ -735,27 +709,27 @@ LAB_00010860:
|
||||
param_1->unk_236 = 8;
|
||||
switchD_000108fc_caseD_1:
|
||||
if (param_1->unk_204 == 0) {
|
||||
param_1->unk_188 = uVar4;
|
||||
param_1->unk_188 = primary_dma_offset;
|
||||
} else {
|
||||
iVar6 = uVar4 + (param_1->unk_204 + -1) * 0x2000;
|
||||
iVar6 = primary_dma_offset + (param_1->unk_204 + -1) * 0x2000;
|
||||
param_1->unk_188 = iVar6;
|
||||
if (0x2000 < uVar4) {
|
||||
if (0x2000 < primary_dma_offset) {
|
||||
param_1->unk_188 = iVar6 + -0x2000;
|
||||
}
|
||||
}
|
||||
uVar8 = param_1->unk_248;
|
||||
if (uVar8 == 0) {
|
||||
secondary_dma_offset = param_1->sample_rate;
|
||||
if (secondary_dma_offset == 0) {
|
||||
uVar9 = 0;
|
||||
} else {
|
||||
uVar9 = (u32)(param_1->unk_188 * 0x1c0) / uVar8;
|
||||
if (uVar8 == 0) {
|
||||
uVar9 = (u32)(param_1->unk_188 * 0x1c0) / secondary_dma_offset;
|
||||
if (secondary_dma_offset == 0) {
|
||||
// trap(0x1c00);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
param_1->unk_180 = uVar9 << 2;
|
||||
param_1->unk_200 = uVar9 << 2;
|
||||
param_1->unk_196 = uVar4;
|
||||
param_1->unk_196 = primary_dma_offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -989,31 +963,12 @@ void WakeSpuStreamsUp() {
|
||||
}
|
||||
|
||||
u32 GetSpuRamAddress(VagCmd* param_1) {
|
||||
bool bVar1;
|
||||
u32 uVar2;
|
||||
u32 uVar3;
|
||||
u32 uVar4;
|
||||
u32 uVar5;
|
||||
u32 uVar6;
|
||||
u32 uVar7;
|
||||
|
||||
uVar7 = param_1->spu_stream_dma_mem_addr;
|
||||
uVar6 = (param_1->voice & 0xffffU) | 0x2240;
|
||||
do {
|
||||
uVar5 = 0;
|
||||
do {
|
||||
uVar2 = sceSdGetAddr(uVar6);
|
||||
uVar3 = sceSdGetAddr(uVar6);
|
||||
uVar4 = sceSdGetAddr(uVar6);
|
||||
// printf("got nax: %d\n", uVar3);
|
||||
if ((uVar2 == uVar3) ||
|
||||
((uVar3 != uVar4 && (bVar1 = uVar2 == uVar4, uVar4 = uVar5, bVar1)))) {
|
||||
uVar4 = uVar2;
|
||||
}
|
||||
uVar5 = uVar4;
|
||||
} while (uVar4 == 0);
|
||||
} while ((uVar4 < uVar7) || (uVar7 + 0x4040 <= uVar4));
|
||||
return uVar4;
|
||||
// this is simplified a lot from the original.
|
||||
// they seem to sanity check if the value is reasonable or not, but the sanity check can fail
|
||||
// if the overlord thread isn't keeping up.
|
||||
// as far as I can tell, it's totally fine to discard these checks because our sceSdGetAddr
|
||||
// works perfectly.
|
||||
return sceSdGetAddr((param_1->voice & 0xffffU) | 0x2240);
|
||||
}
|
||||
|
||||
u32 bswap(u32 param_1) {
|
||||
|
||||
@@ -67,7 +67,7 @@ void InitVagCmds() {
|
||||
cmd.num_processed_chunks = 0; // puVar5[-0xd] = 0;
|
||||
cmd.safe_to_change_dma_fields = 1; // puVar5[-0x3a] = 1;
|
||||
cmd.xfer_size = 0; // puVar5[-0xc] = 0;
|
||||
cmd.unk_248 = 0; // puVar5[-0xb] = 0;
|
||||
cmd.sample_rate = 0; // puVar5[-0xb] = 0;
|
||||
cmd.unk_260 = 0; // puVar5[-8] = 0;
|
||||
cmd.unk_264 = 0x4000; // puVar5[-7] = 0x4000;
|
||||
cmd.unk_268 = 0; // puVar5[-6] = 0;
|
||||
@@ -285,7 +285,7 @@ void TerminateVAG(VagCmd* cmd, int param_2) {
|
||||
cmd->unk_204 = 0;
|
||||
cmd->num_processed_chunks = 0;
|
||||
cmd->xfer_size = 0;
|
||||
cmd->unk_248 = 0;
|
||||
cmd->sample_rate = 0;
|
||||
cmd->unk_260 = 0;
|
||||
cmd->unk_268 = 0;
|
||||
cmd->vol_multiplier = 0;
|
||||
@@ -349,7 +349,7 @@ void TerminateVAG(VagCmd* cmd, int param_2) {
|
||||
pRVar4->unk_204 = 0;
|
||||
pRVar4->num_processed_chunks = 0;
|
||||
pRVar4->xfer_size = 0;
|
||||
pRVar4->unk_248 = 0;
|
||||
pRVar4->sample_rate = 0;
|
||||
pRVar4->unk_260 = 0;
|
||||
pRVar4->unk_268 = 0;
|
||||
pRVar4->vol_multiplier = 0;
|
||||
@@ -730,7 +730,7 @@ void InitVAGCmd(VagCmd* param_1, int param_2) {
|
||||
param_1->num_processed_chunks = 0;
|
||||
param_1->safe_to_change_dma_fields = 1;
|
||||
param_1->xfer_size = 0;
|
||||
param_1->unk_248 = 0;
|
||||
param_1->sample_rate = 0;
|
||||
param_1->unk_260 = 0;
|
||||
param_1->unk_268 = 0;
|
||||
(param_1->header).callback_buffer = nullptr;
|
||||
@@ -879,7 +879,7 @@ void FreeVagCmd(VagCmd* cmd, int /*param_2*/) {
|
||||
cmd->num_processed_chunks = 0;
|
||||
cmd->safe_to_change_dma_fields = 1;
|
||||
cmd->xfer_size = 0;
|
||||
cmd->unk_248 = 0;
|
||||
cmd->sample_rate = 0;
|
||||
cmd->unk_260 = 0;
|
||||
cmd->unk_268 = 0;
|
||||
cmd->vol_multiplier = 0;
|
||||
@@ -1045,7 +1045,6 @@ void SetAllVagsVol(int param_1)
|
||||
iVar1 = iVar1 + 1;
|
||||
} while (iVar1 < 4);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void CalculateVAGVolumes(VagCmd* cmd, int* l_out, int* r_out) {
|
||||
|
||||
@@ -64,7 +64,7 @@ struct VagCmd {
|
||||
u8 byte8;
|
||||
u8 byte9;
|
||||
u8 byte10;
|
||||
u8 byte11;
|
||||
u8 byte11; // is stereo secondary
|
||||
u8 byte12;
|
||||
u8 byte13;
|
||||
u8 byte14;
|
||||
@@ -83,7 +83,7 @@ struct VagCmd {
|
||||
int unk_236; // 236
|
||||
int num_processed_chunks; // 240 (where "processed" means that they were added to dma command)
|
||||
int xfer_size; // 244
|
||||
int unk_248; // 248
|
||||
int sample_rate; // 248
|
||||
int pitch1; // 252
|
||||
int unk_256_pitch2; // 256
|
||||
int unk_260; // 260
|
||||
|
||||
@@ -171,12 +171,9 @@ goos::Arguments Compiler::get_va(const goos::Object& form, const goos::Object& r
|
||||
* Parse arguments into a goos::Arguments format.
|
||||
*/
|
||||
goos::Arguments Compiler::get_va_no_named(const goos::Object& form, const goos::Object& rest) {
|
||||
(void)form;
|
||||
goos::Arguments args;
|
||||
|
||||
std::string err;
|
||||
if (!goos::get_va_no_named(rest, &err, &args)) {
|
||||
throw_compiler_error(form, err);
|
||||
}
|
||||
goos::get_va_no_named(rest, &args);
|
||||
return args;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user