From 7572c51c0ea194575e4fdaf204993371d503a90f Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Tue, 19 May 2026 00:25:33 -0500 Subject: [PATCH] Lib.Audio3d: Implement sceAudio3dPortGetAttributesSupported based on currently handled attributes (#4450) * Stub sceAudio3dPortGetAttributesSupported to return no supported attributes * Report supported attributes * Slight fix --- src/core/libraries/audio3d/audio3d.cpp | 34 +++++++++++++++++-- src/core/libraries/audio3d/audio3d.h | 4 ++- src/core/libraries/audio3d/audio3d_openal.cpp | 34 +++++++++++++++++-- src/core/libraries/audio3d/audio3d_openal.h | 4 ++- 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/core/libraries/audio3d/audio3d.cpp b/src/core/libraries/audio3d/audio3d.cpp index 989679107..0edada2c5 100644 --- a/src/core/libraries/audio3d/audio3d.cpp +++ b/src/core/libraries/audio3d/audio3d.cpp @@ -694,8 +694,38 @@ s32 PS4_SYSV_ABI sceAudio3dPortFreeState() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceAudio3dPortGetAttributesSupported() { - LOG_ERROR(Lib_Audio3d, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceAudio3dPortGetAttributesSupported(OrbisAudio3dPortId port_id, + OrbisAudio3dAttributeId* capabilities, + u32* num_capabilities) { + LOG_DEBUG(Lib_Audio3d, "called"); + if (!num_capabilities) { + return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER; + } + + if (!state->ports.contains(port_id)) { + return ORBIS_AUDIO3D_ERROR_INVALID_PORT; + } + + // We support three attributes, PCM, Gain, and ResetState + // In the future, supported attributes should be stored in the port. + if (capabilities) { + // Writes up to num_capabilities supported capabilities, + // then sets num_capabilities to how many were written. + u32 caps_to_write = *num_capabilities; + if (caps_to_write >= 1) { + capabilities[0] = OrbisAudio3dAttributeId::ORBIS_AUDIO3D_ATTRIBUTE_PCM; + } + if (caps_to_write >= 2) { + capabilities[1] = OrbisAudio3dAttributeId::ORBIS_AUDIO3D_ATTRIBUTE_GAIN; + } + if (caps_to_write >= 3) { + capabilities[2] = OrbisAudio3dAttributeId::ORBIS_AUDIO3D_ATTRIBUTE_RESET_STATE; + } + *num_capabilities = std::min(caps_to_write, 3); + } else { + // If capabilities is null, then just report the number of supported capabilities. + *num_capabilities = 3; + } return ORBIS_OK; } diff --git a/src/core/libraries/audio3d/audio3d.h b/src/core/libraries/audio3d/audio3d.h index 0db7fa83b..50d2435ba 100644 --- a/src/core/libraries/audio3d/audio3d.h +++ b/src/core/libraries/audio3d/audio3d.h @@ -158,7 +158,9 @@ s32 PS4_SYSV_ABI sceAudio3dPortCreate(); s32 PS4_SYSV_ABI sceAudio3dPortDestroy(); s32 PS4_SYSV_ABI sceAudio3dPortFlush(OrbisAudio3dPortId port_id); s32 PS4_SYSV_ABI sceAudio3dPortFreeState(); -s32 PS4_SYSV_ABI sceAudio3dPortGetAttributesSupported(); +s32 PS4_SYSV_ABI sceAudio3dPortGetAttributesSupported(OrbisAudio3dPortId port_id, + OrbisAudio3dAttributeId* capabilities, + u32* num_capabilities); s32 PS4_SYSV_ABI sceAudio3dPortGetList(); s32 PS4_SYSV_ABI sceAudio3dPortGetParameters(); s32 PS4_SYSV_ABI sceAudio3dPortGetQueueLevel(OrbisAudio3dPortId port_id, u32* queue_level, diff --git a/src/core/libraries/audio3d/audio3d_openal.cpp b/src/core/libraries/audio3d/audio3d_openal.cpp index 53bbb8b24..d054df324 100644 --- a/src/core/libraries/audio3d/audio3d_openal.cpp +++ b/src/core/libraries/audio3d/audio3d_openal.cpp @@ -694,8 +694,38 @@ s32 PS4_SYSV_ABI sceAudio3dPortFreeState() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceAudio3dPortGetAttributesSupported() { - LOG_ERROR(Lib_Audio3d, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceAudio3dPortGetAttributesSupported(OrbisAudio3dPortId port_id, + OrbisAudio3dAttributeId* capabilities, + u32* num_capabilities) { + LOG_DEBUG(Lib_Audio3d, "called"); + if (!num_capabilities) { + return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER; + } + + if (!state->ports.contains(port_id)) { + return ORBIS_AUDIO3D_ERROR_INVALID_PORT; + } + + // We support three attributes, PCM, Gain, and ResetState + // In the future, supported attributes should be stored in the port. + if (capabilities) { + // Writes up to num_capabilities supported capabilities, + // then sets num_capabilities to how many were written. + u32 caps_to_write = *num_capabilities; + if (caps_to_write >= 1) { + capabilities[0] = OrbisAudio3dAttributeId::ORBIS_AUDIO3D_ATTRIBUTE_PCM; + } + if (caps_to_write >= 2) { + capabilities[1] = OrbisAudio3dAttributeId::ORBIS_AUDIO3D_ATTRIBUTE_GAIN; + } + if (caps_to_write >= 3) { + capabilities[2] = OrbisAudio3dAttributeId::ORBIS_AUDIO3D_ATTRIBUTE_RESET_STATE; + } + *num_capabilities = std::min(caps_to_write, 3); + } else { + // If capabilities is null, then just report the number of supported capabilities. + *num_capabilities = 3; + } return ORBIS_OK; } diff --git a/src/core/libraries/audio3d/audio3d_openal.h b/src/core/libraries/audio3d/audio3d_openal.h index 75be72066..f611ff5ef 100644 --- a/src/core/libraries/audio3d/audio3d_openal.h +++ b/src/core/libraries/audio3d/audio3d_openal.h @@ -156,7 +156,9 @@ s32 PS4_SYSV_ABI sceAudio3dPortCreate(); s32 PS4_SYSV_ABI sceAudio3dPortDestroy(); s32 PS4_SYSV_ABI sceAudio3dPortFlush(OrbisAudio3dPortId port_id); s32 PS4_SYSV_ABI sceAudio3dPortFreeState(); -s32 PS4_SYSV_ABI sceAudio3dPortGetAttributesSupported(); +s32 PS4_SYSV_ABI sceAudio3dPortGetAttributesSupported(OrbisAudio3dPortId port_id, + OrbisAudio3dAttributeId* capabilities, + u32* num_capabilities); s32 PS4_SYSV_ABI sceAudio3dPortGetList(); s32 PS4_SYSV_ABI sceAudio3dPortGetParameters(); s32 PS4_SYSV_ABI sceAudio3dPortGetQueueLevel(OrbisAudio3dPortId port_id, u32* queue_level,