Implement IApplicationFunctions function 210 (RequestToAcquireUserUsedMemory)

This commit is contained in:
Zephyron
2025-06-20 15:52:14 +10:00
parent 66a3980a43
commit 1471d150d0
6 changed files with 15 additions and 14 deletions

View File

@@ -1,5 +1,4 @@
// 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"
@@ -326,18 +325,13 @@ Result InfoUpdater::UpdateMixes(MixContext& mix_context, const u32 mix_buffer_co
}
if (consumed_input_size != in_header->mix_size) {
LOG_WARNING(Service_Audio, "Consumed an incorrect mixes size, header size={}, consumed={}, adjusting input pointer",
LOG_ERROR(Service_Audio, "Consumed an incorrect mixes size, header size={}, consumed={}",
in_header->mix_size, consumed_input_size);
// 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<const u8*>(input) + adjustment;
// Also adjust the expected input size for CheckConsumedSize
expected_input_size += adjustment;
// Continue processing instead of failing
return Service::Audio::ResultInvalidUpdateInfo;
}
// Input pointer adjustment is now handled in the size check above
input += mix_count * sizeof(MixInfo::InParameter);
return ResultSuccess;
}

View File

@@ -1,5 +1,4 @@
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2025 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
@@ -166,9 +165,8 @@ 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) == 0x188, "VoiceInfo::InParameter has the wrong size!");
static_assert(sizeof(InParameter) == 0x170, "VoiceInfo::InParameter has the wrong size!");
struct OutStatus {
/* 0x00 */ u64 played_sample_count;

View File

@@ -14,7 +14,7 @@ Applet::Applet(Core::System& system, std::unique_ptr<Process> process_, bool is_
notification_storage_channel_event(context), health_warning_disappeared_system_event(context),
acquired_sleep_lock_event(context), pop_from_general_channel_event(context),
library_applet_launchable_event(context), accumulated_suspended_tick_changed_event(context),
sleep_lock_event(context), state_changed_event(context) {
sleep_lock_event(context), state_changed_event(context), user_used_memory_event(context) {
aruid.pid = process->GetProcessId();
program_id = process->GetProgramId();

View File

@@ -125,6 +125,7 @@ struct Applet {
Event accumulated_suspended_tick_changed_event;
Event sleep_lock_event;
Event state_changed_event;
Event user_used_memory_event;
// Frontend state
std::shared_ptr<Frontend::FrontendApplet> frontend{};

View File

@@ -85,6 +85,7 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_
{181, nullptr, "UpgradeLaunchRequiredVersion"},
{190, nullptr, "SendServerMaintenanceOverlayNotification"},
{200, nullptr, "GetLastApplicationExitReason"},
{210, D<&IApplicationFunctions::RequestToAcquireUserUsedMemory>, "RequestToAcquireUserUsedMemory"},
{500, nullptr, "StartContinuousRecordingFlushForDebug"},
{1000, nullptr, "CreateMovieMaker"},
{1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"},
@@ -483,4 +484,10 @@ Result IApplicationFunctions::PrepareForJit() {
R_SUCCEED();
}
Result IApplicationFunctions::RequestToAcquireUserUsedMemory(OutCopyHandle<Kernel::KReadableEvent> out_event) {
LOG_WARNING(Service_AM, "(STUBBED) called");
*out_event = m_applet->user_used_memory_event.GetHandle();
R_SUCCEED();
}
} // namespace Service::AM

View File

@@ -77,6 +77,7 @@ private:
Result GetNotificationStorageChannelEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
Result GetHealthWarningDisappearedSystemEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
Result PrepareForJit();
Result RequestToAcquireUserUsedMemory(OutCopyHandle<Kernel::KReadableEvent> out_event);
const std::shared_ptr<Applet> m_applet;
};