summaryrefslogtreecommitdiff
path: root/src/audio_core/renderer
diff options
context:
space:
mode:
authorGravatar Liam2023-06-04 12:56:40 -0400
committerGravatar Liam2023-06-04 13:00:10 -0400
commite96a3a171355323453bf0689b80e9b2279750495 (patch)
tree6c44cc3407c887b1bd4bcdaec321123932a07ca7 /src/audio_core/renderer
parentMerge pull request #10588 from liamwhite/vfs-cached (diff)
downloadyuzu-e96a3a171355323453bf0689b80e9b2279750495.tar.gz
yuzu-e96a3a171355323453bf0689b80e9b2279750495.tar.xz
yuzu-e96a3a171355323453bf0689b80e9b2279750495.zip
audio_renderer: resolve adsp thread deadlock shutdown
Diffstat (limited to 'src/audio_core/renderer')
-rw-r--r--src/audio_core/renderer/adsp/audio_renderer.cpp8
-rw-r--r--src/audio_core/renderer/adsp/audio_renderer.h4
2 files changed, 6 insertions, 6 deletions
diff --git a/src/audio_core/renderer/adsp/audio_renderer.cpp b/src/audio_core/renderer/adsp/audio_renderer.cpp
index 1cbeed302..8bc39f9f9 100644
--- a/src/audio_core/renderer/adsp/audio_renderer.cpp
+++ b/src/audio_core/renderer/adsp/audio_renderer.cpp
@@ -105,7 +105,7 @@ void AudioRenderer::Start(AudioRenderer_Mailbox* mailbox_) {
105 } 105 }
106 106
107 mailbox = mailbox_; 107 mailbox = mailbox_;
108 thread = std::thread(&AudioRenderer::ThreadFunc, this); 108 thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(stop_token); });
109 running = true; 109 running = true;
110} 110}
111 111
@@ -131,7 +131,7 @@ void AudioRenderer::CreateSinkStreams() {
131 } 131 }
132} 132}
133 133
134void AudioRenderer::ThreadFunc() { 134void AudioRenderer::ThreadFunc(std::stop_token stop_token) {
135 static constexpr char name[]{"AudioRenderer"}; 135 static constexpr char name[]{"AudioRenderer"};
136 MicroProfileOnThreadCreate(name); 136 MicroProfileOnThreadCreate(name);
137 Common::SetCurrentThreadName(name); 137 Common::SetCurrentThreadName(name);
@@ -146,7 +146,7 @@ void AudioRenderer::ThreadFunc() {
146 146
147 constexpr u64 max_process_time{2'304'000ULL}; 147 constexpr u64 max_process_time{2'304'000ULL};
148 148
149 while (true) { 149 while (!stop_token.stop_requested()) {
150 auto message{mailbox->ADSPWaitMessage()}; 150 auto message{mailbox->ADSPWaitMessage()};
151 switch (message) { 151 switch (message) {
152 case RenderMessage::AudioRenderer_Shutdown: 152 case RenderMessage::AudioRenderer_Shutdown:
@@ -194,7 +194,7 @@ void AudioRenderer::ThreadFunc() {
194 max_time = std::min(command_buffer.time_limit, max_time); 194 max_time = std::min(command_buffer.time_limit, max_time);
195 command_list_processor.SetProcessTimeMax(max_time); 195 command_list_processor.SetProcessTimeMax(max_time);
196 196
197 streams[index]->WaitFreeSpace(); 197 streams[index]->WaitFreeSpace(stop_token);
198 198
199 // Process the command list 199 // Process the command list
200 { 200 {
diff --git a/src/audio_core/renderer/adsp/audio_renderer.h b/src/audio_core/renderer/adsp/audio_renderer.h
index 85ce6a269..88e558183 100644
--- a/src/audio_core/renderer/adsp/audio_renderer.h
+++ b/src/audio_core/renderer/adsp/audio_renderer.h
@@ -177,7 +177,7 @@ private:
177 /** 177 /**
178 * Main AudioRenderer thread, responsible for processing the command lists. 178 * Main AudioRenderer thread, responsible for processing the command lists.
179 */ 179 */
180 void ThreadFunc(); 180 void ThreadFunc(std::stop_token stop_token);
181 181
182 /** 182 /**
183 * Creates the streams which will receive the processed samples. 183 * Creates the streams which will receive the processed samples.
@@ -187,7 +187,7 @@ private:
187 /// Core system 187 /// Core system
188 Core::System& system; 188 Core::System& system;
189 /// Main thread 189 /// Main thread
190 std::thread thread{}; 190 std::jthread thread{};
191 /// The current state 191 /// The current state
192 std::atomic<bool> running{}; 192 std::atomic<bool> running{};
193 /// The active mailbox 193 /// The active mailbox