diff options
| author | bunnei <bunneidev@gmail.com> | 2022-11-29 20:32:06 -0800 | 
|---|---|---|
| committer | bunnei <bunneidev@gmail.com> | 2022-11-29 20:32:06 -0800 | 
| commit | 8fd4e44014119a1c155de64d63d455390f852a22 (patch) | |
| tree | 48a00a3e059d61897d2296f7ebcd29e012404954 | |
| parent | 8f6245be9a344f53cfca6804bf883a491d113dae (diff) | |
audio_core: sink_stream: Hold the suspend lock when process is stalled.
- Prevents us from clashing with other callers trying to un/stall.
| -rw-r--r-- | src/audio_core/sink/sink_stream.cpp | 11 | ||||
| -rw-r--r-- | src/audio_core/sink/sink_stream.h | 5 | 
2 files changed, 9 insertions, 7 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>; | 
