diff --git a/src/audio_core/sdl_audio.cpp b/src/audio_core/sdl_audio.cpp index e1d330a40..894f5da55 100644 --- a/src/audio_core/sdl_audio.cpp +++ b/src/audio_core/sdl_audio.cpp @@ -16,7 +16,7 @@ namespace Audio { constexpr int AUDIO_STREAM_BUFFER_THRESHOLD = 65536; // Define constant for buffer threshold -int SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq, +s32 SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq, Libraries::AudioOut::OrbisAudioOutParamFormat format) { using Libraries::AudioOut::OrbisAudioOutParamFormat; std::unique_lock lock{m_mutex}; @@ -90,18 +90,11 @@ int SDLAudio::AudioOutOpen(int type, u32 samples_num, u32 freq, } } - return -1; // all ports are used + LOG_ERROR(Lib_AudioOut, "Audio ports are full"); + return ORBIS_AUDIO_OUT_ERROR_PORT_FULL; // all ports are used } s32 SDLAudio::AudioOutOutput(s32 handle, const void* ptr) { - if (handle < 1 || handle > portsOut.size()) { // Add handle range check - return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; - } - - if (ptr == nullptr) { - return 0; // Nothing to output - } - std::shared_lock lock{m_mutex}; auto& port = portsOut[handle - 1]; if (!port.isOpen) { @@ -121,11 +114,7 @@ s32 SDLAudio::AudioOutOutput(s32 handle, const void* ptr) { return result ? ORBIS_OK : -1; } -bool SDLAudio::AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume) { - if (handle < 1 || handle > portsOut.size()) { // Add handle range check - return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; - } - +s32 SDLAudio::AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume) { using Libraries::AudioOut::OrbisAudioOutParamFormat; std::shared_lock lock{m_mutex}; auto& port = portsOut[handle - 1]; @@ -162,20 +151,16 @@ bool SDLAudio::AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume) { } } - return true; + return ORBIS_OK; } -bool SDLAudio::AudioOutGetStatus(s32 handle, int* type, int* channels_num) { - if (handle < 1 || handle > portsOut.size()) { // Add handle range check - return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; - } - +s32 SDLAudio::AudioOutGetStatus(s32 handle, int* type, int* channels_num) { std::shared_lock lock{m_mutex}; auto& port = portsOut[handle - 1]; *type = port.type; *channels_num = port.channels_num; - return true; + return ORBIS_OK; } } // namespace Audio diff --git a/src/audio_core/sdl_audio.h b/src/audio_core/sdl_audio.h index 07e82145e..0d4783f19 100644 --- a/src/audio_core/sdl_audio.h +++ b/src/audio_core/sdl_audio.h @@ -14,11 +14,11 @@ public: SDLAudio() = default; virtual ~SDLAudio() = default; - int AudioOutOpen(int type, u32 samples_num, u32 freq, + s32 AudioOutOpen(int type, u32 samples_num, u32 freq, Libraries::AudioOut::OrbisAudioOutParamFormat 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); + s32 AudioOutSetVolume(s32 handle, s32 bitflag, s32* volume); + s32 AudioOutGetStatus(s32 handle, int* type, int* channels_num); private: struct PortOut { @@ -33,8 +33,7 @@ private: bool isOpen = false; }; std::shared_mutex m_mutex; - std::array portsOut; // main up to 8 ports , BGM 1 port , voice up to 4 ports , - // personal up to 4 ports , padspk up to 5 ports , aux 1 port + std::array portsOut; }; } // namespace Audio diff --git a/src/core/libraries/audio/audioout.cpp b/src/core/libraries/audio/audioout.cpp index 54db4c673..778d777c2 100644 --- a/src/core/libraries/audio/audioout.cpp +++ b/src/core/libraries/audio/audioout.cpp @@ -176,11 +176,15 @@ int PS4_SYSV_ABI sceAudioOutGetLastOutputTime() { } int PS4_SYSV_ABI sceAudioOutGetPortState(s32 handle, OrbisAudioOutPortState* state) { + if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { + return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; + } + int type = 0; int channels_num = 0; - if (!audio->AudioOutGetStatus(handle, &type, &channels_num)) { - return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; + if (const auto err = audio->AudioOutGetStatus(handle, &type, &channels_num); err != ORBIS_OK) { + return err; } state->rerouteCounter = 0; @@ -310,12 +314,7 @@ s32 PS4_SYSV_ABI sceAudioOutOpen(UserService::OrbisUserServiceUserId user_id, LOG_ERROR(Lib_AudioOut, "Invalid format attribute"); return ORBIS_AUDIO_OUT_ERROR_INVALID_FORMAT; } - int result = audio->AudioOutOpen(port_type, length, sample_rate, format); - if (result == -1) { - LOG_ERROR(Lib_AudioOut, "Audio ports are full"); - return ORBIS_AUDIO_OUT_ERROR_PORT_FULL; - } - return result; + return audio->AudioOutOpen(port_type, length, sample_rate, format); } int PS4_SYSV_ABI sceAudioOutOpenEx() { @@ -324,12 +323,19 @@ int PS4_SYSV_ABI sceAudioOutOpenEx() { } s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, const void* ptr) { + if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { + return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; + } + if (ptr == nullptr) { + // Nothing to output + return ORBIS_OK; + } return audio->AudioOutOutput(handle, ptr); } int PS4_SYSV_ABI sceAudioOutOutputs(OrbisAudioOutOutputParam* param, u32 num) { for (u32 i = 0; i < num; i++) { - if (auto err = audio->AudioOutOutput(param[i].handle, param[i].ptr); err != 0) + if (const auto err = sceAudioOutOutput(param[i].handle, param[i].ptr); err != 0) return err; } return ORBIS_OK; @@ -426,10 +432,10 @@ int PS4_SYSV_ABI sceAudioOutSetUsbVolume() { } s32 PS4_SYSV_ABI sceAudioOutSetVolume(s32 handle, s32 flag, s32* vol) { - if (!audio->AudioOutSetVolume(handle, flag, vol)) { + if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; } - return ORBIS_OK; + return audio->AudioOutSetVolume(handle, flag, vol); } int PS4_SYSV_ABI sceAudioOutSetVolumeDown() { diff --git a/src/core/libraries/audio/audioout.h b/src/core/libraries/audio/audioout.h index d29eea7c3..95cfc1707 100644 --- a/src/core/libraries/audio/audioout.h +++ b/src/core/libraries/audio/audioout.h @@ -11,6 +11,10 @@ namespace Libraries::AudioOut { constexpr int SCE_AUDIO_OUT_VOLUME_0DB = 32768; // max volume value +// main up to 8 ports, BGM 1 port, voice up to 4 ports, +// personal up to 4 ports, padspk up to 5 ports, aux 1 port +constexpr int SCE_AUDIO_OUT_NUM_PORTS = 22; + enum OrbisAudioOutPort { ORBIS_AUDIO_OUT_PORT_TYPE_MAIN = 0, ORBIS_AUDIO_OUT_PORT_TYPE_BGM = 1,