diff --git a/src/audio_core/sink/cubeb_sink.cpp b/src/audio_core/sink/cubeb_sink.cpp index ca42810345..c8c4cb2253 100644 --- a/src/audio_core/sink/cubeb_sink.cpp +++ b/src/audio_core/sink/cubeb_sink.cpp @@ -261,6 +261,7 @@ SinkStream* CubebSink::AcquireSinkStream(Core::System& system, u32 system_channe system_channels = system_channels_; SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique( ctx, device_channels, system_channels, output_device, input_device, name, type, system)); + stream->SetDeviceVolume(device_volume); return stream.get(); } @@ -280,14 +281,11 @@ void CubebSink::CloseStreams() { } f32 CubebSink::GetDeviceVolume() const { - if (sink_streams.empty()) { - return 1.0f; - } - - return sink_streams[0]->GetDeviceVolume(); + return device_volume; } void CubebSink::SetDeviceVolume(f32 volume) { + device_volume = volume; for (auto& stream : sink_streams) { stream->SetDeviceVolume(volume); } diff --git a/src/audio_core/sink/null_sink.h b/src/audio_core/sink/null_sink.h index b6b43c93e1..556456c206 100644 --- a/src/audio_core/sink/null_sink.h +++ b/src/audio_core/sink/null_sink.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -38,6 +41,7 @@ public: StreamType type) override { if (null_sink == nullptr) { null_sink = std::make_unique(system, type); + null_sink->SetDeviceVolume(device_volume); } return null_sink.get(); } @@ -45,9 +49,14 @@ public: void CloseStream(SinkStream*) override {} void CloseStreams() override {} f32 GetDeviceVolume() const override { - return 1.0f; + return device_volume; + } + void SetDeviceVolume(f32 volume) override { + device_volume = volume; + if (null_sink != nullptr) { + null_sink->SetDeviceVolume(volume); + } } - void SetDeviceVolume(f32 volume) override {} void SetSystemVolume(f32 volume) override {} private: diff --git a/src/audio_core/sink/sdl3_sink.cpp b/src/audio_core/sink/sdl3_sink.cpp index 69558eabec..02eee9bec2 100644 --- a/src/audio_core/sink/sdl3_sink.cpp +++ b/src/audio_core/sink/sdl3_sink.cpp @@ -246,6 +246,7 @@ SinkStream* SDLSink::AcquireSinkStream(Core::System& system, u32 system_channels system_channels = system_channels_; SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique( device_channels, system_channels, output_device, input_device, type, system)); + stream->SetDeviceVolume(device_volume); return stream.get(); } @@ -264,14 +265,11 @@ void SDLSink::CloseStreams() { } f32 SDLSink::GetDeviceVolume() const { - if (sink_streams.empty()) { - return 1.0f; - } - - return sink_streams[0]->GetDeviceVolume(); + return device_volume; } void SDLSink::SetDeviceVolume(f32 volume) { + device_volume = volume; for (auto& stream : sink_streams) { stream->SetDeviceVolume(volume); } diff --git a/src/audio_core/sink/sink.h b/src/audio_core/sink/sink.h index e22e8c3e56..2b7069e1a3 100644 --- a/src/audio_core/sink/sink.h +++ b/src/audio_core/sink/sink.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -96,6 +99,8 @@ public: } protected: + /// Master volume, persists stream lifetimes + f32 device_volume{1.0f}; /// Number of device channels supported by the hardware u32 device_channels{2}; /// Number of channels the game is sending