Browse Source
Merge pull request #9320 from yuzu-emu/fix-audio-suspend
AudioCore: Take suspend lock when stalling the running process.
pull/15/merge
Fernando S
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
14 additions and
13 deletions
-
src/audio_core/sink/sink_stream.cpp
-
src/audio_core/sink/sink_stream.h
-
src/core/core.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
|
|
|
|
@ -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>; |
|
|
|
|
|
|
|
@ -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; |
|
|
|
|