mirror of
https://github.com/open-goal/jak-project
synced 2026-08-18 21:57:54 -04:00
[jak 2] Fix possible stereo desync in overlord
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:;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 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
|
||||
|
||||
@@ -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