diff --git a/src/core/libraries/audio/cubeb_audio.cpp b/src/core/libraries/audio/cubeb_audio.cpp index ca0a4c3b6..e1195558a 100644 --- a/src/core/libraries/audio/cubeb_audio.cpp +++ b/src/core/libraries/audio/cubeb_audio.cpp @@ -5,7 +5,7 @@ #include #include -#include "common/assert.h" +#include "common/logging/log.h" #include "common/ringbuffer.h" #include "core/libraries/audio/audioout.h" #include "core/libraries/audio/audioout_backend.h" @@ -58,6 +58,8 @@ public: } if (const auto ret = cubeb_stream_start(stream); ret != CUBEB_OK) { LOG_ERROR(Lib_AudioOut, "Failed to start cubeb stream: {}", ret); + cubeb_stream_destroy(stream); + stream = nullptr; return; } } @@ -74,6 +76,9 @@ public: } void Output(void* ptr, size_t size) override { + if (!stream) { + return; + } auto* data = static_cast(ptr); std::unique_lock lock{buffer_mutex}; diff --git a/src/core/libraries/audio/sdl_audio.cpp b/src/core/libraries/audio/sdl_audio.cpp index 7d7a7cee5..598941ba7 100644 --- a/src/core/libraries/audio/sdl_audio.cpp +++ b/src/core/libraries/audio/sdl_audio.cpp @@ -2,9 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include - #include -#include #include "common/logging/log.h" #include "core/libraries/audio/audioout.h" @@ -26,18 +24,28 @@ public: SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &fmt, nullptr, nullptr); if (stream == nullptr) { LOG_ERROR(Lib_AudioOut, "Failed to create SDL audio stream: {}", SDL_GetError()); + return; + } + if (!SDL_ResumeAudioStreamDevice(stream)) { + LOG_ERROR(Lib_AudioOut, "Failed to resume SDL audio stream: {}", SDL_GetError()); + SDL_DestroyAudioStream(stream); + stream = nullptr; + return; } - SDL_ResumeAudioStreamDevice(stream); } ~SDLPortBackend() override { - if (stream) { - SDL_DestroyAudioStream(stream); - stream = nullptr; + if (!stream) { + return; } + SDL_DestroyAudioStream(stream); + stream = nullptr; } void Output(void* ptr, size_t size) override { + if (!stream) { + return; + } SDL_PutAudioStreamData(stream, ptr, static_cast(size)); while (SDL_GetAudioStreamAvailable(stream) > AUDIO_STREAM_BUFFER_THRESHOLD) { // Yield to allow the stream to drain. @@ -46,7 +54,15 @@ public: } void SetVolume(const std::array& ch_volumes) override { - // TODO: Not yet implemented + if (!stream) { + return; + } + // SDL does not have per-channel volumes, for now just take the maximum of the channels. + const auto vol = *std::ranges::max_element(ch_volumes); + if (!SDL_SetAudioStreamGain(stream, static_cast(vol) / SCE_AUDIO_OUT_VOLUME_0DB)) { + LOG_WARNING(Lib_AudioOut, "Failed to change SDL audio stream volume: {}", + SDL_GetError()); + } } private: