aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Audio/Renderers
diff options
context:
space:
mode:
authorjduncanator <1518948+jduncanator@users.noreply.github.com>2019-02-13 12:59:26 +1100
committerGitHub <noreply@github.com>2019-02-13 12:59:26 +1100
commitc734137f4164d356a2fdad3349c1afd1976e1cd9 (patch)
treed3ff959394ef0838eb1ecc39916ebd7598df1fbf /Ryujinx.Audio/Renderers
parentf73c11744eb81e8dde92a7b44ad80200d5ac1747 (diff)
Audio: Select a shared audio device by default (#574)
* Audio: Select a shared audio device by default This ensures that a non-raw audio device is selected wherever possible. * Audio: Resolve libsoundio version mismatch between bindings and binaries It turns out we were using bindings generated with libsoundio 1.1.0 git source, but the binaries we were using were built from master git source. I've rebuilt both binaries and bindings to ensure they are version matched. This should resolve all outstanding issues with libsoundio (including the Linux segfault issue, and the "cannot open device" Windows issue). * Audio: Reformat MarshalExtensions * Resolve code indentation issues
Diffstat (limited to 'Ryujinx.Audio/Renderers')
-rw-r--r--Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs151
1 files changed, 96 insertions, 55 deletions
diff --git a/Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs b/Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs
index 0d3e74dd..649aa8d7 100644
--- a/Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs
+++ b/Ryujinx.Audio/Renderers/SoundIo/SoundIoAudioOut.cs
@@ -36,60 +36,7 @@ namespace Ryujinx.Audio
{
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();
- }
- }
+ return IsSupportedInternal();
}
}
@@ -103,7 +50,7 @@ namespace Ryujinx.Audio
m_AudioContext.Connect();
m_AudioContext.FlushEvents();
- m_AudioDevice = m_AudioContext.GetOutputDevice(m_AudioContext.DefaultOutputDeviceIndex);
+ m_AudioDevice = FindNonRawDefaultAudioDevice(m_AudioContext, true);
m_TrackPool = new SoundIoAudioTrackPool(m_AudioContext, m_AudioDevice, MaximumTracks);
}
@@ -244,5 +191,99 @@ namespace Ryujinx.Audio
m_AudioContext.Disconnect();
m_AudioContext.Dispose();
}
+
+ /// <summary>
+ /// Searches for a shared version of the default audio device
+ /// </summary>
+ /// <param name="audioContext">The <see cref="SoundIO"/> audio context</param>
+ /// <param name="fallback">Whether to fallback to the raw default audio device if a non-raw device cannot be found</param>
+ private static SoundIODevice FindNonRawDefaultAudioDevice(SoundIO audioContext, bool fallback = false)
+ {
+ SoundIODevice defaultAudioDevice = audioContext.GetOutputDevice(audioContext.DefaultOutputDeviceIndex);
+
+ if(!defaultAudioDevice.IsRaw)
+ {
+ return defaultAudioDevice;
+ }
+
+ for(var i = 0; i < audioContext.BackendCount; i++)
+ {
+ SoundIODevice audioDevice = audioContext.GetOutputDevice(i);
+
+ if (audioDevice.Id == defaultAudioDevice.Id && !audioDevice.IsRaw)
+ {
+ return audioDevice;
+ }
+ }
+
+ return fallback ? defaultAudioDevice : null;
+ }
+
+ /// <summary>
+ /// Determines if SoundIO can connect to a supported backend
+ /// </summary>
+ /// <returns></returns>
+ private static bool IsSupportedInternal()
+ {
+ 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;
+ }
+
+ if(context.OutputDeviceCount == 0)
+ {
+ return false;
+ }
+
+ device = FindNonRawDefaultAudioDevice(context);
+
+ 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();
+ }
+ }
+ }
}
} \ No newline at end of file