diff --git a/UnleashedRecomp/apu/driver/sdl2_driver.cpp b/UnleashedRecomp/apu/driver/sdl2_driver.cpp index e06e8a86..30156083 100644 --- a/UnleashedRecomp/apu/driver/sdl2_driver.cpp +++ b/UnleashedRecomp/apu/driver/sdl2_driver.cpp @@ -40,8 +40,6 @@ static void AudioThread() GuestThreadContext ctx(0); size_t channels = g_downMixToStereo ? 2 : XAUDIO_NUM_CHANNELS; - auto start = std::chrono::steady_clock::now(); - int64_t iteration = 1; while (true) { @@ -55,19 +53,14 @@ static void AudioThread() g_clientCallback(ctx.ppcContext, reinterpret_cast(g_memory.base)); } - auto next = start + std::chrono::nanoseconds((iteration * XAUDIO_NUM_SAMPLES * 1000000000ll) / XAUDIO_SAMPLES_HZ); auto now = std::chrono::steady_clock::now(); + constexpr auto INTERVAL = 1000000000ns * XAUDIO_NUM_SAMPLES / XAUDIO_SAMPLES_HZ; + auto next = now + (INTERVAL - now.time_since_epoch() % INTERVAL); - if ((next - now) < 1s) - { - std::this_thread::sleep_for(std::chrono::floor(next - now)); + std::this_thread::sleep_for(std::chrono::floor(next - now)); - while ((now = std::chrono::steady_clock::now()) < next) - std::this_thread::yield(); - } - - int64_t elapsed = std::chrono::nanoseconds(std::chrono::steady_clock::now() - start).count(); - iteration = ((elapsed * XAUDIO_SAMPLES_HZ) / (XAUDIO_NUM_SAMPLES * 1000000000ll)) + 1; + while (std::chrono::steady_clock::now() < next) + std::this_thread::yield(); } }