audio_core: sink_stream: Hold the suspend lock when process is stalled.

- Prevents us from clashing with other callers trying to un/stall.
This commit is contained in:
bunnei 2022-11-29 20:32:06 -08:00
parent 8f6245be9a
commit 8fd4e44014
2 changed files with 9 additions and 7 deletions

View File

@ -266,19 +266,20 @@ void SinkStream::ProcessAudioOutAndRender(std::span<s16> output_buffer, std::siz
} }
void SinkStream::Stall() { void SinkStream::Stall() {
if (stalled) { std::scoped_lock lk{stall_guard};
if (stalled_lock) {
return; return;
} }
stalled = true; stalled_lock = system.StallProcesses();
system.StallProcesses();
} }
void SinkStream::Unstall() { void SinkStream::Unstall() {
if (!stalled) { std::scoped_lock lk{stall_guard};
if (!stalled_lock) {
return; return;
} }
system.UnstallProcesses(); system.UnstallProcesses();
stalled = false; stalled_lock.unlock();
} }
} // namespace AudioCore::Sink } // namespace AudioCore::Sink

View File

@ -6,6 +6,7 @@
#include <array> #include <array>
#include <atomic> #include <atomic>
#include <memory> #include <memory>
#include <mutex>
#include <span> #include <span>
#include <vector> #include <vector>
@ -240,8 +241,8 @@ private:
f32 system_volume{1.0f}; f32 system_volume{1.0f};
/// Set via IAudioDevice service calls /// Set via IAudioDevice service calls
f32 device_volume{1.0f}; f32 device_volume{1.0f};
/// True if coretiming has been stalled std::mutex stall_guard;
bool stalled{false}; std::unique_lock<std::mutex> stalled_lock;
}; };
using SinkStreamPtr = std::unique_ptr<SinkStream>; using SinkStreamPtr = std::unique_ptr<SinkStream>;