diff --git a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs index b190b4c83..d3a73cfcb 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 2fa030a8f..90692b004 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 927e45add..696af90fa 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 a71837cab..166761c2c 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];