diff --git a/src/Ryujinx.UI.Common/Helper/CustomSettingsHelper.cs b/src/Ryujinx.UI.Common/Helper/CustomSettingsHelper.cs index 4c9184511..acbf79300 100644 --- a/src/Ryujinx.UI.Common/Helper/CustomSettingsHelper.cs +++ b/src/Ryujinx.UI.Common/Helper/CustomSettingsHelper.cs @@ -78,6 +78,8 @@ namespace Ryujinx.UI.Common.Helper ConfigurationState.Instance.System.EnableLowPowerPptc.Value = customSettingsModel.EnableLowPowerPptc; ConfigurationState.Instance.System.MemoryManagerMode.Value = (MemoryManagerMode)customSettingsModel.MemoryManagerMode; ConfigurationState.Instance.System.UseHypervisor.Value = customSettingsModel.UseHypervisor; + ConfigurationState.Instance.System.AudioBackend.Value = customSettingsModel.AudioBackend; + ConfigurationState.Instance.System.AudioVolume.Value = customSettingsModel.AudioVolume; ConfigurationState.Instance.Graphics.GraphicsBackend.Value = (GraphicsBackend)customSettingsModel.GraphicsBackend; ConfigurationState.Instance.Graphics.PreferredGpu.Value = customSettingsModel.PreferredGpu; ConfigurationState.Instance.Graphics.EnableShaderCache.Value = customSettingsModel.EnableShaderCache; diff --git a/src/Ryujinx.UI.Common/Models/CustomSettingsModel.cs b/src/Ryujinx.UI.Common/Models/CustomSettingsModel.cs index 598cdbb38..2f4040114 100644 --- a/src/Ryujinx.UI.Common/Models/CustomSettingsModel.cs +++ b/src/Ryujinx.UI.Common/Models/CustomSettingsModel.cs @@ -28,5 +28,10 @@ namespace Ryujinx.UI.Common.Models public float ResScale { get; set; } public float MaxAnisotropy { get; set; } public int BackendThreading { get; set; } + public int IsOpenAlEnabled { get; set; } + public int IsSDL2Enabled { get; set; } + public int IsSoundIoEnabled { get; set; } + public AudioBackend AudioBackend { get; set; } + public float AudioVolume { get; set; } } } diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index d7df7b621..a7ee7a327 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -178,5 +178,8 @@ CustomSettingsWindow.axaml + + CustomSettingsAudioView.axaml + diff --git a/src/Ryujinx/UI/ViewModels/CustomSettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/CustomSettingsViewModel.cs index f80497ef4..613d0ef4e 100644 --- a/src/Ryujinx/UI/ViewModels/CustomSettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/CustomSettingsViewModel.cs @@ -2,6 +2,9 @@ using Avalonia.Controls; using Avalonia.Media.Imaging; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; +using Ryujinx.Audio.Backends.OpenAL; +using Ryujinx.Audio.Backends.SDL2; +using Ryujinx.Audio.Backends.SoundIo; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Graphics.Vulkan; @@ -131,12 +134,33 @@ namespace Ryujinx.Ava.UI.ViewModels public int MaxAnisotropyIndex { get; set; } public int BackendThreading { get; set; } + // Audio settings + public bool IsOpenAlEnabled { get; set; } + public bool IsSoundIoEnabled { get; set; } + public bool IsSDL2Enabled { get; set; } + public AudioBackend AudioBackend { get; set; } + + public float Volume + { + get; + set + { + field = value; + + ConfigurationState.Instance.System.AudioVolume.Value = field / 100; + + OnPropertyChanged(); + } + } + public CustomSettingsViewModel(string titleId, byte[] icon, string titleName) { AvailableGpus = []; ApplicationIdBase = ulong.Parse(titleId, NumberStyles.HexNumber); CustomSettingsModel = CustomSettingsHelper.LoadCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase)); + Task.Run(CheckSoundBackends); + if (icon is { Length: > 0 }) { using MemoryStream ms = new(icon); @@ -150,6 +174,20 @@ namespace Ryujinx.Ava.UI.ViewModels } } + public async Task CheckSoundBackends() + { + IsOpenAlEnabled = OpenALHardwareDeviceDriver.IsSupported; + IsSoundIoEnabled = SoundIoHardwareDeviceDriver.IsSupported; + IsSDL2Enabled = SDL2HardwareDeviceDriver.IsSupported; + + await Dispatcher.UIThread.InvokeAsync(() => + { + OnPropertyChanged(nameof(IsOpenAlEnabled)); + OnPropertyChanged(nameof(IsSoundIoEnabled)); + OnPropertyChanged(nameof(IsSDL2Enabled)); + }); + } + private async Task LoadAvailableGpus() { AvailableGpus.Clear(); @@ -206,6 +244,8 @@ namespace Ryujinx.Ava.UI.ViewModels ResScaleIndex = ComputeResScaleIndex(config.Graphics.ResScale); MaxAnisotropyIndex = ComputeMaxAnisotropyIndex(config.Graphics.MaxAnisotropy); BackendThreading = (int)config.Graphics.BackendThreading.Value; + AudioBackend = config.System.AudioBackend.Value; + Volume = config.System.AudioVolume * 100; } else { @@ -230,6 +270,8 @@ namespace Ryujinx.Ava.UI.ViewModels ResScaleIndex = ComputeResScaleIndex(CustomSettingsModel.ResScale); MaxAnisotropyIndex = ComputeMaxAnisotropyIndex(CustomSettingsModel.MaxAnisotropy); BackendThreading = CustomSettingsModel.BackendThreading; + AudioBackend = CustomSettingsModel.AudioBackend; + Volume = CustomSettingsModel.AudioVolume * 100; } } @@ -263,6 +305,8 @@ namespace Ryujinx.Ava.UI.ViewModels CustomSettingsModel.ResScale = ComputeResScale(ResScaleIndex); CustomSettingsModel.MaxAnisotropy = ComputeMaxAnisotropy(MaxAnisotropyIndex); CustomSettingsModel.BackendThreading = BackendThreading; + CustomSettingsModel.AudioBackend = AudioBackend; + CustomSettingsModel.AudioVolume = Volume / 100; CustomSettingsHelper.SaveCustomSettingsJson(CustomSettingsHelper.PathToGameSettingsJson(ApplicationIdBase), CustomSettingsModel); } diff --git a/src/Ryujinx/UI/Views/Settings/CustomSettingsAudioView.axaml b/src/Ryujinx/UI/Views/Settings/CustomSettingsAudioView.axaml new file mode 100644 index 000000000..c96ba282b --- /dev/null +++ b/src/Ryujinx/UI/Views/Settings/CustomSettingsAudioView.axaml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Views/Settings/CustomSettingsAudioView.axaml.cs b/src/Ryujinx/UI/Views/Settings/CustomSettingsAudioView.axaml.cs new file mode 100644 index 000000000..51a551551 --- /dev/null +++ b/src/Ryujinx/UI/Views/Settings/CustomSettingsAudioView.axaml.cs @@ -0,0 +1,12 @@ +using Avalonia.Controls; + +namespace Ryujinx.Ava.UI.Views.Settings +{ + public partial class CustomSettingsAudioView : UserControl + { + public CustomSettingsAudioView() + { + InitializeComponent(); + } + } +} diff --git a/src/Ryujinx/UI/Windows/CustomSettingsWindow.axaml b/src/Ryujinx/UI/Windows/CustomSettingsWindow.axaml index 00485120c..8b1c14cbe 100644 --- a/src/Ryujinx/UI/Windows/CustomSettingsWindow.axaml +++ b/src/Ryujinx/UI/Windows/CustomSettingsWindow.axaml @@ -32,6 +32,7 @@ + +