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:
parent
8f6245be9a
commit
8fd4e44014
2 changed files with 9 additions and 7 deletions
|
@ -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
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
Loading…
Reference in a new issue