From 8854c7c60af5ecb691011c47c7f811deeebd8221 Mon Sep 17 00:00:00 2001 From: digant Date: Fri, 3 Jan 2025 15:09:10 +0100 Subject: [PATCH] update --- rpcs3/Emu/Audio/audio_utils.cpp | 39 ++ rpcs3/Emu/Audio/audio_utils.h | 14 + rpcs3/Emu/CMakeLists.txt | 2 + rpcs3/Emu/Cell/Modules/cellAudio.cpp | 3 +- rpcs3/Emu/Cell/Modules/sceNp.cpp | 4 +- rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp | 9 +- rpcs3/Emu/Cell/Modules/sceNpTrophy.h | 6 + rpcs3/Emu/Cell/lv2/sys_rsxaudio.cpp | 9 +- rpcs3/Emu/RSX/GL/GLOverlays.cpp | 2 +- .../HomeMenu/overlay_home_menu_main_menu.cpp | 28 ++ .../Trophies/overlay_trophy_list_dialog.cpp | 356 ++++++++++++++++++ .../Trophies/overlay_trophy_list_dialog.h | 54 +++ rpcs3/Emu/RSX/Overlays/overlay_controls.cpp | 53 ++- rpcs3/Emu/RSX/Overlays/overlay_controls.h | 15 +- .../RSX/Overlays/overlay_message_dialog.cpp | 6 +- rpcs3/Emu/RSX/VK/VKOverlays.cpp | 4 +- rpcs3/Emu/localized_string_id.h | 15 + rpcs3/Input/sdl_pad_handler.cpp | 10 +- rpcs3/emucore.vcxproj | 4 + rpcs3/emucore.vcxproj.filters | 15 + rpcs3/main.cpp | 1 + rpcs3/rpcs3qt/gs_frame.cpp | 16 + rpcs3/rpcs3qt/gui_application.cpp | 3 +- rpcs3/rpcs3qt/localized_emu.h | 13 + rpcs3/rpcs3qt/shortcut_handler.cpp | 2 +- rpcs3/rpcs3qt/shortcut_settings.cpp | 46 ++- rpcs3/rpcs3qt/shortcut_settings.h | 4 + rpcs3/rpcs3qt/trophy_manager_dialog.cpp | 9 +- 28 files changed, 680 insertions(+), 62 deletions(-) create mode 100644 rpcs3/Emu/Audio/audio_utils.cpp create mode 100644 rpcs3/Emu/Audio/audio_utils.h create mode 100644 rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp create mode 100644 rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.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 7846a5d5d3..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 @@ -528,6 +529,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/HomeMenu/overlay_home_menu_savestate.cpp RSX/Overlays/Network/overlay_recvmessage_dialog.cpp RSX/Overlays/Network/overlay_sendmessage_dialog.cpp + RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp RSX/Overlays/overlays.cpp RSX/Overlays/overlay_animated_icon.cpp RSX/Overlays/overlay_animation.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/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 55b8847934..fb9f46a365 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -5214,7 +5214,7 @@ error_code sceNpProfileCallGui(vm::cptr npid, vm::ptr context, vm::cptrtrp_name = std::move(name); + ctxt->trp_name = name; ctxt->read_only = !!(options & SCE_NP_TROPHY_OPTIONS_CREATE_CONTEXT_READ_ONLY); *context = idm::last_id(); + // set current trophy name for trophy list overlay + { + current_trophy_name& current_id = g_fxo->get(); + std::lock_guard lock(current_id.mtx); + current_id.name = std::move(name); + } + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.h b/rpcs3/Emu/Cell/Modules/sceNpTrophy.h index 565f7d0b5d..f97050c968 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.h +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.h @@ -168,3 +168,9 @@ public: virtual s32 ShowTrophyNotification(const SceNpTrophyDetails& trophy, const std::vector& trophyIconBfr) = 0; }; + +struct current_trophy_name +{ + std::mutex mtx; + std::string name; +}; 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/GL/GLOverlays.cpp b/rpcs3/Emu/RSX/GL/GLOverlays.cpp index 4c1ca8ac09..5a2b8803f4 100644 --- a/rpcs3/Emu/RSX/GL/GLOverlays.cpp +++ b/rpcs3/Emu/RSX/GL/GLOverlays.cpp @@ -217,7 +217,7 @@ namespace gl gl::texture_view* ui_overlay_renderer::load_simple_image(rsx::overlays::image_info* desc, bool temp_resource, u32 owner_uid) { auto tex = std::make_unique(GL_TEXTURE_2D, desc->w, desc->h, 1, 1, GL_RGBA8); - tex->copy_from(desc->data, gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); + tex->copy_from(desc->get_data(), gl::texture::format::rgba, gl::texture::type::uint_8_8_8_8, {}); GLenum remap[] = { GL_RED, GL_ALPHA, GL_BLUE, GL_GREEN }; auto view = std::make_unique(tex.get(), remap); diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp index 059326aff3..d02b3ffbe2 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp @@ -4,9 +4,11 @@ #include "overlay_home_menu_settings.h" #include "overlay_home_menu_savestate.h" #include "Emu/RSX/Overlays/FriendsList/overlay_friends_list_dialog.h" +#include "Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.h" #include "Emu/RSX/Overlays/overlay_manager.h" #include "Emu/System.h" #include "Emu/system_config.h" +#include "Emu/Cell/Modules/sceNpTrophy.h" extern atomic_t g_user_asked_for_recording; extern atomic_t g_user_asked_for_screenshot; @@ -55,6 +57,32 @@ namespace rsx return page_navigation::stay; }); + // get current trophy name for trophy list overlay + std::string trop_name; + { + current_trophy_name& current_id = g_fxo->get(); + std::lock_guard lock(current_id.mtx); + trop_name = current_id.name; + } + if (!trop_name.empty()) + { + std::unique_ptr trophies = std::make_unique(get_localized_string(localized_string_id::HOME_MENU_TROPHIES)); + add_item(trophies, [trop_name = std::move(trop_name)](pad_button btn) -> page_navigation + { + if (btn != pad_button::cross) return page_navigation::stay; + + rsx_log.notice("User selected trophies in home menu"); + Emu.CallFromMainThread([trop_name = std::move(trop_name)]() + { + if (auto manager = g_fxo->try_get()) + { + manager->create()->show(trop_name); + } + }); + return page_navigation::stay; + }); + } + std::unique_ptr screenshot = std::make_unique(get_localized_string(localized_string_id::HOME_MENU_SCREENSHOT)); add_item(screenshot, [](pad_button btn) -> page_navigation { diff --git a/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp new file mode 100644 index 0000000000..8213b29a2d --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/Trophies/overlay_trophy_list_dialog.cpp @@ -0,0 +1,356 @@ +#include "stdafx.h" +#include "../overlay_manager.h" +#include "overlay_trophy_list_dialog.h" +#include "Emu/Cell/Modules/sceNpTrophy.h" +#include "Emu/System.h" +#include "Emu/VFS.h" + +namespace rsx +{ + namespace overlays + { + trophy_list_dialog::trophy_list_entry::trophy_list_entry(const std::string& name, const std::string& description, const std::string& trophy_type, const std::string& icon_path, bool hidden, bool locked, bool platinum_relevant) + { + std::unique_ptr image = std::make_unique(); + image->set_size(160, 110); + image->set_padding(36, 36, 11, 11); // Square image, 88x88 + + if (fs::exists(icon_path)) + { + icon_data = std::make_unique(icon_path.c_str(), hidden || locked); + static_cast(image.get())->set_raw_image(icon_data.get()); + } + else + { + // Fallback + // TODO: use proper icon + static_cast(image.get())->set_image_resource(resource_config::standard_image_resource::square); + } + + std::unique_ptr text_stack = std::make_unique(); + std::unique_ptr padding = std::make_unique(); + std::unique_ptr header_text = std::make_unique