From 799cb796120f6410b513a1b27ad547b3331ccf45 Mon Sep 17 00:00:00 2001 From: Aleksey Komarov Date: Wed, 1 Jan 2025 22:59:24 +0300 Subject: [PATCH 01/16] qt6: QT_MIN_VER should be 6.7 because of QCheckBox::checkStateChanged Check: https://doc.qt.io/qt-6/qcheckbox.html --- 3rdparty/qt6.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/qt6.cmake b/3rdparty/qt6.cmake index 5619e0c68d..259727879e 100644 --- a/3rdparty/qt6.cmake +++ b/3rdparty/qt6.cmake @@ -1,6 +1,6 @@ add_library(3rdparty_qt6 INTERFACE) -set(QT_MIN_VER 6.4.0) +set(QT_MIN_VER 6.7.0) find_package(Qt6 ${QT_MIN_VER} CONFIG COMPONENTS Widgets Concurrent Multimedia MultimediaWidgets Svg SvgWidgets) if(WIN32) From fb237dd568b4b463676f58d050ae2358cf0d6117 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 1 Jan 2025 13:42:12 +0100 Subject: [PATCH 02/16] Audio: Add mute/unmute and volume shortcuts Also add auto repeat to volume shortcuts --- rpcs3/Emu/Audio/audio_utils.cpp | 39 ++++++++++++++++ rpcs3/Emu/Audio/audio_utils.h | 14 ++++++ rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/Cell/Modules/cellAudio.cpp | 3 +- rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp | 9 ++-- .../Trophies/overlay_trophy_list_dialog.cpp | 2 +- rpcs3/Emu/localized_string_id.h | 5 ++ rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 +++ rpcs3/rpcs3qt/gs_frame.cpp | 16 +++++++ rpcs3/rpcs3qt/gui_application.cpp | 3 +- rpcs3/rpcs3qt/localized_emu.h | 3 ++ rpcs3/rpcs3qt/shortcut_handler.cpp | 2 +- rpcs3/rpcs3qt/shortcut_settings.cpp | 46 +++++++++++-------- rpcs3/rpcs3qt/shortcut_settings.h | 4 ++ 15 files changed, 127 insertions(+), 28 deletions(-) create mode 100644 rpcs3/Emu/Audio/audio_utils.cpp create mode 100644 rpcs3/Emu/Audio/audio_utils.h diff --git a/rpcs3/Emu/Audio/audio_utils.cpp b/rpcs3/Emu/Audio/audio_utils.cpp new file mode 100644 index 0000000000..bcff7bf947 --- /dev/null +++ b/rpcs3/Emu/Audio/audio_utils.cpp @@ -0,0 +1,39 @@ +#include "stdafx.h" +#include "audio_utils.h" +#include "Emu/system_config.h" +#include "Emu/System.h" +#include "Emu/IdManager.h" +#include "Emu/RSX/Overlays/overlay_message.h" + +namespace audio +{ + f32 get_volume() + { + return g_fxo->get().audio_muted ? 0.0f : g_cfg.audio.volume / 100.0f; + } + + void toggle_mute() + { + audio_fxo& fxo = g_fxo->get(); + fxo.audio_muted = !fxo.audio_muted; + Emu.GetCallbacks().update_emu_settings(); + + rsx::overlays::queue_message(fxo.audio_muted ? localized_string_id::AUDIO_MUTED : localized_string_id::AUDIO_UNMUTED, 3'000'000); + } + + void change_volume(s32 delta) + { + // Ignore if muted + if (g_fxo->get().audio_muted) return; + + const s32 old_volume = g_cfg.audio.volume; + const s32 new_volume = old_volume + delta; + + if (old_volume == new_volume) return; + + g_cfg.audio.volume.set(std::clamp(new_volume, g_cfg.audio.volume.min, g_cfg.audio.volume.max)); + Emu.GetCallbacks().update_emu_settings(); + + rsx::overlays::queue_message(get_localized_string(localized_string_id::AUDIO_CHANGED, fmt::format("%d%%", g_cfg.audio.volume.get()).c_str()), 3'000'000); + } +} diff --git a/rpcs3/Emu/Audio/audio_utils.h b/rpcs3/Emu/Audio/audio_utils.h new file mode 100644 index 0000000000..048776c1c1 --- /dev/null +++ b/rpcs3/Emu/Audio/audio_utils.h @@ -0,0 +1,14 @@ +#pragma once + +namespace audio +{ + struct audio_fxo + { + atomic_t audio_muted {false}; + }; + + f32 get_volume(); + + void toggle_mute(); + void change_volume(s32 delta); +} diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index e77399784e..4cd083ab90 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -125,6 +125,7 @@ target_sources(rpcs3_emu PRIVATE # Audio target_sources(rpcs3_emu PRIVATE Audio/audio_resampler.cpp + Audio/audio_utils.cpp Audio/AudioDumper.cpp Audio/AudioBackend.cpp Audio/Cubeb/CubebBackend.cpp diff --git a/rpcs3/Emu/Cell/Modules/cellAudio.cpp b/rpcs3/Emu/Cell/Modules/cellAudio.cpp index 2e31d37b6b..ceeb02da63 100644 --- a/rpcs3/Emu/Cell/Modules/cellAudio.cpp +++ b/rpcs3/Emu/Cell/Modules/cellAudio.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "Emu/System.h" #include "Emu/system_config.h" +#include "Emu/Audio/audio_utils.h" #include "Emu/Cell/PPUModule.h" #include "Emu/Cell/lv2/sys_process.h" #include "Emu/Cell/lv2/sys_event.h" @@ -1041,7 +1042,7 @@ void cell_audio_thread::mix(float* out_buffer, s32 offset) constexpr u32 out_channels = static_cast(channels); constexpr u32 out_buffer_sz = out_channels * AUDIO_BUFFER_SAMPLES; - const float master_volume = g_cfg.audio.volume / 100.0f; + const float master_volume = audio::get_volume(); // Reset out_buffer std::memset(out_buffer, 0, out_buffer_sz * sizeof(float)); diff --git a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp index c391602bc3..5f06415ac7 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp @@ -3,6 +3,7 @@ #include "Emu/IdManager.h" #include "Emu/System.h" #include "Emu/system_config.h" +#include "Emu//Audio/audio_utils.h" #include "Emu//Cell/Modules/cellAudioOut.h" #include "util/video_provider.h" @@ -1308,11 +1309,11 @@ rsxaudio_backend_thread::rsxaudio_backend_thread() { new_emu_cfg = get_emu_cfg(); - const u64 new_vol = g_cfg.audio.volume; + const f32 new_vol = audio::get_volume(); callback_cfg.atomic_op([&](callback_config& val) { - val.target_volume = static_cast(new_vol / 100.0 * callback_config::VOL_NOMINAL); + val.target_volume = static_cast(new_vol * callback_config::VOL_NOMINAL); val.initial_volume = val.current_volume; }); } @@ -1332,11 +1333,11 @@ void rsxaudio_backend_thread::update_emu_cfg() { std::unique_lock lock(state_update_m); const emu_audio_cfg _new_emu_cfg = get_emu_cfg(); - const u64 new_vol = g_cfg.audio.volume; + const f32 new_vol = audio::get_volume(); callback_cfg.atomic_op([&](callback_config& val) { - val.target_volume = static_cast(new_vol / 100.0 * callback_config::VOL_NOMINAL); + val.target_volume = static_cast(new_vol * callback_config::VOL_NOMINAL); val.initial_volume = val.current_volume; }); diff --git a/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp index 46b471d83f..8213b29a2d 100644 --- a/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp @@ -68,7 +68,7 @@ namespace rsx { m_dim_background = std::make_unique(); m_dim_background->set_size(virtual_width, virtual_height); - m_dim_background->back_color.a = 0.5f; + m_dim_background->back_color.a = 0.9f; m_list = std::make_unique(virtual_width - 2 * 20, 540); m_list->set_pos(20, 85); diff --git a/rpcs3/Emu/localized_string_id.h b/rpcs3/Emu/localized_string_id.h index 67bc9fe2a8..21437762bb 100644 --- a/rpcs3/Emu/localized_string_id.h +++ b/rpcs3/Emu/localized_string_id.h @@ -282,6 +282,10 @@ enum class localized_string_id HOME_MENU_TROPHY_GRADE_GOLD, HOME_MENU_TROPHY_GRADE_PLATINUM, + AUDIO_MUTED, + AUDIO_UNMUTED, + AUDIO_CHANGED, + PROGRESS_DIALOG_PROGRESS, PROGRESS_DIALOG_PROGRESS_ANALYZING, PROGRESS_DIALOG_REMAINING, @@ -303,6 +307,7 @@ enum class localized_string_id EMULATION_PAUSED_RESUME_WITH_START, EMULATION_RESUMING, EMULATION_FROZEN, + SAVESTATE_FAILED_DUE_TO_VDEC, SAVESTATE_FAILED_DUE_TO_SAVEDATA, SAVESTATE_FAILED_DUE_TO_SPU, diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 486cb1078e..3da2dc1872 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -58,6 +58,7 @@ + true @@ -530,6 +531,7 @@ + true diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 2c25be4696..90df56b77e 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1324,6 +1324,9 @@ Emu\GPU\RSX\Overlays\Trophies + + Emu\Audio + @@ -2677,6 +2680,9 @@ Emu\GPU\RSX\Overlays\Trophies + + Emu\Audio + diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index dd94f41857..8af0b84757 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -10,6 +10,7 @@ #include "Emu/system_config.h" #include "Emu/system_progress.hpp" #include "Emu/IdManager.h" +#include "Emu/Audio/audio_utils.h" #include "Emu/Cell/Modules/cellScreenshot.h" #include "Emu/Cell/Modules/cellVideoOut.h" #include "Emu/Cell/Modules/cellAudio.h" @@ -358,6 +359,21 @@ void gs_frame::handle_shortcut(gui::shortcuts::shortcut shortcut_key, const QKey pad::g_home_menu_requested = true; break; } + case gui::shortcuts::shortcut::gw_mute_unmute: + { + audio::toggle_mute(); + break; + } + case gui::shortcuts::shortcut::gw_volume_up: + { + audio::change_volume(5); + break; + } + case gui::shortcuts::shortcut::gw_volume_down: + { + audio::change_volume(-5); + break; + } default: { break; diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index fd5a50e326..0a3ff110ce 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -18,6 +18,7 @@ #include "_discord_utils.h" #endif +#include "Emu/Audio/audio_utils.h" #include "Emu/Io/Null/null_camera_handler.h" #include "Emu/Io/Null/null_music_handler.h" #include "Emu/vfs_config.h" @@ -621,7 +622,7 @@ void gui_application::InitializeCallbacks() // Create a new sound effect. Re-using the same object seems to be broken for some users starting with Qt 6.6.3. std::unique_ptr sound_effect = std::make_unique(); sound_effect->setSource(QUrl::fromLocalFile(QString::fromStdString(path))); - sound_effect->setVolume(g_cfg.audio.volume * 0.01f); + sound_effect->setVolume(audio::get_volume()); sound_effect->play(); m_sound_effects.push_back(std::move(sound_effect)); diff --git a/rpcs3/rpcs3qt/localized_emu.h b/rpcs3/rpcs3qt/localized_emu.h index 2a44ce7fae..8ea21f6d03 100644 --- a/rpcs3/rpcs3qt/localized_emu.h +++ b/rpcs3/rpcs3qt/localized_emu.h @@ -302,6 +302,9 @@ private: case localized_string_id::HOME_MENU_TROPHY_GRADE_SILVER: return tr("Silver", "Trophy type"); case localized_string_id::HOME_MENU_TROPHY_GRADE_GOLD: return tr("Gold", "Trophy type"); case localized_string_id::HOME_MENU_TROPHY_GRADE_PLATINUM: return tr("Platinum", "Trophy type"); + case localized_string_id::AUDIO_MUTED: return tr("Audio muted", "Audio"); + case localized_string_id::AUDIO_UNMUTED: return tr("Audio unmuted", "Audio"); + case localized_string_id::AUDIO_CHANGED: return tr("Volume changed to %0", "Audio").arg(std::forward(args)...); case localized_string_id::PROGRESS_DIALOG_PROGRESS: return tr("Progress:"); case localized_string_id::PROGRESS_DIALOG_PROGRESS_ANALYZING: return tr("Progress: analyzing..."); case localized_string_id::PROGRESS_DIALOG_REMAINING: return tr("remaining"); diff --git a/rpcs3/rpcs3qt/shortcut_handler.cpp b/rpcs3/rpcs3qt/shortcut_handler.cpp index a6b9bf8413..9d70aa0262 100644 --- a/rpcs3/rpcs3qt/shortcut_handler.cpp +++ b/rpcs3/rpcs3qt/shortcut_handler.cpp @@ -20,7 +20,7 @@ shortcut_handler::shortcut_handler(gui::shortcuts::shortcut_handler_id handler_i const QKeySequence key_sequence = sc_settings.get_key_sequence(info, gui_settings); QShortcut* shortcut = new QShortcut(key_sequence, parent); - shortcut->setAutoRepeat(false); + shortcut->setAutoRepeat(info.allow_auto_repeat); shortcut_key_info key_info{}; key_info.shortcut = shortcut; diff --git a/rpcs3/rpcs3qt/shortcut_settings.cpp b/rpcs3/rpcs3qt/shortcut_settings.cpp index d8f376cfeb..bca0fd57a9 100644 --- a/rpcs3/rpcs3qt/shortcut_settings.cpp +++ b/rpcs3/rpcs3qt/shortcut_settings.cpp @@ -29,6 +29,9 @@ void fmt_class_string::format(std::string& out, u64 arg) case shortcut::gw_frame_limit: return "gw_frame_limit"; case shortcut::gw_toggle_mouse_and_keyboard: return "gw_toggle_mouse_and_keyboard"; case shortcut::gw_home_menu: return "gw_home_menu"; + case shortcut::gw_mute_unmute: return "gw_mute_unmute"; + case shortcut::gw_volume_up: return "gw_volume_up"; + case shortcut::gw_volume_down: return "gw_volume_down"; case shortcut::count: return "count"; } @@ -53,26 +56,29 @@ void fmt_class_string::format(std::string& out, u64 arg) shortcut_settings::shortcut_settings() : shortcut_map({ - { shortcut::mw_start, shortcut_info{ "main_window_start", tr("Start"), "Ctrl+E", shortcut_handler_id::main_window } }, - { shortcut::mw_stop, shortcut_info{ "main_window_stop", tr("Stop"), "Ctrl+S", shortcut_handler_id::main_window } }, - { shortcut::mw_pause, shortcut_info{ "main_window_pause", tr("Pause"), "Ctrl+P", shortcut_handler_id::main_window } }, - { shortcut::mw_restart, shortcut_info{ "main_window_restart", tr("Restart"), "Ctrl+R", shortcut_handler_id::main_window } }, - { shortcut::mw_toggle_fullscreen, shortcut_info{ "main_window_toggle_fullscreen", tr("Toggle Fullscreen"), "Alt+Return", shortcut_handler_id::main_window } }, - { shortcut::mw_exit_fullscreen, shortcut_info{ "main_window_exit_fullscreen", tr("Exit Fullscreen"), "Esc", shortcut_handler_id::main_window } }, - { shortcut::mw_refresh, shortcut_info{ "main_window_refresh", tr("Refresh"), "Ctrl+F5", shortcut_handler_id::main_window } }, - { shortcut::gw_toggle_fullscreen, shortcut_info{ "game_window_toggle_fullscreen", tr("Toggle Fullscreen"), "Alt+Return", shortcut_handler_id::game_window } }, - { shortcut::gw_exit_fullscreen, shortcut_info{ "game_window_exit_fullscreen", tr("Exit Fullscreen"), "Esc", shortcut_handler_id::game_window } }, - { shortcut::gw_log_mark, shortcut_info{ "game_window_log_mark", tr("Add Log Mark"), "Alt+L", shortcut_handler_id::game_window } }, - { shortcut::gw_mouse_lock, shortcut_info{ "game_window_mouse_lock", tr("Mouse lock"), "Ctrl+L", shortcut_handler_id::game_window } }, - { shortcut::gw_toggle_recording, shortcut_info{ "game_window_toggle_recording", tr("Start/Stop Recording"), "F11", shortcut_handler_id::game_window } }, - { shortcut::gw_screenshot, shortcut_info{ "game_window_screenshot", tr("Screenshot"), "F12", shortcut_handler_id::game_window } }, - { shortcut::gw_pause_play, shortcut_info{ "game_window_pause_play", tr("Pause/Play"), "Ctrl+P", shortcut_handler_id::game_window } }, - { shortcut::gw_savestate, shortcut_info{ "game_window_savestate", tr("Savestate"), "Ctrl+S", shortcut_handler_id::game_window } }, - { shortcut::gw_restart, shortcut_info{ "game_window_restart", tr("Restart"), "Ctrl+R", shortcut_handler_id::game_window } }, - { shortcut::gw_rsx_capture, shortcut_info{ "game_window_rsx_capture", tr("RSX Capture"), "Alt+C", shortcut_handler_id::game_window } }, - { shortcut::gw_frame_limit, shortcut_info{ "game_window_frame_limit", tr("Toggle Framelimit"), "Ctrl+F10", shortcut_handler_id::game_window } }, - { shortcut::gw_toggle_mouse_and_keyboard, shortcut_info{ "game_window_toggle_mouse_and_keyboard", tr("Toggle Keyboard"), "Ctrl+F11", shortcut_handler_id::game_window } }, - { shortcut::gw_home_menu, shortcut_info{ "gw_home_menu", tr("Open Home Menu"), "Shift+F10", shortcut_handler_id::game_window } }, + { shortcut::mw_start, shortcut_info{ "main_window_start", tr("Start"), "Ctrl+E", shortcut_handler_id::main_window, false } }, + { shortcut::mw_stop, shortcut_info{ "main_window_stop", tr("Stop"), "Ctrl+S", shortcut_handler_id::main_window, false } }, + { shortcut::mw_pause, shortcut_info{ "main_window_pause", tr("Pause"), "Ctrl+P", shortcut_handler_id::main_window, false } }, + { shortcut::mw_restart, shortcut_info{ "main_window_restart", tr("Restart"), "Ctrl+R", shortcut_handler_id::main_window, false } }, + { shortcut::mw_toggle_fullscreen, shortcut_info{ "main_window_toggle_fullscreen", tr("Toggle Fullscreen"), "Alt+Return", shortcut_handler_id::main_window, false } }, + { shortcut::mw_exit_fullscreen, shortcut_info{ "main_window_exit_fullscreen", tr("Exit Fullscreen"), "Esc", shortcut_handler_id::main_window, false } }, + { shortcut::mw_refresh, shortcut_info{ "main_window_refresh", tr("Refresh"), "Ctrl+F5", shortcut_handler_id::main_window, false } }, + { shortcut::gw_toggle_fullscreen, shortcut_info{ "game_window_toggle_fullscreen", tr("Toggle Fullscreen"), "Alt+Return", shortcut_handler_id::game_window, false } }, + { shortcut::gw_exit_fullscreen, shortcut_info{ "game_window_exit_fullscreen", tr("Exit Fullscreen"), "Esc", shortcut_handler_id::game_window, false } }, + { shortcut::gw_log_mark, shortcut_info{ "game_window_log_mark", tr("Add Log Mark"), "Alt+L", shortcut_handler_id::game_window, false } }, + { shortcut::gw_mouse_lock, shortcut_info{ "game_window_mouse_lock", tr("Mouse lock"), "Ctrl+L", shortcut_handler_id::game_window, false } }, + { shortcut::gw_toggle_recording, shortcut_info{ "game_window_toggle_recording", tr("Start/Stop Recording"), "F11", shortcut_handler_id::game_window, false } }, + { shortcut::gw_screenshot, shortcut_info{ "game_window_screenshot", tr("Screenshot"), "F12", shortcut_handler_id::game_window, false } }, + { shortcut::gw_pause_play, shortcut_info{ "game_window_pause_play", tr("Pause/Play"), "Ctrl+P", shortcut_handler_id::game_window, false } }, + { shortcut::gw_savestate, shortcut_info{ "game_window_savestate", tr("Savestate"), "Ctrl+S", shortcut_handler_id::game_window, false } }, + { shortcut::gw_restart, shortcut_info{ "game_window_restart", tr("Restart"), "Ctrl+R", shortcut_handler_id::game_window, false } }, + { shortcut::gw_rsx_capture, shortcut_info{ "game_window_rsx_capture", tr("RSX Capture"), "Alt+C", shortcut_handler_id::game_window, false } }, + { shortcut::gw_frame_limit, shortcut_info{ "game_window_frame_limit", tr("Toggle Framelimit"), "Ctrl+F10", shortcut_handler_id::game_window, false } }, + { shortcut::gw_toggle_mouse_and_keyboard, shortcut_info{ "game_window_toggle_mouse_and_keyboard", tr("Toggle Keyboard"), "Ctrl+F11", shortcut_handler_id::game_window, false } }, + { shortcut::gw_home_menu, shortcut_info{ "gw_home_menu", tr("Open Home Menu"), "Shift+F10", shortcut_handler_id::game_window, false } }, + { shortcut::gw_mute_unmute, shortcut_info{ "gw_mute_unmute", tr("Mute/Unmute Audio"), "Shift+M", shortcut_handler_id::game_window, false } }, + { shortcut::gw_volume_up, shortcut_info{ "gw_volume_up", tr("Volume Up"), "Shift++", shortcut_handler_id::game_window, true } }, + { shortcut::gw_volume_down, shortcut_info{ "gw_volume_down", tr("Volume Down"), "Shift+-", shortcut_handler_id::game_window, true } }, }) { } diff --git a/rpcs3/rpcs3qt/shortcut_settings.h b/rpcs3/rpcs3qt/shortcut_settings.h index c47f8ff3a9..4e119c4f21 100644 --- a/rpcs3/rpcs3qt/shortcut_settings.h +++ b/rpcs3/rpcs3qt/shortcut_settings.h @@ -37,6 +37,9 @@ namespace gui gw_frame_limit, gw_toggle_mouse_and_keyboard, gw_home_menu, + gw_mute_unmute, + gw_volume_up, + gw_volume_down, count }; @@ -49,6 +52,7 @@ struct shortcut_info QString localized_name; QString key_sequence; gui::shortcuts::shortcut_handler_id handler_id{}; + bool allow_auto_repeat = false; }; class shortcut_settings : public QObject From cb3662cc4d114db7bc580370dc3d89e58ee2af72 Mon Sep 17 00:00:00 2001 From: Andrew Griffiths Date: Fri, 3 Jan 2025 03:49:07 +1100 Subject: [PATCH 03/16] MacOS: fix for crash in SDL_Quit w/ gamepad input --- rpcs3/Input/sdl_pad_handler.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rpcs3/Input/sdl_pad_handler.cpp b/rpcs3/Input/sdl_pad_handler.cpp index 28e10e285d..aaf95331f1 100644 --- a/rpcs3/Input/sdl_pad_handler.cpp +++ b/rpcs3/Input/sdl_pad_handler.cpp @@ -4,6 +4,7 @@ #include "sdl_pad_handler.h" #include "Emu/system_utils.hpp" #include "Emu/system_config.h" +#include "Emu/System.h" #include @@ -262,7 +263,14 @@ bool sdl_pad_handler::Init() if (m_is_init) return true; - if (!sdl_instance::get_instance().initialize()) + bool instance_success; + + Emu.BlockingCallFromMainThread([&instance_success]() + { + instance_success = sdl_instance::get_instance().initialize(); + }); + + if (!instance_success) return false; if (g_cfg.io.load_sdl_mappings) From a8f80ebfe9380b711dfa8b653d5e7e02819328bf Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Fri, 3 Jan 2025 15:29:03 +0200 Subject: [PATCH 04/16] sys_time.cpp: Anti TSC measures --- rpcs3/Emu/Cell/lv2/sys_time.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_time.cpp b/rpcs3/Emu/Cell/lv2/sys_time.cpp index b04be640bc..92ac650f8d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_time.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_time.cpp @@ -147,7 +147,7 @@ u64 convert_to_timebased_time(u64 time) u64 get_timebased_time() { - if (u64 freq = utils::get_tsc_freq()) + if (0) if (u64 freq = utils::get_tsc_freq()) { const u64 tsc = utils::get_tsc(); @@ -207,7 +207,7 @@ void initialize_timebased_time(u64 timebased_init, bool reset) // Returns some relative time in microseconds, don't change this fact u64 get_system_time() { - if (u64 freq = utils::get_tsc_freq()) + if (0) if (u64 freq = utils::get_tsc_freq()) { const u64 tsc = utils::get_tsc(); From 796189ce68b93dcece9415bd3bda76c1f3bdc953 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 3 Jan 2025 10:08:03 +0100 Subject: [PATCH 05/16] Update SDL to 2.30.11 --- 3rdparty/libsdl-org/SDL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libsdl-org/SDL b/3rdparty/libsdl-org/SDL index 9c821dc21c..fa24d868ac 160000 --- a/3rdparty/libsdl-org/SDL +++ b/3rdparty/libsdl-org/SDL @@ -1 +1 @@ -Subproject commit 9c821dc21ccbd69b2bda421fdb35cb4ae2da8f5e +Subproject commit fa24d868ac2f8fd558e4e914c9863411245db8fd From 4b4399f63f548f0884cc1c4cf61baa935dbbe92c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 3 Jan 2025 10:09:09 +0100 Subject: [PATCH 06/16] Update FAudio to 25.01 --- 3rdparty/FAudio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/FAudio b/3rdparty/FAudio index b7c2e109ea..707114aef2 160000 --- a/3rdparty/FAudio +++ b/3rdparty/FAudio @@ -1 +1 @@ -Subproject commit b7c2e109ea86b82109244c9c4569ce9ad0c884df +Subproject commit 707114aef2907793644d4067a6e7b09b51502ca9 From e76bd11f53cf717722935148c7774245462e087e Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 3 Jan 2025 10:11:47 +0100 Subject: [PATCH 07/16] Update Wolfssl to 5.7.6 --- 3rdparty/wolfssl/wolfssl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/wolfssl/wolfssl b/3rdparty/wolfssl/wolfssl index bdd62314f0..239b85c804 160000 --- a/3rdparty/wolfssl/wolfssl +++ b/3rdparty/wolfssl/wolfssl @@ -1 +1 @@ -Subproject commit bdd62314f00fca0e216bf8c963c8eeff6327e0cb +Subproject commit 239b85c80438bf60d9a5b9e0ebe9ff097a760d0d From dfdb33befbfa929a096e30140333632991a67b76 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 3 Jan 2025 10:13:50 +0100 Subject: [PATCH 08/16] Update xxHash to 0.8.3 --- 3rdparty/xxHash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/xxHash b/3rdparty/xxHash index bbb27a5efb..e626a72bc2 160000 --- a/3rdparty/xxHash +++ b/3rdparty/xxHash @@ -1 +1 @@ -Subproject commit bbb27a5efb85b92a0486cf361a8635715a53f6ba +Subproject commit e626a72bc2321cd320e953a0ccf1584cad60f363 From 4f76aec6b33bcb92cec8202b9e7236950cc2b00f Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 3 Jan 2025 11:42:47 +0100 Subject: [PATCH 09/16] VS: Fix compilation with new wolfssl version --- 3rdparty/wolfssl/wolfssl.vcxproj | 91 ++++++++++++++++++++++++++++++++ rpcs3/emucore.vcxproj | 6 +-- rpcs3/rpcs3.vcxproj | 8 +-- 3 files changed, 98 insertions(+), 7 deletions(-) diff --git a/3rdparty/wolfssl/wolfssl.vcxproj b/3rdparty/wolfssl/wolfssl.vcxproj index e3da6588f8..90da8b7f38 100644 --- a/3rdparty/wolfssl/wolfssl.vcxproj +++ b/3rdparty/wolfssl/wolfssl.vcxproj @@ -139,6 +139,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false false @@ -160,6 +248,9 @@ true + + + diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 3da2dc1872..0c54d02978 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -40,10 +40,10 @@ Use - ..\3rdparty\miniupnp\miniupnp\miniupnpc\include;..\3rdparty\wolfssl\wolfssl;..\3rdparty\flatbuffers\include;..\3rdparty\libusb\libusb\libusb;..\3rdparty\yaml-cpp\yaml-cpp\include;..\3rdparty\SoundTouch\soundtouch\include;..\3rdparty\rtmidi\rtmidi;..\3rdparty\zlib\zlib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm\include;$(VULKAN_SDK)\Include;..\3rdparty\zstd\zstd\lib;$(SolutionDir)3rdparty\fusion\fusion\Fusion + ..\3rdparty\miniupnp\miniupnp\miniupnpc\include;..\3rdparty\wolfssl\wolfssl;..\3rdparty\flatbuffers\include;..\3rdparty\libusb\libusb\libusb;..\3rdparty\yaml-cpp\yaml-cpp\include;..\3rdparty\SoundTouch\soundtouch\include;..\3rdparty\rtmidi\rtmidi;..\3rdparty\zlib\zlib;$(SolutionDir)build\lib\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm_build\include;$(SolutionDir)build\lib_ext\$(Configuration)-$(Platform)\llvm\include;$(VULKAN_SDK)\Include;..\3rdparty\zstd\zstd\lib;$(SolutionDir)3rdparty\fusion\fusion\Fusion;$(SolutionDir)3rdparty\wolfssl\extra\win32 MaxSpeed - AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL2;ZLIB_CONST;%(PreprocessorDefinitions) - AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL2;ZLIB_CONST;%(PreprocessorDefinitions) + AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL2;ZLIB_CONST;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + AL_LIBTYPE_STATIC;MINIUPNP_STATICLIB;HAVE_VULKAN;HAVE_SDL2;ZLIB_CONST;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) %(AdditionalModuleDependencies) %(AdditionalModuleDependencies) diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 755370a4c7..adb7e376be 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -71,7 +71,7 @@ - $(SolutionDir)3rdparty\opencv\opencv\opencv410\build\include;$(SolutionDir)3rdparty\SoundTouch\soundtouch\include;$(SolutionDir)3rdparty\cubeb\extra;$(SolutionDir)3rdparty\cubeb\cubeb\include\;$(SolutionDir)3rdparty\flatbuffers\include;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\curl\curl\include;$(SolutionDir)3rdparty\rtmidi\rtmidi;$(SolutionDir)3rdparty\libusb\libusb\libusb;$(VULKAN_SDK)\Include;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtSvgWidgets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtMultimedia;$(QTDIR)\mkspecs\win32-msvc;.\release;.\QTGeneratedFiles\$(ConfigurationName);.\QTGeneratedFiles;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\opencv\opencv\opencv410\build\include;$(SolutionDir)3rdparty\SoundTouch\soundtouch\include;$(SolutionDir)3rdparty\cubeb\extra;$(SolutionDir)3rdparty\cubeb\cubeb\include\;$(SolutionDir)3rdparty\flatbuffers\include;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\curl\curl\include;$(SolutionDir)3rdparty\rtmidi\rtmidi;$(SolutionDir)3rdparty\libusb\libusb\libusb;$(VULKAN_SDK)\Include;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtSvgWidgets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtMultimedia;$(QTDIR)\mkspecs\win32-msvc;.\release;.\QTGeneratedFiles\$(ConfigurationName);.\QTGeneratedFiles;%(AdditionalIncludeDirectories) /Zc:__cplusplus -Zc:strictStrings -Zc:throwingNew- -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions) release\ false @@ -79,7 +79,7 @@ 4577;4467;4281;%(DisableSpecificWarnings) $(IntDir) MaxSpeed - _WINDOWS;UNICODE;WIN32;WIN64;WIN32_LEAN_AND_MEAN;HAVE_VULKAN;HAVE_OPENCV;CV_IGNORE_DEBUG_BUILD_GUARD;MINIUPNP_STATICLIB;ZLIB_CONST;AL_LIBTYPE_STATIC;HAVE_SDL2;WITH_DISCORD_RPC;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;NDEBUG;QT_WINEXTRAS_LIB;QT_CONCURRENT_LIB;QT_MULTIMEDIA_LIB;QT_MULTIMEDIAWIDGETS_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) + _WINDOWS;UNICODE;WIN32;WIN64;WIN32_LEAN_AND_MEAN;HAVE_VULKAN;HAVE_OPENCV;CV_IGNORE_DEBUG_BUILD_GUARD;MINIUPNP_STATICLIB;ZLIB_CONST;AL_LIBTYPE_STATIC;WOLFSSL_USER_SETTINGS;HAVE_SDL2;WITH_DISCORD_RPC;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;NDEBUG;QT_WINEXTRAS_LIB;QT_CONCURRENT_LIB;QT_MULTIMEDIA_LIB;QT_MULTIMEDIAWIDGETS_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb true @@ -124,7 +124,7 @@ - $(SolutionDir)3rdparty\opencv\opencv\opencv410\build\include;$(SolutionDir)3rdparty\SoundTouch\soundtouch\include;$(SolutionDir)3rdparty\cubeb\extra;$(SolutionDir)3rdparty\cubeb\cubeb\include\;$(SolutionDir)3rdparty\flatbuffers\include;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\curl\curl\include;$(SolutionDir)3rdparty\rtmidi\rtmidi;$(SolutionDir)3rdparty\libusb\libusb\libusb;$(VULKAN_SDK)\Include;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtSvgWidgets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtMultimedia;$(QTDIR)\mkspecs\win32-msvc;.\debug;.\QTGeneratedFiles\$(ConfigurationName);.\QTGeneratedFiles;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\opencv\opencv\opencv410\build\include;$(SolutionDir)3rdparty\SoundTouch\soundtouch\include;$(SolutionDir)3rdparty\cubeb\extra;$(SolutionDir)3rdparty\cubeb\cubeb\include\;$(SolutionDir)3rdparty\flatbuffers\include;$(SolutionDir)3rdparty\wolfssl\wolfssl;$(SolutionDir)3rdparty\wolfssl\extra\win32;$(SolutionDir)3rdparty\curl\curl\include;$(SolutionDir)3rdparty\rtmidi\rtmidi;$(SolutionDir)3rdparty\libusb\libusb\libusb;$(VULKAN_SDK)\Include;$(SolutionDir)3rdparty\libsdl-org\SDL\include;$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtConcurrent;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtSvgWidgets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtMultimedia;$(QTDIR)\mkspecs\win32-msvc;.\debug;.\QTGeneratedFiles\$(ConfigurationName);.\QTGeneratedFiles;%(AdditionalIncludeDirectories) /Zc:__cplusplus -Zc:strictStrings -Zc:throwingNew- -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions) debug\ false @@ -132,7 +132,7 @@ 4577;4467;4281;%(DisableSpecificWarnings) $(IntDir) Disabled - _WINDOWS;UNICODE;WIN32;WIN64;WIN32_LEAN_AND_MEAN;HAVE_VULKAN;HAVE_OPENCV;CV_IGNORE_DEBUG_BUILD_GUARD;MINIUPNP_STATICLIB;ZLIB_CONST;AL_LIBTYPE_STATIC;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;QT_WINEXTRAS_LIB;QT_CONCURRENT_LIB;QT_MULTIMEDIA_LIB;QT_MULTIMEDIAWIDGETS_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) + _WINDOWS;UNICODE;WIN32;WIN64;WIN32_LEAN_AND_MEAN;HAVE_VULKAN;HAVE_OPENCV;CV_IGNORE_DEBUG_BUILD_GUARD;MINIUPNP_STATICLIB;ZLIB_CONST;AL_LIBTYPE_STATIC;WOLFSSL_USER_SETTINGS;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;QT_WINEXTRAS_LIB;QT_CONCURRENT_LIB;QT_MULTIMEDIA_LIB;QT_MULTIMEDIAWIDGETS_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) false true true From 8ea27b0aca38f78faa4445286e8b8fb43693a209 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 3 Jan 2025 19:05:06 +0100 Subject: [PATCH 10/16] Qt: workaround for crash in long accepted slot --- rpcs3/rpcs3qt/main_window.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index d3206b7bdb..3526cce235 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -405,7 +405,7 @@ void main_window::OnMissingFw() connect(mb, &QDialog::accepted, this, [this]() { - InstallPup(); + QTimer::singleShot(1, [this](){ InstallPup(); }); // singleShot to avoid a Qt bug that causes a deletion of the sender during long slots. }); } From 2614450e4b2f7d9d49dfad9e769c4ad4b99e46ba Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sat, 4 Jan 2025 08:28:19 +0200 Subject: [PATCH 11/16] Fix IDM image serialization --- rpcs3/Emu/Cell/lv2/sys_cond.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_event.cpp | 4 ++-- rpcs3/Emu/Cell/lv2/sys_event_flag.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_memory.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_mmapper.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_mutex.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_net.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_overlay.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_sync.h | 2 +- rpcs3/Emu/IdManager.h | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_cond.cpp b/rpcs3/Emu/Cell/lv2/sys_cond.cpp index bcfe83aed3..4387d27306 100644 --- a/rpcs3/Emu/Cell/lv2/sys_cond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_cond.cpp @@ -71,7 +71,7 @@ CellError lv2_cond::on_id_create() std::function lv2_cond::load(utils::serial& ar) { - return load_func(make_shared(ar)); + return load_func(make_shared(stx::exact_t(ar))); } void lv2_cond::save(utils::serial& ar) diff --git a/rpcs3/Emu/Cell/lv2/sys_event.cpp b/rpcs3/Emu/Cell/lv2/sys_event.cpp index 0428fd0f11..d5ad126142 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event.cpp @@ -37,8 +37,8 @@ lv2_event_queue::lv2_event_queue(utils::serial& ar) noexcept std::function lv2_event_queue::load(utils::serial& ar) { - auto queue = make_shared(ar); - return [ptr = lv2_obj::load(queue->key, queue)](void* storage) { *static_cast*>(storage) = ptr; }; + auto queue = make_shared(stx::exact_t(ar)); + return [ptr = lv2_obj::load(queue->key, queue)](void* storage) { *static_cast*>(storage) = ptr; }; } void lv2_event_queue::save(utils::serial& ar) diff --git a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp index 6c630e9261..971408e042 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp @@ -24,7 +24,7 @@ lv2_event_flag::lv2_event_flag(utils::serial& ar) std::function lv2_event_flag::load(utils::serial& ar) { - return load_func(make_shared(ar)); + return load_func(make_shared(stx::exact_t(ar))); } void lv2_event_flag::save(utils::serial& ar) diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.cpp b/rpcs3/Emu/Cell/lv2/sys_memory.cpp index de5590426e..6cfc3a1860 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_memory.cpp @@ -33,7 +33,7 @@ std::function lv2_memory_container::load(utils::serial& ar) // Use idm::last_id() only for the instances at IDM return [ptr = make_shared(stx::exact_t(ar), true)](void* storage) { - *static_cast*>(storage) = ptr; + *static_cast*>(storage) = ptr; }; } diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp index d134102a73..805d5db0ad 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp @@ -84,7 +84,7 @@ CellError lv2_memory::on_id_create() std::function lv2_memory::load(utils::serial& ar) { - auto mem = make_shared(ar); + auto mem = make_shared(stx::exact_t(ar)); mem->exists++; // Disable on_id_create() auto func = load_func(mem, +mem->pshared); mem->exists--; diff --git a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp index c8ac190c25..f2d23291ff 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp @@ -27,7 +27,7 @@ lv2_mutex::lv2_mutex(utils::serial& ar) std::function lv2_mutex::load(utils::serial& ar) { - return load_func(make_shared(ar)); + return load_func(make_shared(stx::exact_t(ar))); } void lv2_mutex::save(utils::serial& ar) diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 97d40d6d47..aae2454619 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -293,7 +293,7 @@ std::function lv2_socket::load(utils::serial& ar) sock_lv2->bind(sock_lv2->last_bound_addr); } - return [ptr = sock_lv2](void* storage) { *static_cast*>(storage) = ptr; };; + return [ptr = sock_lv2](void* storage) { *static_cast*>(storage) = ptr; };; } void lv2_socket::save(utils::serial& ar, bool save_only_this_class) diff --git a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp index 99b5981795..66481ed280 100644 --- a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp @@ -112,7 +112,7 @@ std::function lv2_overlay::load(utils::serial& ar) return [ovlm](void* storage) { - *static_cast*>(storage) = ovlm; + *static_cast*>(storage) = ovlm; }; } diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 42903d7454..f918070a4e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -372,7 +372,7 @@ std::function lv2_prx::load(utils::serial& ar) return [prx](void* storage) { - *static_cast*>(storage) = prx; + *static_cast*>(storage) = prx; }; } diff --git a/rpcs3/Emu/Cell/lv2/sys_sync.h b/rpcs3/Emu/Cell/lv2/sys_sync.h index 644e0c90f2..bd6004dfaa 100644 --- a/rpcs3/Emu/Cell/lv2/sys_sync.h +++ b/rpcs3/Emu/Cell/lv2/sys_sync.h @@ -449,7 +449,7 @@ public: static std::function load_func(shared_ptr make, u64 pshared = umax) { const u64 key = make->key; - return [ptr = load(key, make, pshared)](void* storage) { *static_cast*>(storage) = ptr; }; + return [ptr = load(key, make, pshared)](void* storage) { *static_cast*>(storage) = ptr; }; } static bool wait_timeout(u64 usec, ppu_thread* cpu = {}, bool scale = true, bool is_usleep = false); diff --git a/rpcs3/Emu/IdManager.h b/rpcs3/Emu/IdManager.h index 99082462f9..26162045b7 100644 --- a/rpcs3/Emu/IdManager.h +++ b/rpcs3/Emu/IdManager.h @@ -123,7 +123,7 @@ namespace id_manager ptr = stx::make_shared(stx::exact_t(ar)); } - return [ptr](void* storage) { *static_cast*>(storage) = ptr; }; + return [ptr](void* storage) { *static_cast*>(storage) = ptr; }; }; }; From 51417cc8c36eda525574c231a2a826e8c6705e6b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 02:11:19 +0100 Subject: [PATCH 12/16] Qt: stop batch compilation immediately on cancel --- rpcs3/rpcs3qt/game_list_frame.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 12886b8664..aa004211b9 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -2414,6 +2414,14 @@ void game_list_frame::BatchCreateCPUCaches(const std::vector& game_da pdlg->setAutoReset(false); pdlg->open(); + connect(pdlg, &progress_dialog::canceled, this, []() + { + if (!Emu.IsStopped()) + { + Emu.GracefulShutdown(false, true); + } + }); + BatchActionBySerials(pdlg, serials, tr("%0\nProgress: %1/%2 caches compiled").arg(main_label), [&, game_data](const std::string& serial) { From 635eac7704b674ba78e8a122fb99cc7b689fa747 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 02:13:39 +0100 Subject: [PATCH 13/16] Qt: fix batch compilation after a game was already running Batch compilation wasn't working if g_system_progress_canceled wasn't reset --- rpcs3/Emu/system_progress.cpp | 1 + rpcs3/rpcs3qt/game_list_frame.cpp | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/system_progress.cpp b/rpcs3/Emu/system_progress.cpp index feeaea352d..66d59af65b 100644 --- a/rpcs3/Emu/system_progress.cpp +++ b/rpcs3/Emu/system_progress.cpp @@ -41,6 +41,7 @@ void progress_dialog_server::operator()() { std::shared_ptr native_dlg; g_system_progress_stopping = false; + g_system_progress_canceled = false; const auto get_state = []() { diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index aa004211b9..a5fc1f4525 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -2277,11 +2277,13 @@ void game_list_frame::RemoveHDD1Cache(const std::string& base_dir, const std::st game_list_log.fatal("Only %d/%d HDD1 cache directories could be removed in %s (%s)", dirs_removed, dirs_total, base_dir, title_id); } -void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, QString progressLabel, std::function action, std::function cancel_log, bool refresh_on_finish, bool can_be_concurrent, std::function should_wait_cb) +void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, QString progressLabel, std::function action, std::function cancel_log, bool refresh_on_finish, bool can_be_concurrent, std::function should_wait_cb) { // Concurrent tasks should not wait (at least not in current implementation) ensure(!should_wait_cb || !can_be_concurrent); + g_system_progress_canceled = false; + const std::shared_ptr> iterate_over_serial = std::make_shared>(); const std::shared_ptr> index = std::make_shared>(0); @@ -2297,12 +2299,16 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set const std::string& serial = *std::next(serials.begin(), index); - if (pdlg->wasCanceled() || g_system_progress_canceled) + if (pdlg->wasCanceled() || g_system_progress_canceled.exchange(false)) { - cancel_log(index, serials_size); + if (cancel_log) + { + cancel_log(index, serials_size); + } return false; } - else if (action(serial)) + + if (action(serial)) { const int done = index_ptr->load(); pdlg->setLabelText(progressLabel.arg(done + 1).arg(serials_size)); From d2b96636db1d76c8ea00064a5dbd3c120b69afdf Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 02:13:59 +0100 Subject: [PATCH 14/16] Qt: delete batch progress dialog after user closed it (as originally intended) --- rpcs3/rpcs3qt/game_list_frame.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index a5fc1f4525..02ca16716e 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -2366,19 +2366,17 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set if ((*iterate_over_serial)(*index)) { QTimer::singleShot(1, this, *periodic_func); + return; } - else + + pdlg->setLabelText(progressLabel.arg(*index).arg(serials_size)); + pdlg->setCancelButtonText(tr("OK")); + connect(pdlg, &progress_dialog::canceled, this, [pdlg](){ pdlg->deleteLater(); }); + QApplication::beep(); + + if (refresh_on_finish && index) { - pdlg->setLabelText(progressLabel.arg(*index).arg(serials_size)); - pdlg->setCancelButtonText(tr("OK")); - QApplication::beep(); - - if (refresh_on_finish && index) - { - Refresh(true); - } - - pdlg->deleteLater(); + Refresh(true); } }; From af3154a0d42be778d861a06fac2fc1374190f38c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 14:58:15 +0100 Subject: [PATCH 15/16] Qt: delete settings_dialog --- rpcs3/rpcs3qt/main_window.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 3526cce235..f499cd6474 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -394,7 +394,7 @@ void main_window::OnMissingFw() { const QString title = tr("Missing Firmware Detected!"); const QString message = tr("Commercial games require the firmware (PS3UPDAT.PUP file) to be installed." - "\n
For information about how to obtain the required firmware read the quickstart guide.").arg(gui::utils::get_link_style()); + "\n
For information about how to obtain the required firmware read the quickstart guide.").arg(gui::utils::get_link_style()); QMessageBox* mb = new QMessageBox(QMessageBox::Question, title, message, QMessageBox::Ok | QMessageBox::Cancel, this, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint | Qt::WindowStaysOnTopHint); mb->setTextFormat(Qt::RichText); @@ -2852,6 +2852,7 @@ void main_window::CreateConnects() connect(dlg, &settings_dialog::EmuSettingsApplied, this, &main_window::NotifyEmuSettingsChange); connect(dlg, &settings_dialog::EmuSettingsApplied, this, &main_window::update_gui_pad_thread); connect(dlg, &settings_dialog::EmuSettingsApplied, m_log_frame, &log_frame::LoadSettings); + dlg->setAttribute(Qt::WA_DeleteOnClose); dlg->open(); }; From f255392a75ad6474b6fb879789b57097831aebcb Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 15:00:14 +0100 Subject: [PATCH 16/16] patches: create patch path on update --- rpcs3/rpcs3qt/patch_manager_dialog.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rpcs3/rpcs3qt/patch_manager_dialog.cpp b/rpcs3/rpcs3qt/patch_manager_dialog.cpp index 74b25a0b5c..a504e5790f 100644 --- a/rpcs3/rpcs3qt/patch_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/patch_manager_dialog.cpp @@ -1247,7 +1247,16 @@ bool patch_manager_dialog::handle_json(const QByteArray& data) if (patch_engine::load(patches, "From Download", content, true, &log_message)) { patch_log.notice("Successfully validated downloaded patch file"); - const std::string path = patch_engine::get_patches_path() + "patch.yml"; + + const std::string patches_path = patch_engine::get_patches_path(); + + if (!fs::create_path(patches_path)) + { + patch_log.fatal("Failed to create path: %s (%s)", patches_path, fs::g_tls_error); + return false; + } + + const std::string path = patches_path + "patch.yml"; // Back up current patch file if possible if (fs::is_file(path))