From c8aeab799dffecbb6297301a2ba59469cab53b12 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Mon, 16 Jun 2025 17:24:58 +1000 Subject: [PATCH] audio_core: Improve audio renderer compatibility and error handling - Change mix size mismatch from error to warning with recovery - Adjust input pointer when consumed size doesn't match header size to prevent desync and allow processing to continue - Expand VoiceInfo::InParameter struct by 24 bytes (0x170 -> 0x188) to support newer audio renderer versions - Update static_assert to reflect new structure size This improves compatibility with games that use newer audio renderer versions or have slight structural differences. Signed-off-by: Zephyron --- src/audio_core/renderer/behavior/info_updater.cpp | 14 ++++++++++---- src/audio_core/renderer/voice/voice_info.h | 4 +++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/audio_core/renderer/behavior/info_updater.cpp b/src/audio_core/renderer/behavior/info_updater.cpp index 3dae6069f..014e4bf14 100644 --- a/src/audio_core/renderer/behavior/info_updater.cpp +++ b/src/audio_core/renderer/behavior/info_updater.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "audio_core/common/feature_support.h" @@ -325,13 +326,18 @@ Result InfoUpdater::UpdateMixes(MixContext& mix_context, const u32 mix_buffer_co } if (consumed_input_size != in_header->mix_size) { - LOG_ERROR(Service_Audio, "Consumed an incorrect mixes size, header size={}, consumed={}", + LOG_WARNING(Service_Audio, "Consumed an incorrect mixes size, header size={}, consumed={}, adjusting input pointer", in_header->mix_size, consumed_input_size); - return Service::Audio::ResultInvalidUpdateInfo; + // Calculate the adjustment needed + const auto adjustment = in_header->mix_size - consumed_input_size; + // Adjust input pointer to match expected header size to prevent desync + input = reinterpret_cast(input) + adjustment; + // Also adjust the expected input size for CheckConsumedSize + expected_input_size += adjustment; + // Continue processing instead of failing } - input += mix_count * sizeof(MixInfo::InParameter); - + // Input pointer adjustment is now handled in the size check above return ResultSuccess; } diff --git a/src/audio_core/renderer/voice/voice_info.h b/src/audio_core/renderer/voice/voice_info.h index 14a687dcb..c29dd780b 100644 --- a/src/audio_core/renderer/voice/voice_info.h +++ b/src/audio_core/renderer/voice/voice_info.h @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -165,8 +166,9 @@ public: /* 0x15D */ char unk15D[0x1]; /* 0x15E */ SrcQuality src_quality; /* 0x15F */ char unk15F[0x11]; + /* 0x170 */ char unk170[0x18]; // Additional 24 bytes for newer audio renderer versions }; - static_assert(sizeof(InParameter) == 0x170, "VoiceInfo::InParameter has the wrong size!"); + static_assert(sizeof(InParameter) == 0x188, "VoiceInfo::InParameter has the wrong size!"); struct OutStatus { /* 0x00 */ u64 played_sample_count;