diff --git a/src/audio_core/adsp/adsp.cpp b/src/audio_core/adsp/adsp.cpp index 8bf8c52ec9..0becc83f24 100644 --- a/src/audio_core/adsp/adsp.cpp +++ b/src/audio_core/adsp/adsp.cpp @@ -20,6 +20,7 @@ ADSP::ADSP(Core::System& system, Sink::Sink& sink) { } void ADSP::NotifyShutdown() { + audio_renderer->NotifyShutdown(); opus_decoder->NotifyShutdown(); } diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp index dca1b4592f..dd096c35b8 100644 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp @@ -41,6 +41,14 @@ void AudioRenderer::Start() { running = true; } +void AudioRenderer::NotifyShutdown() { + if (main_thread.joinable()) { + main_thread.request_stop(); + mailbox.Send(Direction::DSP, Message::Shutdown); + main_thread.join(); + } +} + void AudioRenderer::Stop() { if (!running) { return; @@ -71,13 +79,12 @@ void AudioRenderer::Signal() { Send(Direction::DSP, Message::Render); } -void AudioRenderer::Wait() { - auto msg = Receive(Direction::Host); +void AudioRenderer::Wait(std::stop_token stop_token) { + auto msg = mailbox.Receive(Direction::Host, stop_token); if (msg != Message::RenderResponse) { LOG_ERROR(Service_Audio, - "Did not receive the expected render response from the AudioRenderer! Expected " - "{}, got {}", - Message::RenderResponse, msg); + "Did not receive the expected render response from the AudioRenderer! Expected " + "{}, got {}", Message::RenderResponse, msg); } PostDSPClearCommandBuffer(); } diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h index 4e128187a7..8889d42096 100644 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.h @@ -63,13 +63,15 @@ public: */ void Start(); + void NotifyShutdown(); + /** * Stop the AudioRenderer. */ void Stop(); void Signal(); - void Wait(); + void Wait(std::stop_token stop_token); void Send(Direction dir, u32 message); u32 Receive(Direction dir); diff --git a/src/audio_core/renderer/system_manager.cpp b/src/audio_core/renderer/system_manager.cpp index d2c924fdf2..561babbbbe 100644 --- a/src/audio_core/renderer/system_manager.cpp +++ b/src/audio_core/renderer/system_manager.cpp @@ -36,7 +36,7 @@ void SystemManager::InitializeUnsafe() { system->SendCommandToDsp(); } audio_renderer.Signal(); - audio_renderer.Wait(); + audio_renderer.Wait(stop_token); } }); }