From 7b89b7f5fded0453081a41a732950129235c50b4 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 18 Jun 2024 14:28:09 +0300 Subject: [PATCH] sceAudioOutGetPortState added (thanks to gmoralis) --- src/audio_core/sdl_audio.cpp | 9 +++++++ src/audio_core/sdl_audio.h | 1 + src/core/libraries/audio/audioout.cpp | 35 +++++++++++++++++++++++++-- src/core/libraries/audio/audioout.h | 12 ++++++++- 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/audio_core/sdl_audio.cpp b/src/audio_core/sdl_audio.cpp index 188307e5..72f0f9ef 100644 --- a/src/audio_core/sdl_audio.cpp +++ b/src/audio_core/sdl_audio.cpp @@ -145,4 +145,13 @@ bool SDLAudio::AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume) { return true; } +bool SDLAudio::AudioOutGetStatus(s32 handle, int* type, int* channels_num) { + std::scoped_lock lock{m_mutex}; + auto& port = portsOut[handle - 1]; + *type = port.type; + *channels_num = port.channels_num; + + return true; +} + } // namespace Audio diff --git a/src/audio_core/sdl_audio.h b/src/audio_core/sdl_audio.h index ae5e7276..7d0b0b80 100644 --- a/src/audio_core/sdl_audio.h +++ b/src/audio_core/sdl_audio.h @@ -18,6 +18,7 @@ public: Libraries::AudioOut::OrbisAudioOutParam format); s32 AudioOutOutput(s32 handle, const void* ptr); bool AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume); + bool AudioOutGetStatus(s32 handle, int* type, int* channels_num); private: struct PortOut { diff --git a/src/core/libraries/audio/audioout.cpp b/src/core/libraries/audio/audioout.cpp index 0207eaff..0ec4fe15 100644 --- a/src/core/libraries/audio/audioout.cpp +++ b/src/core/libraries/audio/audioout.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include #include "audio_core/sdl_audio.h" #include "common/logging/log.h" @@ -160,8 +161,38 @@ int PS4_SYSV_ABI sceAudioOutGetLastOutputTime() { return ORBIS_OK; } -int PS4_SYSV_ABI sceAudioOutGetPortState() { - LOG_ERROR(Lib_AudioOut, "(STUBBED) called"); +int PS4_SYSV_ABI sceAudioOutGetPortState(s32 handle, OrbisAudioOutPortState* state) { + + int type = 0; + int channels_num = 0; + + if (!audio->AudioOutGetStatus(handle, &type, &channels_num)) { + return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; + } + + state->rerouteCounter = 0; + state->volume = 127; // max volume + + switch (type) { + case ORBIS_AUDIO_OUT_PORT_TYPE_MAIN: + case ORBIS_AUDIO_OUT_PORT_TYPE_BGM: + case ORBIS_AUDIO_OUT_PORT_TYPE_VOICE: + state->output = 1; + state->channel = (channels_num > 2 ? 2 : channels_num); + break; + case ORBIS_AUDIO_OUT_PORT_TYPE_PERSONAL: + case ORBIS_AUDIO_OUT_PORT_TYPE_PADSPK: + state->output = 4; + state->channel = 1; + break; + case ORBIS_AUDIO_OUT_PORT_TYPE_AUX: + state->output = 0; + state->channel = 0; + break; + default: + UNREACHABLE(); + } + return ORBIS_OK; } diff --git a/src/core/libraries/audio/audioout.h b/src/core/libraries/audio/audioout.h index 3b2c73df..c5a62dc6 100644 --- a/src/core/libraries/audio/audioout.h +++ b/src/core/libraries/audio/audioout.h @@ -34,6 +34,16 @@ struct OrbisAudioOutOutputParam { const void* ptr; }; +struct OrbisAudioOutPortState { + u16 output; + u8 channel; + u8 reserved8_1[1]; + s16 volume; + u16 rerouteCounter; + u64 flag; + u64 reserved64[2]; +}; + int PS4_SYSV_ABI sceAudioOutDeviceIdOpen(); int PS4_SYSV_ABI sceAudioDeviceControlGet(); int PS4_SYSV_ABI sceAudioDeviceControlSet(); @@ -55,7 +65,7 @@ int PS4_SYSV_ABI sceAudioOutGetHandleStatusInfo(); int PS4_SYSV_ABI sceAudioOutGetInfo(); int PS4_SYSV_ABI sceAudioOutGetInfoOpenNum(); int PS4_SYSV_ABI sceAudioOutGetLastOutputTime(); -int PS4_SYSV_ABI sceAudioOutGetPortState(); +int PS4_SYSV_ABI sceAudioOutGetPortState(s32 handle, OrbisAudioOutPortState* state); int PS4_SYSV_ABI sceAudioOutGetSimulatedBusUsableStatusByBusType(); int PS4_SYSV_ABI sceAudioOutGetSimulatedHandleStatusInfo(); int PS4_SYSV_ABI sceAudioOutGetSimulatedHandleStatusInfo2();