diff options
| author | Fernando S <fsahmkow27@gmail.com> | 2022-11-30 16:41:32 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-30 16:41:32 +0100 | 
| commit | 4e89979c87dfa77f0c55b03a5aaf00706276c2f0 (patch) | |
| tree | 50fcec585d4b33e0d2a3ed6e25d40d1c3bf19370 | |
| parent | 49219b8a864f0176a52486e5a33cc443f91e8f97 (diff) | |
| parent | 8fd4e44014119a1c155de64d63d455390f852a22 (diff) | |
Merge pull request #9320 from yuzu-emu/fix-audio-suspend
AudioCore: Take suspend lock when stalling the running process.
| -rw-r--r-- | src/audio_core/sink/sink_stream.cpp | 11 | ||||
| -rw-r--r-- | src/audio_core/sink/sink_stream.h | 5 | ||||
| -rw-r--r-- | src/core/core.cpp | 11 | 
3 files changed, 14 insertions, 13 deletions
| diff --git a/src/audio_core/sink/sink_stream.cpp b/src/audio_core/sink/sink_stream.cpp index 849f862b0..67e194e3c 100644 --- a/src/audio_core/sink/sink_stream.cpp +++ b/src/audio_core/sink/sink_stream.cpp @@ -266,19 +266,20 @@ void SinkStream::ProcessAudioOutAndRender(std::span<s16> output_buffer, std::siz  }  void SinkStream::Stall() { -    if (stalled) { +    std::scoped_lock lk{stall_guard}; +    if (stalled_lock) {          return;      } -    stalled = true; -    system.StallProcesses(); +    stalled_lock = system.StallProcesses();  }  void SinkStream::Unstall() { -    if (!stalled) { +    std::scoped_lock lk{stall_guard}; +    if (!stalled_lock) {          return;      }      system.UnstallProcesses(); -    stalled = false; +    stalled_lock.unlock();  }  } // namespace AudioCore::Sink diff --git a/src/audio_core/sink/sink_stream.h b/src/audio_core/sink/sink_stream.h index 38a4b2f51..5fea72ab7 100644 --- a/src/audio_core/sink/sink_stream.h +++ b/src/audio_core/sink/sink_stream.h @@ -6,6 +6,7 @@  #include <array>  #include <atomic>  #include <memory> +#include <mutex>  #include <span>  #include <vector> @@ -240,8 +241,8 @@ private:      f32 system_volume{1.0f};      /// Set via IAudioDevice service calls      f32 device_volume{1.0f}; -    /// True if coretiming has been stalled -    bool stalled{false}; +    std::mutex stall_guard; +    std::unique_lock<std::mutex> stalled_lock;  };  using SinkStreamPtr = std::unique_ptr<SinkStream>; diff --git a/src/core/core.cpp b/src/core/core.cpp index d8934be52..94d4e2212 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -189,7 +189,7 @@ struct System::Impl {          kernel.Suspend(false);          core_timing.SyncPause(false); -        is_paused = false; +        is_paused.store(false, std::memory_order_relaxed);          return status;      } @@ -200,14 +200,13 @@ struct System::Impl {          core_timing.SyncPause(true);          kernel.Suspend(true); -        is_paused = true; +        is_paused.store(true, std::memory_order_relaxed);          return status;      }      bool IsPaused() const { -        std::unique_lock lk(suspend_guard); -        return is_paused; +        return is_paused.load(std::memory_order_relaxed);      }      std::unique_lock<std::mutex> StallProcesses() { @@ -218,7 +217,7 @@ struct System::Impl {      }      void UnstallProcesses() { -        if (!is_paused) { +        if (!IsPaused()) {              core_timing.SyncPause(false);              kernel.Suspend(false);          } @@ -465,7 +464,7 @@ struct System::Impl {      }      mutable std::mutex suspend_guard; -    bool is_paused{}; +    std::atomic_bool is_paused{};      std::atomic<bool> is_shutting_down{};      Timing::CoreTiming core_timing; | 
