From f0cd98154870662040bd17836cbbf42017965322 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:15:16 +0200 Subject: [PATCH] Implement sceAudioOutGetLastOutputTime (#3279) * Implement sceAudioOutGetLastOutputTime * Error returns * Logging --- src/core/libraries/audio/audioout.cpp | 17 +++++++++++++++-- src/core/libraries/audio/audioout.h | 3 ++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/audio/audioout.cpp b/src/core/libraries/audio/audioout.cpp index 2ec44e80f..22b6b17ea 100644 --- a/src/core/libraries/audio/audioout.cpp +++ b/src/core/libraries/audio/audioout.cpp @@ -14,6 +14,7 @@ #include "core/libraries/audio/audioout.h" #include "core/libraries/audio/audioout_backend.h" #include "core/libraries/audio/audioout_error.h" +#include "core/libraries/kernel/time.h" #include "core/libraries/libs.h" namespace Libraries::AudioOut { @@ -168,8 +169,19 @@ int PS4_SYSV_ABI sceAudioOutGetInfoOpenNum() { return ORBIS_OK; } -int PS4_SYSV_ABI sceAudioOutGetLastOutputTime() { - LOG_ERROR(Lib_AudioOut, "(STUBBED) called"); +int PS4_SYSV_ABI sceAudioOutGetLastOutputTime(s32 handle, u64* output_time) { + LOG_DEBUG(Lib_AudioOut, "called, handle: {}, output time: {}", handle, fmt::ptr(output_time)); + if (!output_time) { + return ORBIS_AUDIO_OUT_ERROR_INVALID_POINTER; + } + if (handle >= ports_out.size()) { + return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; + } + auto& port = ports_out.at(handle - 1); + if (!port.IsOpen()) { + return ORBIS_AUDIO_OUT_ERROR_NOT_OPENED; + } + *output_time = port.last_output_time; return ORBIS_OK; } @@ -396,6 +408,7 @@ s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, void* ptr) { if (ptr != nullptr && port.IsOpen()) { std::memcpy(port.output_buffer, ptr, port.BufferSize()); port.output_ready = true; + port.last_output_time = Kernel::sceKernelGetProcessTime(); } } port.output_cv.notify_one(); diff --git a/src/core/libraries/audio/audioout.h b/src/core/libraries/audio/audioout.h index 5247561ee..6d3a6399b 100644 --- a/src/core/libraries/audio/audioout.h +++ b/src/core/libraries/audio/audioout.h @@ -96,6 +96,7 @@ struct PortOut { AudioFormatInfo format_info; u32 sample_rate; u32 buffer_frames; + u64 last_output_time; std::array volume; [[nodiscard]] bool IsOpen() const { @@ -127,7 +128,7 @@ int PS4_SYSV_ABI sceAudioOutGetFocusEnablePid(); int PS4_SYSV_ABI sceAudioOutGetHandleStatusInfo(); int PS4_SYSV_ABI sceAudioOutGetInfo(); int PS4_SYSV_ABI sceAudioOutGetInfoOpenNum(); -int PS4_SYSV_ABI sceAudioOutGetLastOutputTime(); +int PS4_SYSV_ABI sceAudioOutGetLastOutputTime(s32 handle, u64* output_time); int PS4_SYSV_ABI sceAudioOutGetPortState(s32 handle, OrbisAudioOutPortState* state); int PS4_SYSV_ABI sceAudioOutGetSimulatedBusUsableStatusByBusType(); int PS4_SYSV_ABI sceAudioOutGetSimulatedHandleStatusInfo();