diff --git a/src/citra_qt/configuration/configure_system.cpp b/src/citra_qt/configuration/configure_system.cpp index 5597e0a6b2..aa2fac4d87 100644 --- a/src/citra_qt/configuration/configure_system.cpp +++ b/src/citra_qt/configuration/configure_system.cpp @@ -246,7 +246,13 @@ void ConfigureSystem::setConfiguration() { ui->edit_init_time->setDateTime(date_time); if (!enabled) { - cfg = Service::CFG::GetCurrentModule(); + + auto cfg_interface = Core::System::GetInstance() + .ServiceManager() + .GetService("cfg:u"); + ASSERT_MSG(cfg_interface, "cfg:u not started!"); + cfg = cfg_interface->GetModule(); + ASSERT_MSG(cfg, "CFG Module missing!"); ReadSystemSettings(); ui->group_system_settings->setEnabled(false); } else { diff --git a/src/core/frontend/applets/swkbd.cpp b/src/core/frontend/applets/swkbd.cpp index 5c64defe8d..f61693ebb6 100644 --- a/src/core/frontend/applets/swkbd.cpp +++ b/src/core/frontend/applets/swkbd.cpp @@ -135,7 +135,14 @@ ValidationError SoftwareKeyboard::Finalize(const std::string& text, u8 button) { void DefaultKeyboard::Setup(const Frontend::KeyboardConfig* config) { SoftwareKeyboard::Setup(config); - std::string username = Common::UTF16ToUTF8(Service::CFG::GetCurrentModule()->GetUsername()); + + auto cfg = + Core::System::GetInstance().ServiceManager().GetService( + "cfg:u"); + ASSERT_MSG(cfg, "cfg:u not started!"); + auto cfg_module = cfg->GetModule(); + ASSERT_MSG(cfg_module, "CFG Module missing!"); + std::string username = Common::UTF16ToUTF8(cfg_module->GetUsername()); switch (this->config.button_config) { case ButtonConfig::None: case ButtonConfig::Single: diff --git a/src/core/hle/service/apt/applet_manager.cpp b/src/core/hle/service/apt/applet_manager.cpp index c4f6226695..4bb93f9a76 100644 --- a/src/core/hle/service/apt/applet_manager.cpp +++ b/src/core/hle/service/apt/applet_manager.cpp @@ -69,7 +69,7 @@ static constexpr std::array applet_titleids = {{ // TODO(Subv): Fill in the rest of the titleids }}; -static u64 GetTitleIdForApplet(AppletId id) { +static u64 GetTitleIdForApplet(AppletId id, u32 region_value) { ASSERT_MSG(id != AppletId::None, "Invalid applet id"); auto itr = std::find_if(applet_titleids.begin(), applet_titleids.end(), @@ -79,7 +79,7 @@ static u64 GetTitleIdForApplet(AppletId id) { ASSERT_MSG(itr != applet_titleids.end(), "Unknown applet id 0x{:#05X}", static_cast(id)); - return itr->title_ids[CFG::GetCurrentModule()->GetRegionValue()]; + return itr->title_ids[region_value]; } AppletManager::AppletSlotData* AppletManager::GetAppletSlotData(AppletId id) { @@ -327,8 +327,8 @@ ResultCode AppletManager::PrepareToStartLibraryApplet(AppletId applet_id) { // There are some problems with LLE applets. The rasterizer cache gets out of sync // when the applet is closed. To avoid breaking applications because of the issue, // we are going to disable loading LLE applets before further fixes are done. - // auto process = NS::LaunchTitle(FS::MediaType::NAND, GetTitleIdForApplet(applet_id)); - // if (process) { + // auto process = NS::LaunchTitle(FS::MediaType::NAND, GetTitleIdForApplet(applet_id, + // region_value)); if (process) { // return RESULT_SUCCESS; // } @@ -354,8 +354,8 @@ ResultCode AppletManager::PreloadLibraryApplet(AppletId applet_id) { // There are some problems with LLE applets. The rasterizer cache gets out of sync // when the applet is closed. To avoid breaking applications because of the issue, // we are going to disable loading LLE applets before further fixes are done. - // auto process = NS::LaunchTitle(FS::MediaType::NAND, GetTitleIdForApplet(applet_id)); - // if (process) { + // auto process = NS::LaunchTitle(FS::MediaType::NAND, GetTitleIdForApplet(applet_id, + // region_value)); if (process) { // return RESULT_SUCCESS; // } @@ -465,8 +465,14 @@ ResultVal AppletManager::GetAppletInfo(AppletId app_i ErrorLevel::Status); } - return MakeResult({GetTitleIdForApplet(app_id), Service::FS::MediaType::NAND, - slot->registered, slot->loaded, slot->attributes.raw}); + auto cfg = system.ServiceManager().GetService("cfg:u"); + ASSERT_MSG(cfg, "cfg:u not started!"); + auto cfg_module = cfg->GetModule(); + ASSERT_MSG(cfg_module, "CFG Module missing!"); + u32 region_value = cfg_module->GetRegionValue(); + return MakeResult({GetTitleIdForApplet(app_id, region_value), + Service::FS::MediaType::NAND, slot->registered, slot->loaded, + slot->attributes.raw}); } ResultCode AppletManager::PrepareToDoApplicationJump(u64 title_id, FS::MediaType media_type, @@ -548,7 +554,12 @@ void AppletManager::EnsureHomeMenuLoaded() { return; } - u64 menu_title_id = GetTitleIdForApplet(AppletId::HomeMenu); + auto cfg = system.ServiceManager().GetService("cfg:u"); + ASSERT_MSG(cfg, "cfg:u not started!"); + auto cfg_module = cfg->GetModule(); + ASSERT_MSG(cfg_module, "CFG Module missing!"); + u32 region_value = cfg_module->GetRegionValue(); + u64 menu_title_id = GetTitleIdForApplet(AppletId::HomeMenu, region_value); auto process = NS::LaunchTitle(FS::MediaType::NAND, menu_title_id); if (!process) { LOG_WARNING(Service_APT, diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index bd0621fc4c..03d6c5e4e6 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp @@ -5,6 +5,7 @@ #include "common/common_paths.h" #include "common/file_util.h" #include "common/logging/log.h" +#include "common/string_util.h" #include "core/core.h" #include "core/file_sys/archive_ncch.h" #include "core/file_sys/file_backend.h" @@ -103,7 +104,14 @@ static u32 DecompressLZ11(const u8* in, u8* out) { bool Module::LoadSharedFont() { u8 font_region_code; - switch (CFG::GetCurrentModule()->GetRegionValue()) { + auto cfg = + Core::System::GetInstance().ServiceManager().GetService( + "cfg:u"); + ASSERT_MSG(cfg, "cfg:u not started!"); + auto cfg_module = cfg->GetModule(); + ASSERT_MSG(cfg_module, "CFG Module missing!"); + std::string username = Common::UTF16ToUTF8(cfg_module->GetUsername()); + switch (cfg_module->GetRegionValue()) { case 4: // CHN font_region_code = 2; break; diff --git a/src/core/hle/service/cam/cam.cpp b/src/core/hle/service/cam/cam.cpp index af027bd85a..d6399194a2 100644 --- a/src/core/hle/service/cam/cam.cpp +++ b/src/core/hle/service/cam/cam.cpp @@ -22,8 +22,6 @@ namespace Service::CAM { -static std::weak_ptr current_cam; - // built-in resolution parameters constexpr std::array PRESET_RESOLUTION{{ {640, 480, 0, 0, 639, 479}, // VGA @@ -200,6 +198,10 @@ Module::Interface::Interface(std::shared_ptr cam, const char* name, u32 Module::Interface::~Interface() = default; +std::shared_ptr Module::Interface::GetModule() const { + return cam; +} + void Module::Interface::StartCapture(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx, 0x01, 1, 0); const PortSet port_select(rp.Pop()); @@ -1050,15 +1052,9 @@ void Module::LoadCameraImplementation(CameraConfig& camera, int camera_id) { camera.impl->SetResolution(camera.contexts[0].resolution); } -void ReloadCameraDevices() { - if (auto cam = current_cam.lock()) - cam->ReloadCameraDevices(); -} - void InstallInterfaces(Core::System& system) { auto& service_manager = system.ServiceManager(); auto cam = std::make_shared(); - current_cam = cam; std::make_shared(cam)->InstallAsService(service_manager); std::make_shared(cam)->InstallAsService(service_manager); diff --git a/src/core/hle/service/cam/cam.h b/src/core/hle/service/cam/cam.h index 319debfdb0..b8375999cf 100644 --- a/src/core/hle/service/cam/cam.h +++ b/src/core/hle/service/cam/cam.h @@ -250,6 +250,8 @@ public: Interface(std::shared_ptr cam, const char* name, u32 max_session); ~Interface(); + std::shared_ptr GetModule() const; + protected: /** * Starts capturing at the selected port. @@ -783,9 +785,6 @@ private: std::atomic is_camera_reload_pending{false}; }; -/// Reload camera devices. Used when input configuration changed -void ReloadCameraDevices(); - void InstallInterfaces(Core::System& system); } // namespace Service::CAM diff --git a/src/core/hle/service/cfg/cfg.cpp b/src/core/hle/service/cfg/cfg.cpp index c07fb6bd43..ab73bb048b 100644 --- a/src/core/hle/service/cfg/cfg.cpp +++ b/src/core/hle/service/cfg/cfg.cpp @@ -114,14 +114,6 @@ static const std::vector cfg_system_savedata_id = { 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x01, 0x00, }; -static std::weak_ptr current_cfg; - -std::shared_ptr GetCurrentModule() { - auto cfg = current_cfg.lock(); - ASSERT_MSG(cfg, "No CFG module running!"); - return cfg; -} - Module::Interface::Interface(std::shared_ptr cfg, const char* name, u32 max_session) : ServiceFramework(name, max_session), cfg(std::move(cfg)) {} @@ -145,6 +137,10 @@ void Module::Interface::GetCountryCodeString(Kernel::HLERequestContext& ctx) { rb.Push(country_codes[country_code_id]); } +std::shared_ptr Module::Interface::GetModule() const { + return cfg; +} + void Module::Interface::GetCountryCodeID(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx, 0x0A, 1, 0); u16 country_code = rp.Pop(); @@ -729,7 +725,6 @@ void InstallInterfaces(Core::System& system) { std::make_shared(cfg)->InstallAsService(service_manager); std::make_shared(cfg)->InstallAsService(service_manager); std::make_shared()->InstallAsService(service_manager); - current_cfg = cfg; } } // namespace Service::CFG diff --git a/src/core/hle/service/cfg/cfg.h b/src/core/hle/service/cfg/cfg.h index 02342711f4..ed2f65fc8d 100644 --- a/src/core/hle/service/cfg/cfg.h +++ b/src/core/hle/service/cfg/cfg.h @@ -97,6 +97,8 @@ public: Interface(std::shared_ptr cfg, const char* name, u32 max_session); ~Interface(); + std::shared_ptr GetModule() const; + /** * CFG::GetCountryCodeString service function * Inputs: @@ -117,8 +119,6 @@ public: */ void GetCountryCodeID(Kernel::HLERequestContext& ctx); - u32 GetRegionValue(); - /** * CFG::SecureInfoGetRegion service function * Inputs: @@ -412,6 +412,5 @@ private: }; void InstallInterfaces(Core::System& system); -std::shared_ptr GetCurrentModule(); } // namespace Service::CFG diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 4d183c0142..aa8ddb5f92 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -21,8 +21,6 @@ namespace Service::HID { -static std::weak_ptr current_module; - // Updating period for each HID device. These empirical values are measured from a 11.2 3DS. constexpr u64 pad_update_ticks = BASE_CLOCK_RATE_ARM11 / 234; constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104; @@ -354,6 +352,10 @@ void Module::Interface::GetSoundVolume(Kernel::HLERequestContext& ctx) { Module::Interface::Interface(std::shared_ptr hid, const char* name, u32 max_session) : ServiceFramework(name, max_session), hid(std::move(hid)) {} +std::shared_ptr Module::Interface::GetModule() const { + return hid; +} + Module::Module(Core::System& system) : system(system) { using namespace Kernel; @@ -388,17 +390,11 @@ void Module::ReloadInputDevices() { is_device_reload_pending.store(true); } -void ReloadInputDevices() { - if (auto hid = current_module.lock()) - hid->ReloadInputDevices(); -} - void InstallInterfaces(Core::System& system) { auto& service_manager = system.ServiceManager(); auto hid = std::make_shared(system); std::make_shared(hid)->InstallAsService(service_manager); std::make_shared(hid)->InstallAsService(service_manager); - current_module = hid; } } // namespace Service::HID diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index ecdb02f211..75b206dcde 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -208,6 +208,8 @@ public: public: Interface(std::shared_ptr hid, const char* name, u32 max_session); + std::shared_ptr GetModule() const; + protected: /** * HID::GetIPCHandles service function @@ -336,7 +338,4 @@ private: }; void InstallInterfaces(Core::System& system); - -/// Reload input devices. Used when input configuration changed -void ReloadInputDevices(); } // namespace Service::HID diff --git a/src/core/hle/service/ir/ir.cpp b/src/core/hle/service/ir/ir.cpp index 481ef123c0..0869941f2e 100644 --- a/src/core/hle/service/ir/ir.cpp +++ b/src/core/hle/service/ir/ir.cpp @@ -12,28 +12,15 @@ namespace Service::IR { -static std::weak_ptr current_ir_rst; -static std::weak_ptr current_ir_user; - -void ReloadInputDevices() { - if (auto ir_user = current_ir_user.lock()) - ir_user->ReloadInputDevices(); - - if (auto ir_rst = current_ir_rst.lock()) - ir_rst->ReloadInputDevices(); -} - void InstallInterfaces(Core::System& system) { auto& service_manager = system.ServiceManager(); std::make_shared()->InstallAsService(service_manager); auto ir_user = std::make_shared(); ir_user->InstallAsService(service_manager); - current_ir_user = ir_user; auto ir_rst = std::make_shared(); ir_rst->InstallAsService(service_manager); - current_ir_rst = ir_rst; } } // namespace Service::IR diff --git a/src/core/hle/service/ir/ir.h b/src/core/hle/service/ir/ir.h index 0666ed0b6c..3887e0f6e8 100644 --- a/src/core/hle/service/ir/ir.h +++ b/src/core/hle/service/ir/ir.h @@ -14,9 +14,6 @@ class ServiceManager; namespace Service::IR { -/// Reload input devices. Used when input configuration changed -void ReloadInputDevices(); - void InstallInterfaces(Core::System& system); } // namespace Service::IR diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp index 12301cb942..96bf44fcb8 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp @@ -144,7 +144,13 @@ void AppLoader_NCCH::ParseRegionLockoutInfo() { } region_lockout >>= 1; } - Service::CFG::GetCurrentModule()->SetPreferredRegionCodes(regions); + auto cfg = Core::System::GetInstance() + .ServiceManager() + .GetService("cfg:u"); + ASSERT_MSG(cfg, "cfg:u not started!"); + auto cfg_module = cfg->GetModule(); + ASSERT_MSG(cfg_module, "CFG Module missing!"); + cfg_module->SetPreferredRegionCodes(regions); } } diff --git a/src/core/settings.cpp b/src/core/settings.cpp index c648714fb9..22f70aac23 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -6,7 +6,8 @@ #include "core/core.h" #include "core/gdbstub/gdbstub.h" #include "core/hle/service/hid/hid.h" -#include "core/hle/service/ir/ir.h" +#include "core/hle/service/ir/ir_rst.h" +#include "core/hle/service/ir/ir_user.h" #include "core/settings.h" #include "video_core/renderer_base.h" #include "video_core/video_core.h" @@ -32,14 +33,37 @@ void Apply() { VideoCore::g_renderer_bg_color_update_requested = true; - if (Core::System::GetInstance().IsPoweredOn()) { + auto& system = Core::System::GetInstance(); + if (system.IsPoweredOn()) { Core::DSP().SetSink(values.sink_id, values.audio_device_id); Core::DSP().EnableStretching(values.enable_audio_stretching); - } - Service::HID::ReloadInputDevices(); - Service::IR::ReloadInputDevices(); - Service::CAM::ReloadCameraDevices(); + auto& sm = system.ServiceManager(); + + auto hid = sm.GetService("hid:USER"); + if (hid) { + auto hid_module = hid->GetModule(); + if (hid_module) { + hid_module->ReloadInputDevices(); + } + } + + auto ir_user = sm.GetService("ir:USER"); + if (ir_user) + ir_user->ReloadInputDevices(); + + auto ir_rst = sm.GetService("ir:rst"); + if (ir_rst) + ir_rst->ReloadInputDevices(); + + auto cam = sm.GetService("cam:u"); + if (cam) { + auto cam_module = cam->GetModule(); + if (cam_module) { + cam_module->ReloadCameraDevices(); + } + } + } } template