audio_renderer: resolve adsp thread deadlock shutdown

This commit is contained in:
Liam 2023-06-04 12:56:40 -04:00
parent 125a0e5a07
commit e96a3a1713
4 changed files with 12 additions and 10 deletions

View file

@ -105,7 +105,7 @@ void AudioRenderer::Start(AudioRenderer_Mailbox* mailbox_) {
}
mailbox = mailbox_;
thread = std::thread(&AudioRenderer::ThreadFunc, this);
thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(stop_token); });
running = true;
}
@ -131,7 +131,7 @@ void AudioRenderer::CreateSinkStreams() {
}
}
void AudioRenderer::ThreadFunc() {
void AudioRenderer::ThreadFunc(std::stop_token stop_token) {
static constexpr char name[]{"AudioRenderer"};
MicroProfileOnThreadCreate(name);
Common::SetCurrentThreadName(name);
@ -146,7 +146,7 @@ void AudioRenderer::ThreadFunc() {
constexpr u64 max_process_time{2'304'000ULL};
while (true) {
while (!stop_token.stop_requested()) {
auto message{mailbox->ADSPWaitMessage()};
switch (message) {
case RenderMessage::AudioRenderer_Shutdown:
@ -194,7 +194,7 @@ void AudioRenderer::ThreadFunc() {
max_time = std::min(command_buffer.time_limit, max_time);
command_list_processor.SetProcessTimeMax(max_time);
streams[index]->WaitFreeSpace();
streams[index]->WaitFreeSpace(stop_token);
// Process the command list
{

View file

@ -177,7 +177,7 @@ private:
/**
* Main AudioRenderer thread, responsible for processing the command lists.
*/
void ThreadFunc();
void ThreadFunc(std::stop_token stop_token);
/**
* Creates the streams which will receive the processed samples.
@ -187,7 +187,7 @@ private:
/// Core system
Core::System& system;
/// Main thread
std::thread thread{};
std::jthread thread{};
/// The current state
std::atomic<bool> running{};
/// The active mailbox