aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjduncanator <jduncanator@users.noreply.github.com>2018-11-17 14:35:15 +1100
committerAc_K <Acoustik666@gmail.com>2018-11-17 04:35:15 +0100
commit5829e36a5cf5c1586dc8ebb5b52f99b7f61605b6 (patch)
treec860a625d487d53af9269f99689d81ac7d4a2027
parentad985582955e7c3cb116aac768ca98be732110f7 (diff)
Audio: Properly implements audio fallback for SoundIO (#500)
* Audio: Properly implements audio fallback for SoundIO Given some drivers have issues with SoundIO (for the time being), this attempts to detect if SoundIO can open the default audio device, and then return false in IsSupported if it can't. * Audio: Handle the backend disconnected event libsoundio panics by default when a backend disconnects, this catches that event and gracefully handles it. * Audio: Fix styling nits * Audio: Fix nits Because Ac_K. :tired_face:
-rw-r--r--Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs61
1 files changed, 60 insertions, 1 deletions
diff --git a/Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs b/Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs
index 76b1290d..0d3e74dd 100644
--- a/Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs
+++ b/Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs
@@ -32,7 +32,66 @@ namespace Ryujinx.Audio
/// <summary>
/// True if SoundIO is supported on the device.
/// </summary>
- public static bool IsSupported => true;
+ public static bool IsSupported
+ {
+ get
+ {
+ SoundIO context = null;
+ SoundIODevice device = null;
+ SoundIOOutStream stream = null;
+
+ bool backendDisconnected = false;
+
+ try
+ {
+ context = new SoundIO();
+
+ context.OnBackendDisconnect = (i) => {
+ backendDisconnected = true;
+ };
+
+ context.Connect();
+ context.FlushEvents();
+
+ if(backendDisconnected)
+ {
+ return false;
+ }
+
+ device = context.GetOutputDevice(context.DefaultOutputDeviceIndex);
+
+ if(device == null || backendDisconnected)
+ {
+ return false;
+ }
+
+ stream = device.CreateOutStream();
+
+ if(stream == null || backendDisconnected)
+ {
+ return false;
+ }
+
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ finally
+ {
+ if(stream != null)
+ {
+ stream.Dispose();
+ }
+
+ if(context != null)
+ {
+ context.Dispose();
+ }
+ }
+ }
+ }
/// <summary>
/// Constructs a new instance of a <see cref="SoundIoAudioOut"/>