From d8bc9d351fc2aec89c07a026bf555b520cc4edc9 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 30 Aug 2019 13:04:17 -0400 Subject: [PATCH] android: jni: Improve management of core emulation state. - Furthermore fixes bug where audio crackling could bleed out of the app. --- src/android/app/src/main/jni/native.cpp | 29 +++++++++++++++---------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 49b148967..92731ea5c 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -47,12 +47,16 @@ std::unique_ptr window; std::atomic is_running{false}; std::atomic pause_emulation{false}; +std::mutex paused_mutex; std::mutex running_mutex; std::condition_variable running_cv; } // Anonymous namespace static int RunCitra(const std::string& filepath) { + // Citra core only supports a single running instance + std::lock_guard lock(running_mutex); + LOG_INFO(Frontend, "Citra is Starting"); MicroProfileOnThreadCreate("EmuThread"); @@ -63,26 +67,24 @@ static int RunCitra(const std::string& filepath) { return -1; } + Core::System& system{Core::System::GetInstance()}; + SCOPE_EXIT({ system.Shutdown(); }); + // Register frontend applets Frontend::RegisterDefaultApplets(); - - Core::System& system{Core::System::GetInstance()}; - - // If we have a window from last session, clean up old state - if (window) { - system.Shutdown(); - InputManager::Shutdown(); - window.reset(); - } + system.RegisterSoftwareKeyboard(std::make_shared(env)); { // Forces a config reload on game boot, if the user changed settings in the UI Config config; + Settings::Apply(); } - Settings::Apply(); InputManager::Init(); + SCOPE_EXIT({ InputManager::Shutdown(); }); + window = std::make_unique(s_surf); + SCOPE_EXIT({ window.reset(); }); const Core::System::ResultStatus load_result{system.Load(*window, filepath)}; switch (load_result) { @@ -124,7 +126,12 @@ static int RunCitra(const std::string& filepath) { if (!pause_emulation) { system.RunLoop(); } else { - std::unique_lock lock(running_mutex); + // Ensure no audio bleeds out while game is paused + const float volume = Settings::values.volume; + SCOPE_EXIT({ Settings::values.volume = volume; }); + Settings::values.volume = 0; + + std::unique_lock lock(paused_mutex); running_cv.wait(lock, [] { return !pause_emulation || !is_running; }); } }