From df5960023ee65d2da27a8b262ec6a2a4a0848c2d Mon Sep 17 00:00:00 2001 From: jduncanator <1518948+jduncanator@users.noreply.github.com> Date: Mon, 19 Nov 2018 12:24:15 +1100 Subject: [PATCH] Audio: Track and Call ReleaseCallbacks in the Dummy Audio Output (#508) We need to signal the guest process when buffers are released to avoid a softlock. --- Ryujinx.Audio/Renderers/DummyAudioOut.cs | 33 +++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/Ryujinx.Audio/Renderers/DummyAudioOut.cs b/Ryujinx.Audio/Renderers/DummyAudioOut.cs index 659734b6..5d6be3a3 100644 --- a/Ryujinx.Audio/Renderers/DummyAudioOut.cs +++ b/Ryujinx.Audio/Renderers/DummyAudioOut.cs @@ -8,11 +8,17 @@ namespace Ryujinx.Audio /// public class DummyAudioOut : IAalOutput { + private int lastTrackId = 1; + + private ConcurrentQueue m_TrackIds; private ConcurrentQueue m_Buffers; + private ConcurrentDictionary m_ReleaseCallbacks; public DummyAudioOut() { - m_Buffers = new ConcurrentQueue(); + m_Buffers = new ConcurrentQueue(); + m_TrackIds = new ConcurrentQueue(); + m_ReleaseCallbacks = new ConcurrentDictionary(); } /// @@ -22,9 +28,25 @@ namespace Ryujinx.Audio public PlaybackState GetState(int trackId) => PlaybackState.Stopped; - public int OpenTrack(int sampleRate, int channels, ReleaseCallback callback) => 1; + public int OpenTrack(int sampleRate, int channels, ReleaseCallback callback) + { + int trackId; - public void CloseTrack(int trackId) { } + if(!m_TrackIds.TryDequeue(out trackId)) + { + trackId = ++lastTrackId; + } + + m_ReleaseCallbacks[trackId] = callback; + + return trackId; + } + + public void CloseTrack(int trackId) + { + m_TrackIds.Enqueue(trackId); + m_ReleaseCallbacks.Remove(trackId, out _); + } public void Start(int trackId) { } @@ -34,6 +56,11 @@ namespace Ryujinx.Audio where T : struct { m_Buffers.Enqueue(bufferTag); + + if(m_ReleaseCallbacks.TryGetValue(trackID, out var callback)) + { + callback?.Invoke(); + } } public long[] GetReleasedBuffers(int trackId, int maxCount)