diff options
| -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; | 
