From 9632d0ab8af972dd5fb9b10ab96baa3688ab0c9d Mon Sep 17 00:00:00 2001 From: Eladash Date: Tue, 1 Nov 2022 09:10:40 +0200 Subject: [PATCH] Emu: fixup message when the application has crashed --- rpcs3/Emu/System.cpp | 24 ++++++++++++++++++++---- rpcs3/Emu/localized_string_id.h | 1 + rpcs3/Input/pad_thread.cpp | 11 +++++++---- rpcs3/rpcs3qt/localized_emu.h | 1 + 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index d9a5a77f2b..5af75bcbf7 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -2051,6 +2051,18 @@ bool Emulator::Pause(bool freeze_emulation) return false; } } + + // Perform the side effects of Resume here when transforming paused to frozen state + BlockingCallFromMainThread([this]() + { + for (auto& ref : m_pause_msgs_refs) + { + // Delete the message queued on pause + *ref = 0; + } + + m_pause_msgs_refs.clear(); + }); } // Signal profilers to print results (if enabled) @@ -2073,7 +2085,9 @@ bool Emulator::Pause(bool freeze_emulation) BlockingCallFromMainThread([this]() { - if (IsStopped()) + const auto status = Emu.GetStatus(false); + + if (status != system_state::paused && status != system_state::frozen) { return; } @@ -2081,17 +2095,19 @@ bool Emulator::Pause(bool freeze_emulation) auto msg_ref = std::make_shared>(1); // No timeout - rsx::overlays::queue_message(localized_string_id::EMULATION_PAUSED_RESUME_WITH_START, -1, msg_ref); + rsx::overlays::queue_message(status == system_state::paused ? localized_string_id::EMULATION_PAUSED_RESUME_WITH_START : localized_string_id::EMULATION_FROZEN, -1, msg_ref); m_pause_msgs_refs.emplace_back(msg_ref); - auto refresh_l = [this, msg_ref]() + auto refresh_l = [this, msg_ref, status]() { - while (*msg_ref && IsPaused()) + while (*msg_ref && GetStatus(false) == status) { // Refresh Native UI rsx::set_native_ui_flip(); thread_ctrl::wait_for(33'000); } + + msg_ref->release(0); }; struct thread_t diff --git a/rpcs3/Emu/localized_string_id.h b/rpcs3/Emu/localized_string_id.h index 0e41713dc2..e28afb9e6c 100644 --- a/rpcs3/Emu/localized_string_id.h +++ b/rpcs3/Emu/localized_string_id.h @@ -149,4 +149,5 @@ enum class localized_string_id EMULATION_PAUSED_RESUME_WITH_START, EMULATION_RESUMING, + EMULATION_FROZEN, }; diff --git a/rpcs3/Input/pad_thread.cpp b/rpcs3/Input/pad_thread.cpp index b6ac42ab30..9110dd7437 100644 --- a/rpcs3/Input/pad_thread.cpp +++ b/rpcs3/Input/pad_thread.cpp @@ -403,7 +403,7 @@ void pad_thread::operator()() u64 pad_sleep = g_cfg.io.pad_sleep; - if (Emu.IsPaused()) + if (Emu.GetStatus(false) == system_state::paused) { pad_sleep = std::max(pad_sleep, 30'000); @@ -438,17 +438,20 @@ void pad_thread::operator()() m_mask_start_press_to_unpause = 0; m_track_start_press_begin_timestamp = 0; - sys_log.success("Unpausing emulation using the START button in a few seconds..."); - rsx::overlays::queue_message(localized_string_id::EMULATION_RESUMING, 2'000'000); + sys_log.success("Resuming emulation using the START button in a few seconds..."); + + auto msg_ref = std::make_shared>(1); + rsx::overlays::queue_message(localized_string_id::EMULATION_RESUMING, 2'000'000, msg_ref); m_resume_emulation_flag = true; for (u32 i = 0; i < 40; i++) { - if (!Emu.IsPaused()) + if (Emu.GetStatus(false) != system_state::paused) { // Abort if emulation has been resumed by other means m_resume_emulation_flag = false; + msg_ref->release(0); break; } diff --git a/rpcs3/rpcs3qt/localized_emu.h b/rpcs3/rpcs3qt/localized_emu.h index e9f784d725..85b5e4d03c 100644 --- a/rpcs3/rpcs3qt/localized_emu.h +++ b/rpcs3/rpcs3qt/localized_emu.h @@ -169,6 +169,7 @@ private: case localized_string_id::RPCN_SUCCESS_LOGGED_ON: return tr("Successfully logged on RPCN!"); case localized_string_id::EMULATION_PAUSED_RESUME_WITH_START: return tr("Press and hold the START button to resume"); case localized_string_id::EMULATION_RESUMING: return tr("Resuming...!"); + case localized_string_id::EMULATION_FROZEN: return tr("The PS3 application has likely crashed, you can close it."); case localized_string_id::INVALID: return tr("Invalid"); default: return tr("Unknown"); }