diff options
author | bunnei <bunneidev@gmail.com> | 2023-05-26 06:34:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-26 06:34:50 +0200 |
commit | 83b502c08cf520166d09b8841f7b8874d35dce4f (patch) | |
tree | 041901aad11e998b5424c50c6c5f29fef227ed11 | |
parent | Merge pull request #10396 from german77/amiibo_write (diff) | |
parent | Smooth out the DSP callback by adding a 5ms wait time limit (diff) | |
download | yuzu-83b502c08cf520166d09b8841f7b8874d35dce4f.tar yuzu-83b502c08cf520166d09b8841f7b8874d35dce4f.tar.gz yuzu-83b502c08cf520166d09b8841f7b8874d35dce4f.tar.bz2 yuzu-83b502c08cf520166d09b8841f7b8874d35dce4f.tar.lz yuzu-83b502c08cf520166d09b8841f7b8874d35dce4f.tar.xz yuzu-83b502c08cf520166d09b8841f7b8874d35dce4f.tar.zst yuzu-83b502c08cf520166d09b8841f7b8874d35dce4f.zip |
-rw-r--r-- | src/audio_core/renderer/adsp/audio_renderer.cpp | 5 | ||||
-rw-r--r-- | src/audio_core/renderer/system_manager.cpp | 9 | ||||
-rw-r--r-- | src/audio_core/renderer/system_manager.h | 10 | ||||
-rw-r--r-- | src/audio_core/sink/sink_stream.cpp | 4 |
4 files changed, 12 insertions, 16 deletions
diff --git a/src/audio_core/renderer/adsp/audio_renderer.cpp b/src/audio_core/renderer/adsp/audio_renderer.cpp index 503f40349..1cbeed302 100644 --- a/src/audio_core/renderer/adsp/audio_renderer.cpp +++ b/src/audio_core/renderer/adsp/audio_renderer.cpp @@ -154,6 +154,11 @@ void AudioRenderer::ThreadFunc() { return; case RenderMessage::AudioRenderer_Render: { + if (system.IsShuttingDown()) [[unlikely]] { + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + mailbox->ADSPSendMessage(RenderMessage::AudioRenderer_RenderResponse); + continue; + } std::array<bool, MaxRendererSessions> buffers_reset{}; std::array<u64, MaxRendererSessions> render_times_taken{}; const auto start_time{system.CoreTiming().GetClockTicks()}; diff --git a/src/audio_core/renderer/system_manager.cpp b/src/audio_core/renderer/system_manager.cpp index 07d8ed093..300ecdbf1 100644 --- a/src/audio_core/renderer/system_manager.cpp +++ b/src/audio_core/renderer/system_manager.cpp @@ -27,7 +27,7 @@ bool SystemManager::InitializeUnsafe() { if (!active) { if (adsp.Start()) { active = true; - thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(); }); + thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(stop_token); }); } } @@ -39,8 +39,7 @@ void SystemManager::Stop() { return; } active = false; - update.store(true); - update.notify_all(); + thread.request_stop(); thread.join(); adsp.Stop(); } @@ -85,12 +84,12 @@ bool SystemManager::Remove(System& system_) { return true; } -void SystemManager::ThreadFunc() { +void SystemManager::ThreadFunc(std::stop_token stop_token) { static constexpr char name[]{"AudioRenderSystemManager"}; MicroProfileOnThreadCreate(name); Common::SetCurrentThreadName(name); Common::SetCurrentThreadPriority(Common::ThreadPriority::High); - while (active) { + while (active && !stop_token.stop_requested()) { { std::scoped_lock l{mutex1}; diff --git a/src/audio_core/renderer/system_manager.h b/src/audio_core/renderer/system_manager.h index 1f0bbd8b4..9681fd121 100644 --- a/src/audio_core/renderer/system_manager.h +++ b/src/audio_core/renderer/system_manager.h @@ -66,13 +66,7 @@ private: /** * Main thread responsible for command generation. */ - void ThreadFunc(); - - enum class StreamState { - Filling, - Steady, - Draining, - }; + void ThreadFunc(std::stop_token stop_token); /// Core system Core::System& core; @@ -90,8 +84,6 @@ private: ADSP::ADSP& adsp; /// AudioRenderer mailbox for communication ADSP::AudioRenderer_Mailbox* mailbox{}; - /// Atomic for main thread to wait on - std::atomic<bool> update{}; }; } // namespace AudioCore::AudioRenderer diff --git a/src/audio_core/sink/sink_stream.cpp b/src/audio_core/sink/sink_stream.cpp index 13ba26e74..9bbb54162 100644 --- a/src/audio_core/sink/sink_stream.cpp +++ b/src/audio_core/sink/sink_stream.cpp @@ -271,8 +271,8 @@ u64 SinkStream::GetExpectedPlayedSampleCount() { void SinkStream::WaitFreeSpace() { std::unique_lock lk{release_mutex}; - release_cv.wait( - lk, [this]() { return queued_buffers < max_queue_size || system.IsShuttingDown(); }); + release_cv.wait_for(lk, std::chrono::milliseconds(5), + [this]() { return queued_buffers < max_queue_size; }); } } // namespace AudioCore::Sink |