mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	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:
		@@ -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>;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user