audio: Wait for samples on the emulated DSP side to avoid desyncs

Waiting on the host side is inaccurate and leads to desyncs in the event of the sink missing a deadline that require stalls to fix. By waiting for the sink to have space before even starting rendering such desyncs can be avoided.
This commit is contained in:
Billy Laws
2023-03-18 20:57:00 +00:00
parent d8fc3f403b
commit ea5dd02db9
6 changed files with 28 additions and 24 deletions

View File

@ -16,6 +16,7 @@
#include "common/reader_writer_queue.h"
#include "common/ring_buffer.h"
#include "common/thread.h"
#include "common/polyfill_thread.h"
namespace Core {
class System;
@ -219,6 +220,11 @@ public:
*/
u64 GetExpectedPlayedSampleCount();
/**
* Waits for free space in the sample ring buffer
*/
void WaitFreeSpace();
protected:
/// Core system
Core::System& system;
@ -258,6 +264,9 @@ private:
f32 system_volume{1.0f};
/// Set via IAudioDevice service calls
f32 device_volume{1.0f};
/// Signalled when ring buffer entries are consumed
std::condition_variable release_cv;
std::mutex release_mutex;
std::mutex stall_guard;
std::unique_lock<std::mutex> stalled_lock;
};