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 @@
+
+