aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjduncanator <1518948+jduncanator@users.noreply.github.com>2018-11-19 12:24:15 +1100
committerAc_K <Acoustik666@gmail.com>2018-11-19 02:24:15 +0100
commitdf5960023ee65d2da27a8b262ec6a2a4a0848c2d (patch)
treee40a8577de1ee9c8879cb8f3956e14eaf9137abc
parent26e09474a95cfec1cdf718c033b80baf819e6f8f (diff)
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.
-rw-r--r--Ryujinx.Audio/Renderers/DummyAudioOut.cs33
1 files 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
/// </summary>
public class DummyAudioOut : IAalOutput
{
+ private int lastTrackId = 1;
+
+ private ConcurrentQueue<int> m_TrackIds;
private ConcurrentQueue<long> m_Buffers;
+ private ConcurrentDictionary<int, ReleaseCallback> m_ReleaseCallbacks;
public DummyAudioOut()
{
- m_Buffers = new ConcurrentQueue<long>();
+ m_Buffers = new ConcurrentQueue<long>();
+ m_TrackIds = new ConcurrentQueue<int>();
+ m_ReleaseCallbacks = new ConcurrentDictionary<int, ReleaseCallback>();
}
/// <summary>
@@ -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)