From 880fd3cfcb1c394b06bdb4cd3433e23379b4fbe7 Mon Sep 17 00:00:00 2001 From: Mary Date: Sat, 13 May 2023 09:15:16 +0200 Subject: [PATCH] audio: sdl2: Do not report 5.1 if the device doesn't support it (#4908) * amadeus: adjust VirtualDevice channel configuration reporting with HardwareDevice * audio: sdl2: Do not report 5.1 if device doesn't support it SDL2 5.1 to Stereo conversion is terrible and make everything sound quiet. Let's not expose 5.1 if not truly supported by the device. --- .../SDL2HardwareDeviceDriver.cs | 27 +++++++++++++++++++ .../Renderer/Device/VirtualDevice.cs | 2 +- .../Device/VirtualDeviceSessionRegistry.cs | 19 ++++++++++++- src/Ryujinx.HLE/HOS/Horizon.cs | 2 +- 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs index b190b4c83d..d3a73cfcbf 100644 --- a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs @@ -5,6 +5,7 @@ using Ryujinx.Memory; using Ryujinx.SDL2.Common; using System; using System.Collections.Concurrent; +using System.Runtime.InteropServices; using System.Threading; using static Ryujinx.Audio.Integration.IHardwareDeviceDriver; @@ -18,6 +19,13 @@ namespace Ryujinx.Audio.Backends.SDL2 private readonly ManualResetEvent _pauseEvent; private readonly ConcurrentDictionary _sessions; + private bool _supportSurroundConfiguration; + + // TODO: Add this to SDL2-CS + // NOTE: We use a DllImport here because of marshaling issue for spec. + [DllImport("SDL2")] + private static extern int SDL_GetDefaultAudioInfo(IntPtr name, out SDL_AudioSpec spec, int isCapture); + public SDL2HardwareDeviceDriver() { _updateRequiredEvent = new ManualResetEvent(false); @@ -25,6 +33,20 @@ namespace Ryujinx.Audio.Backends.SDL2 _sessions = new ConcurrentDictionary(); SDL2Driver.Instance.Initialize(); + + int res = SDL_GetDefaultAudioInfo(IntPtr.Zero, out var spec, 0); + + if (res != 0) + { + Logger.Error?.Print(LogClass.Application, + $"SDL_GetDefaultAudioInfo failed with error \"{SDL_GetError()}\""); + + _supportSurroundConfiguration = true; + } + else + { + _supportSurroundConfiguration = spec.channels == 6; + } } public static bool IsSupported => IsSupportedInternal(); @@ -164,6 +186,11 @@ namespace Ryujinx.Audio.Backends.SDL2 public bool SupportsChannelCount(uint channelCount) { + if (channelCount == 6) + { + return _supportSurroundConfiguration; + } + return true; } diff --git a/src/Ryujinx.Audio/Renderer/Device/VirtualDevice.cs b/src/Ryujinx.Audio/Renderer/Device/VirtualDevice.cs index 2fa030a8f7..90692b0045 100644 --- a/src/Ryujinx.Audio/Renderer/Device/VirtualDevice.cs +++ b/src/Ryujinx.Audio/Renderer/Device/VirtualDevice.cs @@ -45,7 +45,7 @@ namespace Ryujinx.Audio.Renderer.Device /// The name of the . /// The count of channels supported by the . /// Indicate if the is provided by an external interface. - private VirtualDevice(string name, uint channelCount, bool isExternalOutput) + public VirtualDevice(string name, uint channelCount, bool isExternalOutput) { Name = name; ChannelCount = channelCount; diff --git a/src/Ryujinx.Audio/Renderer/Device/VirtualDeviceSessionRegistry.cs b/src/Ryujinx.Audio/Renderer/Device/VirtualDeviceSessionRegistry.cs index 927e45add9..696af90fa6 100644 --- a/src/Ryujinx.Audio/Renderer/Device/VirtualDeviceSessionRegistry.cs +++ b/src/Ryujinx.Audio/Renderer/Device/VirtualDeviceSessionRegistry.cs @@ -1,3 +1,4 @@ +using Ryujinx.Audio.Integration; using System.Collections.Generic; namespace Ryujinx.Audio.Renderer.Device @@ -22,7 +23,23 @@ namespace Ryujinx.Audio.Renderer.Device /// The current active . /// // TODO: make this configurable - public VirtualDevice ActiveDevice = VirtualDevice.Devices[2]; + public VirtualDevice ActiveDevice { get; } + + public VirtualDeviceSessionRegistry(IHardwareDeviceDriver driver) + { + uint channelCount; + + if (driver.GetRealDeviceDriver().SupportsChannelCount(6)) + { + channelCount = 6; + } + else + { + channelCount = 2; + } + + ActiveDevice = new VirtualDevice("AudioTvOutput", channelCount, false); + } /// /// Get the associated from an AppletResourceId. diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs index a71837cab6..166761c2cb 100644 --- a/src/Ryujinx.HLE/HOS/Horizon.cs +++ b/src/Ryujinx.HLE/HOS/Horizon.cs @@ -261,7 +261,7 @@ namespace Ryujinx.HLE.HOS AudioInputManager = new AudioInputManager(); AudioRendererManager = new AudioRendererManager(tickSource); AudioRendererManager.SetVolume(Device.Configuration.AudioVolume); - AudioDeviceSessionRegistry = new VirtualDeviceSessionRegistry(); + AudioDeviceSessionRegistry = new VirtualDeviceSessionRegistry(Device.AudioDeviceDriver); IWritableEvent[] audioOutputRegisterBufferEvents = new IWritableEvent[Constants.AudioOutSessionCountMax];