From f19847dda448e80ff960fa3b2a0d1dd0d0f007f9 Mon Sep 17 00:00:00 2001 From: ITotalJustice <47043333+ITotalJustice@users.noreply.github.com> Date: Sat, 12 Jul 2025 02:26:49 +0100 Subject: [PATCH 1/2] fix audout events being missed. --- nx/source/services/audout.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/nx/source/services/audout.c b/nx/source/services/audout.c index c1d6ac8c3..319d84eaf 100644 --- a/nx/source/services/audout.c +++ b/nx/source/services/audout.c @@ -105,12 +105,18 @@ static Result _audoutCmdNoInOutU32(Service* srv, u32 *out, u32 cmd_id) { } Result audoutWaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 timeout) { - // Wait on the buffer event handle - Result rc = eventWait(&g_audoutBufferEvent, timeout); - - if (R_SUCCEEDED(rc)) { - // Grab the released buffer - rc = audoutGetReleasedAudioOutBuffer(released, released_count); + // Check if we already have a buffer free + eventClear(&g_audoutBufferEvent); + Result rc = audoutGetReleasedAudioOutBuffer(released, released_count); + + if (R_FAILED(rc) || !(*released_count)) { + // Wait on the buffer event handle + rc = eventWait(&g_audoutBufferEvent, timeout); + + if (R_SUCCEEDED(rc)) { + // Grab the released buffer + rc = audoutGetReleasedAudioOutBuffer(released, released_count); + } } return rc; @@ -203,7 +209,7 @@ Result audoutAppendAudioOutBuffer(AudioOutBuffer *Buffer) { } static Result _audoutRegisterBufferEvent(Event *BufferEvent) { - return _audoutCmdGetEvent(&g_audoutIAudioOut, BufferEvent, true, 4); + return _audoutCmdGetEvent(&g_audoutIAudioOut, BufferEvent, false, 4); } Result audoutGetReleasedAudioOutBuffer(AudioOutBuffer **Buffer, u32 *ReleasedBuffersCount) { From 1c293a8be0da9935acc317752c1e8e25ca9362af Mon Sep 17 00:00:00 2001 From: ITotalJustice <47043333+ITotalJustice@users.noreply.github.com> Date: Sat, 12 Jul 2025 18:05:24 +0100 Subject: [PATCH 2/2] audout: only attempt to wait on event if prior call to GetReleased didn't fail. --- nx/source/services/audout.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nx/source/services/audout.c b/nx/source/services/audout.c index 319d84eaf..54d2cc41d 100644 --- a/nx/source/services/audout.c +++ b/nx/source/services/audout.c @@ -109,7 +109,8 @@ Result audoutWaitPlayFinish(AudioOutBuffer **released, u32* released_count, u64 eventClear(&g_audoutBufferEvent); Result rc = audoutGetReleasedAudioOutBuffer(released, released_count); - if (R_FAILED(rc) || !(*released_count)) { + // If the call didn't fail, but we don't have a buffer, wait until one is released + if (R_SUCCEEDED(rc) && !(*released_count)) { // Wait on the buffer event handle rc = eventWait(&g_audoutBufferEvent, timeout);