diff --git a/nx/include/switch/services/audout.h b/nx/include/switch/services/audout.h
index d9e7a62f..26bde742 100644
--- a/nx/include/switch/services/audout.h
+++ b/nx/include/switch/services/audout.h
@@ -28,11 +28,11 @@ typedef struct AudioOutBuffer AudioOutBuffer;
 
 struct AudioOutBuffer
 {
-    AudioOutBuffer* next;       ///< Next buffer.
+    AudioOutBuffer* next;       ///< Next buffer. (Unused)
     void* buffer;               ///< Sample buffer (aligned to 0x1000 bytes).
     u64 buffer_size;            ///< Sample buffer size.
     u64 data_size;              ///< Size of data inside the buffer.
-    u64 data_offset;            ///< Offset of data inside the buffer.
+    u64 data_offset;            ///< Offset of data inside the buffer. (Unused?)
 };
 
 Result audoutInitialize(void);
@@ -48,12 +48,20 @@ Result audoutGetReleasedAudioOutBuffer(AudioOutBuffer *Buffer, u32 *ReleasedBuff
 Result audoutContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer);
 
 /**
- * @brief Submits an audio sample data buffer for playing.
+ * @brief Submits an audio sample data buffer for playing and waits for it to finish playing.
+ * @brief Uses \ref audoutAppendAudioOutBuffer and \ref audoutWaitPlayFinish internally.
  * @param source AudioOutBuffer containing the source sample data to be played.
  * @param released AudioOutBuffer to receive the last played buffer.
  */
 Result audoutPlayBuffer(AudioOutBuffer *source, AudioOutBuffer *released);
 
+/**
+ * @brief Waits for audio playback to finish.
+ * @param released AudioOutBuffer to receive the last played buffer.
+ * @param timeout Timeout value, use U64_MAX to wait until all finished.
+ */
+Result audoutWaitPlayFinish(AudioOutBuffer *released, u64 timeout);
+
 /// These return the state associated with the currently active audio output device.
 u32 audoutGetSampleRate(void);                      ///< Supported sample rate (48000Hz).
 u32 audoutGetChannelCount(void);                    ///< Supported channel count (2 channels).
diff --git a/nx/source/services/audout.c b/nx/source/services/audout.c
index 6c2a6096..b3453ad2 100644
--- a/nx/source/services/audout.c
+++ b/nx/source/services/audout.c
@@ -82,26 +82,32 @@ AudioOutState audoutGetDeviceState(void) {
     return g_deviceState;
 }
 
+Result audoutWaitPlayFinish(AudioOutBuffer *released, u64 timeout) {
+    // Wait on the buffer event handle
+    Result do_wait = svcWaitSynchronizationSingle(g_audoutBufferEventHandle, timeout);
+        
+    if (R_SUCCEEDED(do_wait))
+    {
+        svcResetSignal(g_audoutBufferEventHandle);
+        
+        u32 released_count = 0;
+        Result do_release = audoutGetReleasedAudioOutBuffer(released, &released_count);
+        
+        // Ensure that all buffers are released and return the last one only
+        while (R_SUCCEEDED(do_release) && (released_count > 0))
+            do_release = audoutGetReleasedAudioOutBuffer(released, &released_count);
+    }
+    
+    return do_wait;
+}
+
 Result audoutPlayBuffer(AudioOutBuffer *source, AudioOutBuffer *released) {
     // Try to push the supplied buffer to the audio output device
     Result do_append = audoutAppendAudioOutBuffer(source);
     
     if (R_SUCCEEDED(do_append))
     {
-        // Wait on the buffer event handle
-        Result do_wait = svcWaitSynchronizationSingle(g_audoutBufferEventHandle, U64_MAX);
-        
-        if (R_SUCCEEDED(do_wait))
-        {
-            svcResetSignal(g_audoutBufferEventHandle);
-            
-            u32 released_count = 0;
-            Result do_release = audoutGetReleasedAudioOutBuffer(released, &released_count);
-            
-            // Ensure that all buffers are released and return the last one only
-            while (R_SUCCEEDED(do_release) && (released_count > 0))
-                do_release = audoutGetReleasedAudioOutBuffer(released, &released_count);
-        }
+        audoutWaitPlayFinish(released, U64_MAX);
     }
     
     return do_append;
@@ -319,7 +325,7 @@ Result audoutAppendAudioOutBuffer(AudioOutBuffer *Buffer) {
     
     raw->magic = SFCI_MAGIC;
     raw->cmd_id = 3;
-    raw->tag = (u64)&Buffer;
+    raw->tag = (u64)Buffer;
 
     Result rc = serviceIpcDispatch(&g_audoutIAudioOut);