From 56f1dc8dad7657bc0bb209fd8cd8af190bae8de9 Mon Sep 17 00:00:00 2001
From: Kelebek1 <eeeedddccc@hotmail.co.uk>
Date: Wed, 24 Aug 2022 17:33:10 +0100
Subject: [PATCH] Implement AudRenU:RequestUpdateAuto, and use C descriptors
 when B reports as empty.

---
 src/core/hle/service/audio/audren_u.cpp | 27 +++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp
index 381a66ba52..bc69117c62 100644
--- a/src/core/hle/service/audio/audren_u.cpp
+++ b/src/core/hle/service/audio/audren_u.cpp
@@ -50,7 +50,7 @@ public:
             {7, &IAudioRenderer::QuerySystemEvent, "QuerySystemEvent"},
             {8, &IAudioRenderer::SetRenderingTimeLimit, "SetRenderingTimeLimit"},
             {9, &IAudioRenderer::GetRenderingTimeLimit, "GetRenderingTimeLimit"},
-            {10, nullptr, "RequestUpdateAuto"},
+            {10, &IAudioRenderer::RequestUpdate, "RequestUpdateAuto"},
             {11, nullptr, "ExecuteAudioRendererRendering"},
         };
         // clang-format on
@@ -113,15 +113,30 @@ private:
 
         // These buffers are written manually to avoid an issue with WriteBuffer throwing errors for
         // checking size 0. Performance size is 0 for most games.
-        const auto buffers{ctx.BufferDescriptorB()};
-        std::vector<u8> output(buffers[0].Size(), 0);
-        std::vector<u8> performance(buffers[1].Size(), 0);
+
+        std::vector<u8> output{};
+        std::vector<u8> performance{};
+        auto is_buffer_b{ctx.BufferDescriptorB()[0].Size() != 0};
+        if (is_buffer_b) {
+            const auto buffersB{ctx.BufferDescriptorB()};
+            output.resize(buffersB[0].Size(), 0);
+            performance.resize(buffersB[1].Size(), 0);
+        } else {
+            const auto buffersC{ctx.BufferDescriptorC()};
+            output.resize(buffersC[0].Size(), 0);
+            performance.resize(buffersC[1].Size(), 0);
+        }
 
         auto result = impl->RequestUpdate(input, performance, output);
 
         if (result.IsSuccess()) {
-            ctx.WriteBufferB(output.data(), output.size(), 0);
-            ctx.WriteBufferB(performance.data(), performance.size(), 1);
+            if (is_buffer_b) {
+                ctx.WriteBufferB(output.data(), output.size(), 0);
+                ctx.WriteBufferB(performance.data(), performance.size(), 1);
+            } else {
+                ctx.WriteBufferC(output.data(), output.size(), 0);
+                ctx.WriteBufferC(performance.data(), performance.size(), 1);
+            }
         } else {
             LOG_ERROR(Service_Audio, "RequestUpdate failed error 0x{:02X}!", result.description);
         }