aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs')
-rw-r--r--Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs25
1 files changed, 23 insertions, 2 deletions
diff --git a/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs b/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
index 3fbdc58d..4de0ad16 100644
--- a/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
+++ b/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs
@@ -305,13 +305,34 @@ namespace Ryujinx.Audio.Renderer.Server
/// <param name="workBufferSize">The guest work buffer size.</param>
/// <param name="processHandle">The process handle of the application.</param>
/// <returns>A <see cref="ResultCode"/> reporting an error or a success.</returns>
- public ResultCode OpenAudioRenderer(out AudioRenderSystem renderer, IVirtualMemoryManager memoryManager, ref AudioRendererConfiguration parameter, ulong appletResourceUserId, ulong workBufferAddress, ulong workBufferSize, uint processHandle, float volume)
+ public ResultCode OpenAudioRenderer(
+ out AudioRenderSystem renderer,
+ IVirtualMemoryManager memoryManager,
+ ref AudioRendererConfiguration parameter,
+ ulong appletResourceUserId,
+ ulong workBufferAddress,
+ ulong workBufferSize,
+ uint processHandle,
+ float volume)
{
int sessionId = AcquireSessionId();
AudioRenderSystem audioRenderer = new AudioRenderSystem(this, _sessionsSystemEvent[sessionId]);
- ResultCode result = audioRenderer.Initialize(ref parameter, processHandle, workBufferAddress, workBufferSize, sessionId, appletResourceUserId, memoryManager);
+ // TODO: Eventually, we should try to use the guest supplied work buffer instead of allocating
+ // our own. However, it was causing problems on some applications that would unmap the memory
+ // before the audio renderer was fully disposed.
+ Memory<byte> workBufferMemory = GC.AllocateArray<byte>((int)workBufferSize, pinned: true);
+
+ ResultCode result = audioRenderer.Initialize(
+ ref parameter,
+ processHandle,
+ workBufferMemory,
+ workBufferAddress,
+ workBufferSize,
+ sessionId,
+ appletResourceUserId,
+ memoryManager);
if (result == ResultCode.Success)
{