diff options
| -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() { | |||
| 154 | return; | 154 | return; |
| 155 | 155 | ||
| 156 | case RenderMessage::AudioRenderer_Render: { | 156 | case RenderMessage::AudioRenderer_Render: { |
| 157 | if (system.IsShuttingDown()) [[unlikely]] { | ||
| 158 | std::this_thread::sleep_for(std::chrono::milliseconds(5)); | ||
| 159 | mailbox->ADSPSendMessage(RenderMessage::AudioRenderer_RenderResponse); | ||
| 160 | continue; | ||
| 161 | } | ||
| 157 | std::array<bool, MaxRendererSessions> buffers_reset{}; | 162 | std::array<bool, MaxRendererSessions> buffers_reset{}; |
| 158 | std::array<u64, MaxRendererSessions> render_times_taken{}; | 163 | std::array<u64, MaxRendererSessions> render_times_taken{}; |
| 159 | const auto start_time{system.CoreTiming().GetClockTicks()}; | 164 | 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() { | |||
| 27 | if (!active) { | 27 | if (!active) { |
| 28 | if (adsp.Start()) { | 28 | if (adsp.Start()) { |
| 29 | active = true; | 29 | active = true; |
| 30 | thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(); }); | 30 | thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(stop_token); }); |
| 31 | } | 31 | } |
| 32 | } | 32 | } |
| 33 | 33 | ||
| @@ -39,8 +39,7 @@ void SystemManager::Stop() { | |||
| 39 | return; | 39 | return; |
| 40 | } | 40 | } |
| 41 | active = false; | 41 | active = false; |
| 42 | update.store(true); | 42 | thread.request_stop(); |
| 43 | update.notify_all(); | ||
| 44 | thread.join(); | 43 | thread.join(); |
| 45 | adsp.Stop(); | 44 | adsp.Stop(); |
| 46 | } | 45 | } |
| @@ -85,12 +84,12 @@ bool SystemManager::Remove(System& system_) { | |||
| 85 | return true; | 84 | return true; |
| 86 | } | 85 | } |
| 87 | 86 | ||
| 88 | void SystemManager::ThreadFunc() { | 87 | void SystemManager::ThreadFunc(std::stop_token stop_token) { |
| 89 | static constexpr char name[]{"AudioRenderSystemManager"}; | 88 | static constexpr char name[]{"AudioRenderSystemManager"}; |
| 90 | MicroProfileOnThreadCreate(name); | 89 | MicroProfileOnThreadCreate(name); |
| 91 | Common::SetCurrentThreadName(name); | 90 | Common::SetCurrentThreadName(name); |
| 92 | Common::SetCurrentThreadPriority(Common::ThreadPriority::High); | 91 | Common::SetCurrentThreadPriority(Common::ThreadPriority::High); |
| 93 | while (active) { | 92 | while (active && !stop_token.stop_requested()) { |
| 94 | { | 93 | { |
| 95 | std::scoped_lock l{mutex1}; | 94 | std::scoped_lock l{mutex1}; |
| 96 | 95 | ||
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: | |||
| 66 | /** | 66 | /** |
| 67 | * Main thread responsible for command generation. | 67 | * Main thread responsible for command generation. |
| 68 | */ | 68 | */ |
| 69 | void ThreadFunc(); | 69 | void ThreadFunc(std::stop_token stop_token); |
| 70 | |||
| 71 | enum class StreamState { | ||
| 72 | Filling, | ||
| 73 | Steady, | ||
| 74 | Draining, | ||
| 75 | }; | ||
| 76 | 70 | ||
| 77 | /// Core system | 71 | /// Core system |
| 78 | Core::System& core; | 72 | Core::System& core; |
| @@ -90,8 +84,6 @@ private: | |||
| 90 | ADSP::ADSP& adsp; | 84 | ADSP::ADSP& adsp; |
| 91 | /// AudioRenderer mailbox for communication | 85 | /// AudioRenderer mailbox for communication |
| 92 | ADSP::AudioRenderer_Mailbox* mailbox{}; | 86 | ADSP::AudioRenderer_Mailbox* mailbox{}; |
| 93 | /// Atomic for main thread to wait on | ||
| 94 | std::atomic<bool> update{}; | ||
| 95 | }; | 87 | }; |
| 96 | 88 | ||
| 97 | } // namespace AudioCore::AudioRenderer | 89 | } // 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() { | |||
| 271 | 271 | ||
| 272 | void SinkStream::WaitFreeSpace() { | 272 | void SinkStream::WaitFreeSpace() { |
| 273 | std::unique_lock lk{release_mutex}; | 273 | std::unique_lock lk{release_mutex}; |
| 274 | release_cv.wait( | 274 | release_cv.wait_for(lk, std::chrono::milliseconds(5), |
| 275 | lk, [this]() { return queued_buffers < max_queue_size || system.IsShuttingDown(); }); | 275 | [this]() { return queued_buffers < max_queue_size; }); |
| 276 | } | 276 | } |
| 277 | 277 | ||
| 278 | } // namespace AudioCore::Sink | 278 | } // namespace AudioCore::Sink |