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.
This commit is contained in:
jduncanator 2018-11-19 12:24:15 +11:00 committed by Ac_K
parent 26e09474a9
commit df5960023e

View File

@ -8,11 +8,17 @@ namespace Ryujinx.Audio
/// </summary> /// </summary>
public class DummyAudioOut : IAalOutput public class DummyAudioOut : IAalOutput
{ {
private int lastTrackId = 1;
private ConcurrentQueue<int> m_TrackIds;
private ConcurrentQueue<long> m_Buffers; private ConcurrentQueue<long> m_Buffers;
private ConcurrentDictionary<int, ReleaseCallback> m_ReleaseCallbacks;
public DummyAudioOut() public DummyAudioOut()
{ {
m_Buffers = new ConcurrentQueue<long>(); m_Buffers = new ConcurrentQueue<long>();
m_TrackIds = new ConcurrentQueue<int>();
m_ReleaseCallbacks = new ConcurrentDictionary<int, ReleaseCallback>();
} }
/// <summary> /// <summary>
@ -22,9 +28,25 @@ namespace Ryujinx.Audio
public PlaybackState GetState(int trackId) => PlaybackState.Stopped; 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) { } public void Start(int trackId) { }
@ -34,6 +56,11 @@ namespace Ryujinx.Audio
where T : struct where T : struct
{ {
m_Buffers.Enqueue(bufferTag); m_Buffers.Enqueue(bufferTag);
if(m_ReleaseCallbacks.TryGetValue(trackID, out var callback))
{
callback?.Invoke();
}
} }
public long[] GetReleasedBuffers(int trackId, int maxCount) public long[] GetReleasedBuffers(int trackId, int maxCount)