/* Native output is a deterministic, explicitly clocked device in these tests. */ #include #include #include #include #include #include "../src/audio_ps5.cpp" namespace { std::mutex device_mutex; std::condition_variable device_changed; std::vector> blocks; unsigned permits = 0, opens = 0, closes = 0, drains = 0; int init_result = 0, open_result = 1, output_result = 0; void reset() { blocks.clear(); permits = opens = closes = drains = 0; init_result = output_result = 0; open_result = 1; } void entered(size_t count) { std::unique_lock lock(device_mutex); assert(device_changed.wait_for(lock, std::chrono::seconds(5), [&] { return blocks.size() >= count; })); } void tick() { std::lock_guard lock(device_mutex); ++permits; device_changed.notify_all(); } void wait_state(Audio *a, bool shutdown) { pthread_mutex_lock(&a->mutex); while (shutdown ? !a->shutdown : a->active) pthread_cond_wait(&a->changed, &a->mutex); pthread_mutex_unlock(&a->mutex); } void finish(Audio *a) { auto done = std::async(std::launch::async, [&] { audio_ps5.free(a); }); wait_state(a, true); tick(); done.get(); assert(closes == 1); } Audio *create(unsigned latency = 10) { unsigned actual = 0; auto *a = static_cast