[jak 2] Fix possible stereo desync in overlord

This commit is contained in:
water
2023-05-17 21:24:42 -04:00
parent 0fcd9da639
commit 11f176944d
16 changed files with 130 additions and 114 deletions
+1 -2
View File
@@ -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(
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+3 -3
View File
@@ -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");
}
+2
View File
@@ -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:;
+9 -5
View File
@@ -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;
}
+91 -83
View File
@@ -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;
}
+5 -6
View File
@@ -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) {
+2 -2
View File
@@ -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
+2 -5
View File
@@ -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;
}