aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Audio/Renderer/Server
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Audio/Renderer/Server')
-rw-r--r--Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs12
-rw-r--r--Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs14
2 files changed, 26 insertions, 0 deletions
diff --git a/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs b/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
index 787b8f9f..112b0e44 100644
--- a/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
+++ b/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs
@@ -142,6 +142,11 @@ namespace Ryujinx.Audio.Renderer.Server
_sessionId = sessionId;
MemoryManager = memoryManager;
+ if (memoryManager is IRefCounted rc)
+ {
+ rc.IncrementReferenceCount();
+ }
+
WorkBufferAllocator workBufferAllocator;
_workBufferRegion = MemoryManager.GetWritableRegion(workBuffer, (int)workBufferSize);
@@ -832,6 +837,13 @@ namespace Ryujinx.Audio.Renderer.Server
_terminationEvent.Dispose();
_workBufferMemoryPin.Dispose();
_workBufferRegion.Dispose();
+
+ if (MemoryManager is IRefCounted rc)
+ {
+ rc.DecrementReferenceCount();
+
+ MemoryManager = null;
+ }
}
}
}
diff --git a/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs b/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
index ec847948..004ac656 100644
--- a/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
+++ b/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
@@ -22,6 +22,7 @@ using Ryujinx.Common.Logging;
using Ryujinx.Memory;
using System;
using System.Diagnostics;
+using System.Linq;
using System.Threading;
namespace Ryujinx.Audio.Renderer.Server
@@ -319,6 +320,19 @@ namespace Ryujinx.Audio.Renderer.Server
{
if (disposing)
{
+ // Clone the sessions array to dispose them outside the lock.
+ AudioRenderSystem[] sessions;
+
+ lock (_sessionLock)
+ {
+ sessions = _sessions.ToArray();
+ }
+
+ foreach (AudioRenderSystem renderer in sessions)
+ {
+ renderer?.Dispose();
+ }
+
lock (_audioProcessorLock)
{
if (_isRunning)