From 11f176944de8e267ec939c73e08a0023118f45d1 Mon Sep 17 00:00:00 2001 From: water Date: Wed, 17 May 2023 21:24:42 -0400 Subject: [PATCH] [jak 2] Fix possible stereo desync in overlord --- common/goos/ParseHelpers.cpp | 3 +- common/goos/ParseHelpers.h | 2 +- .../serialization/subtitles/subtitles_ser.cpp | 4 +- decompiler/IR2/FormExpressionAnalysis.cpp | 2 +- .../graphics/opengl_renderer/BlitDisplays.cpp | 2 +- .../opengl_renderer/DirectRenderer.cpp | 6 +- .../opengl_renderer/ocean/OceanTexture.cpp | 3 +- .../opengl_renderer/sprite/Sprite3.cpp | 2 +- .../sprite/Sprite3_Distort.cpp | 2 +- game/graphics/texture/TexturePool.cpp | 6 +- game/overlord/jak2/dma.cpp | 2 + game/overlord/jak2/iso.cpp | 14 +- game/overlord/jak2/spustreams.cpp | 174 +++++++++--------- game/overlord/jak2/vag.cpp | 11 +- game/overlord/jak2/vag.h | 4 +- goalc/compiler/Util.cpp | 7 +- 16 files changed, 130 insertions(+), 114 deletions(-) diff --git a/common/goos/ParseHelpers.cpp b/common/goos/ParseHelpers.cpp index e80d18fbfc..c75f5e9d1c 100644 --- a/common/goos/ParseHelpers.cpp +++ b/common/goos/ParseHelpers.cpp @@ -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( diff --git a/common/goos/ParseHelpers.h b/common/goos/ParseHelpers.h index 41718e18dd..17ba85cbd6 100644 --- a/common/goos/ParseHelpers.h +++ b/common/goos/ParseHelpers.h @@ -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>& unnamed, diff --git a/common/serialization/subtitles/subtitles_ser.cpp b/common/serialization/subtitles/subtitles_ser.cpp index fa6a836736..894dae9f31 100644 --- a/common/serialization/subtitles/subtitles_ser.cpp +++ b/common/serialization/subtitles/subtitles_ser.cpp @@ -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> banks; std::string possible_group_name; diff --git a/decompiler/IR2/FormExpressionAnalysis.cpp b/decompiler/IR2/FormExpressionAnalysis.cpp index cf07c6be50..0656cd8246 100644 --- a/decompiler/IR2/FormExpressionAnalysis.cpp +++ b/decompiler/IR2/FormExpressionAnalysis.cpp @@ -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( arg_forms.at(2)->parent_element, hook_names.at(hook)); } diff --git a/game/graphics/opengl_renderer/BlitDisplays.cpp b/game/graphics/opengl_renderer/BlitDisplays.cpp index c9f9ade559..48eb6b10f1 100644 --- a/game/graphics/opengl_renderer/BlitDisplays.cpp +++ b/game/graphics/opengl_renderer/BlitDisplays.cpp @@ -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; diff --git a/game/graphics/opengl_renderer/DirectRenderer.cpp b/game/graphics/opengl_renderer/DirectRenderer.cpp index b776920c6c..8672fa2f09 100644 --- a/game/graphics/opengl_renderer/DirectRenderer.cpp +++ b/game/graphics/opengl_renderer/DirectRenderer.cpp @@ -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"); diff --git a/game/graphics/opengl_renderer/ocean/OceanTexture.cpp b/game/graphics/opengl_renderer/ocean/OceanTexture.cpp index efcffb177c..da601a7151 100644 --- a/game/graphics/opengl_renderer/ocean/OceanTexture.cpp +++ b/game/graphics/opengl_renderer/ocean/OceanTexture.cpp @@ -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)); } } diff --git a/game/graphics/opengl_renderer/sprite/Sprite3.cpp b/game/graphics/opengl_renderer/sprite/Sprite3.cpp index 647ca106d7..7d30c59aba 100644 --- a/game/graphics/opengl_renderer/sprite/Sprite3.cpp +++ b/game/graphics/opengl_renderer/sprite/Sprite3.cpp @@ -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); diff --git a/game/graphics/opengl_renderer/sprite/Sprite3_Distort.cpp b/game/graphics/opengl_renderer/sprite/Sprite3_Distort.cpp index 3dd39a3f43..bd8d4d7e7a 100644 --- a/game/graphics/opengl_renderer/sprite/Sprite3_Distort.cpp +++ b/game/graphics/opengl_renderer/sprite/Sprite3_Distort.cpp @@ -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; diff --git a/game/graphics/texture/TexturePool.cpp b/game/graphics/texture/TexturePool.cpp index f7c7f2b9c7..b718d02c86 100644 --- a/game/graphics/texture/TexturePool.cpp +++ b/game/graphics/texture/TexturePool.cpp @@ -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"); } diff --git a/game/overlord/jak2/dma.cpp b/game/overlord/jak2/dma.cpp index 683e4360eb..174e4ff880 100644 --- a/game/overlord/jak2/dma.cpp +++ b/game/overlord/jak2/dma.cpp @@ -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:; diff --git a/game/overlord/jak2/iso.cpp b/game/overlord/jak2/iso.cpp index 6a59caa9c0..22a66e49d6 100644 --- a/game/overlord/jak2/iso.cpp +++ b/game/overlord/jak2/iso.cpp @@ -244,7 +244,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; @@ -277,9 +277,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; @@ -1064,8 +1071,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; } @@ -1073,7 +1078,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; } diff --git a/game/overlord/jak2/spustreams.cpp b/game/overlord/jak2/spustreams.cpp index c955e8decf..f0d586ee13 100644 --- a/game/overlord/jak2/spustreams.cpp +++ b/game/overlord/jak2/spustreams.cpp @@ -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; @@ -250,11 +250,11 @@ int GetVAGStreamPos(VagCmd* param_1) { bool bVar1; u32 uVar2; u32 uVar3; - u32 uVar4; + u32 primary_dma_offset; u32 uVar5; int iVar6; VagCmd* pRVar7; - u32 uVar8; + u32 secondary_dma_offset; u32 uVar9; u32 uVar10; @@ -283,29 +283,32 @@ 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; + secondary_dma_offset = (param_1->voice & 0xffffU) | 0x2240; do { uVar10 = 0; do { - uVar2 = sceSdGetAddr(uVar8); - uVar3 = sceSdGetAddr(uVar8); - uVar4 = sceSdGetAddr(uVar8); + uVar2 = sceSdGetAddr(secondary_dma_offset); + uVar3 = sceSdGetAddr(secondary_dma_offset); + primary_dma_offset = sceSdGetAddr(secondary_dma_offset); if ((uVar2 == uVar3) || - ((uVar3 != uVar4 && (bVar1 = uVar2 == uVar4, uVar4 = uVar10, bVar1)))) { - uVar4 = uVar2; + ((uVar3 != primary_dma_offset && + (bVar1 = uVar2 == primary_dma_offset, primary_dma_offset = uVar10, bVar1)))) { + primary_dma_offset = uVar2; } - uVar10 = uVar4; - } while (uVar4 == 0); - } while ((uVar4 < uVar9) || (uVar9 + 0x4040 <= uVar4)); - uVar4 = uVar4 - param_1->spu_stream_dma_mem_addr; + uVar10 = primary_dma_offset; + } while (primary_dma_offset == 0); + } while ((primary_dma_offset < uVar9) || (uVar9 + 0x4040 <= primary_dma_offset)); + 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; @@ -314,35 +317,37 @@ int GetVAGStreamPos(VagCmd* param_1) { do { uVar3 = sceSdGetAddr(uVar9); uVar5 = sceSdGetAddr(uVar9); - uVar8 = sceSdGetAddr(uVar9); + secondary_dma_offset = sceSdGetAddr(uVar9); if ((uVar3 == uVar5) || - ((uVar5 != uVar8 && (bVar1 = uVar3 == uVar8, uVar8 = uVar2, bVar1)))) { - uVar8 = uVar3; + ((uVar5 != secondary_dma_offset && + (bVar1 = uVar3 == secondary_dma_offset, secondary_dma_offset = uVar2, bVar1)))) { + secondary_dma_offset = uVar3; } - uVar2 = uVar8; - } while (uVar8 == 0); - } while ((uVar8 < uVar10) || (uVar10 + 0x4040 <= uVar8)); - uVar8 = uVar8 - pRVar7->spu_stream_dma_mem_addr; + uVar2 = secondary_dma_offset; + } while (secondary_dma_offset == 0); + } while ((secondary_dma_offset < uVar10) || (uVar10 + 0x4040 <= secondary_dma_offset)); + 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 +355,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 +372,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 +387,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 +413,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 +440,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 +450,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 +472,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 +485,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 +506,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 +530,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 +546,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 +565,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 +589,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 +602,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 +636,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 +654,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 +663,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 +677,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 +685,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 +700,7 @@ LAB_00010860: iVar6 = 6; goto LAB_00010b30; } - uVar4 = 0x4000; + primary_dma_offset = 0x4000; break; case 6: if (param_1->byte20 == '\0') { @@ -707,10 +715,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 +726,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 +743,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; } diff --git a/game/overlord/jak2/vag.cpp b/game/overlord/jak2/vag.cpp index 9532e55073..3e56630aa3 100644 --- a/game/overlord/jak2/vag.cpp +++ b/game/overlord/jak2/vag.cpp @@ -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) { diff --git a/game/overlord/jak2/vag.h b/game/overlord/jak2/vag.h index 2ac502271c..59fa232822 100644 --- a/game/overlord/jak2/vag.h +++ b/game/overlord/jak2/vag.h @@ -64,7 +64,7 @@ struct VagCmd { u8 byte8; u8 byte9; u8 byte10; - u8 byte11; + u8 byte11; // is stereo secodnary 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 diff --git a/goalc/compiler/Util.cpp b/goalc/compiler/Util.cpp index 203c581816..04513cf664 100644 --- a/goalc/compiler/Util.cpp +++ b/goalc/compiler/Util.cpp @@ -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; }