mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	remove GetCurrentModule() functions in HLE Services
This commit is contained in:
		
							parent
							
								
									4ee914c7a8
								
							
						
					
					
						commit
						9d53136f20
					
				
					 14 changed files with 99 additions and 69 deletions
				
			
		|  | @ -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<Service::CFG::Module::Interface>("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 { | ||||
|  |  | |||
|  | @ -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<Service::CFG::Module::Interface>( | ||||
|             "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: | ||||
|  |  | |||
|  | @ -69,7 +69,7 @@ static constexpr std::array<AppletTitleData, NumApplets> 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<u32>(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::AppletInfo> AppletManager::GetAppletInfo(AppletId app_i | |||
|                           ErrorLevel::Status); | ||||
|     } | ||||
| 
 | ||||
|     return MakeResult<AppletInfo>({GetTitleIdForApplet(app_id), Service::FS::MediaType::NAND, | ||||
|                                    slot->registered, slot->loaded, slot->attributes.raw}); | ||||
|     auto cfg = system.ServiceManager().GetService<Service::CFG::Module::Interface>("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<AppletInfo>({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<Service::CFG::Module::Interface>("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, | ||||
|  |  | |||
|  | @ -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<Service::CFG::Module::Interface>( | ||||
|             "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; | ||||
|  |  | |||
|  | @ -22,8 +22,6 @@ | |||
| 
 | ||||
| namespace Service::CAM { | ||||
| 
 | ||||
| static std::weak_ptr<Module> current_cam; | ||||
| 
 | ||||
| // built-in resolution parameters
 | ||||
| constexpr std::array<Resolution, 8> PRESET_RESOLUTION{{ | ||||
|     {640, 480, 0, 0, 639, 479},  // VGA
 | ||||
|  | @ -200,6 +198,10 @@ Module::Interface::Interface(std::shared_ptr<Module> cam, const char* name, u32 | |||
| 
 | ||||
| Module::Interface::~Interface() = default; | ||||
| 
 | ||||
| std::shared_ptr<Module> 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<u8>()); | ||||
|  | @ -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<Module>(); | ||||
|     current_cam = cam; | ||||
| 
 | ||||
|     std::make_shared<CAM_U>(cam)->InstallAsService(service_manager); | ||||
|     std::make_shared<CAM_S>(cam)->InstallAsService(service_manager); | ||||
|  |  | |||
|  | @ -250,6 +250,8 @@ public: | |||
|         Interface(std::shared_ptr<Module> cam, const char* name, u32 max_session); | ||||
|         ~Interface(); | ||||
| 
 | ||||
|         std::shared_ptr<Module> GetModule() const; | ||||
| 
 | ||||
|     protected: | ||||
|         /**
 | ||||
|          * Starts capturing at the selected port. | ||||
|  | @ -783,9 +785,6 @@ private: | |||
|     std::atomic<bool> is_camera_reload_pending{false}; | ||||
| }; | ||||
| 
 | ||||
| /// Reload camera devices. Used when input configuration changed
 | ||||
| void ReloadCameraDevices(); | ||||
| 
 | ||||
| void InstallInterfaces(Core::System& system); | ||||
| 
 | ||||
| } // namespace Service::CAM
 | ||||
|  |  | |||
|  | @ -114,14 +114,6 @@ static const std::vector<u8> cfg_system_savedata_id = { | |||
|     0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x01, 0x00, | ||||
| }; | ||||
| 
 | ||||
| static std::weak_ptr<Module> current_cfg; | ||||
| 
 | ||||
| std::shared_ptr<Module> GetCurrentModule() { | ||||
|     auto cfg = current_cfg.lock(); | ||||
|     ASSERT_MSG(cfg, "No CFG module running!"); | ||||
|     return cfg; | ||||
| } | ||||
| 
 | ||||
| Module::Interface::Interface(std::shared_ptr<Module> 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<u32>(country_codes[country_code_id]); | ||||
| } | ||||
| 
 | ||||
| std::shared_ptr<Module> 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<u16>(); | ||||
|  | @ -729,7 +725,6 @@ void InstallInterfaces(Core::System& system) { | |||
|     std::make_shared<CFG_S>(cfg)->InstallAsService(service_manager); | ||||
|     std::make_shared<CFG_U>(cfg)->InstallAsService(service_manager); | ||||
|     std::make_shared<CFG_NOR>()->InstallAsService(service_manager); | ||||
|     current_cfg = cfg; | ||||
| } | ||||
| 
 | ||||
| } // namespace Service::CFG
 | ||||
|  |  | |||
|  | @ -97,6 +97,8 @@ public: | |||
|         Interface(std::shared_ptr<Module> cfg, const char* name, u32 max_session); | ||||
|         ~Interface(); | ||||
| 
 | ||||
|         std::shared_ptr<Module> 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<Module> GetCurrentModule(); | ||||
| 
 | ||||
| } // namespace Service::CFG
 | ||||
|  |  | |||
|  | @ -21,8 +21,6 @@ | |||
| 
 | ||||
| namespace Service::HID { | ||||
| 
 | ||||
| static std::weak_ptr<Module> 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<Module> hid, const char* name, u32 max_session) | ||||
|     : ServiceFramework(name, max_session), hid(std::move(hid)) {} | ||||
| 
 | ||||
| std::shared_ptr<Module> 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<Module>(system); | ||||
|     std::make_shared<User>(hid)->InstallAsService(service_manager); | ||||
|     std::make_shared<Spvr>(hid)->InstallAsService(service_manager); | ||||
|     current_module = hid; | ||||
| } | ||||
| 
 | ||||
| } // namespace Service::HID
 | ||||
|  |  | |||
|  | @ -208,6 +208,8 @@ public: | |||
|     public: | ||||
|         Interface(std::shared_ptr<Module> hid, const char* name, u32 max_session); | ||||
| 
 | ||||
|         std::shared_ptr<Module> 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
 | ||||
|  |  | |||
|  | @ -12,28 +12,15 @@ | |||
| 
 | ||||
| namespace Service::IR { | ||||
| 
 | ||||
| static std::weak_ptr<IR_RST> current_ir_rst; | ||||
| static std::weak_ptr<IR_USER> 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<IR_U>()->InstallAsService(service_manager); | ||||
| 
 | ||||
|     auto ir_user = std::make_shared<IR_USER>(); | ||||
|     ir_user->InstallAsService(service_manager); | ||||
|     current_ir_user = ir_user; | ||||
| 
 | ||||
|     auto ir_rst = std::make_shared<IR_RST>(); | ||||
|     ir_rst->InstallAsService(service_manager); | ||||
|     current_ir_rst = ir_rst; | ||||
| } | ||||
| 
 | ||||
| } // namespace Service::IR
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -144,7 +144,13 @@ void AppLoader_NCCH::ParseRegionLockoutInfo() { | |||
|             } | ||||
|             region_lockout >>= 1; | ||||
|         } | ||||
|         Service::CFG::GetCurrentModule()->SetPreferredRegionCodes(regions); | ||||
|         auto cfg = Core::System::GetInstance() | ||||
|                        .ServiceManager() | ||||
|                        .GetService<Service::CFG::Module::Interface>("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); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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<Service::HID::Module::Interface>("hid:USER"); | ||||
|         if (hid) { | ||||
|             auto hid_module = hid->GetModule(); | ||||
|             if (hid_module) { | ||||
|                 hid_module->ReloadInputDevices(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         auto ir_user = sm.GetService<Service::IR::IR_USER>("ir:USER"); | ||||
|         if (ir_user) | ||||
|             ir_user->ReloadInputDevices(); | ||||
| 
 | ||||
|         auto ir_rst = sm.GetService<Service::IR::IR_RST>("ir:rst"); | ||||
|         if (ir_rst) | ||||
|             ir_rst->ReloadInputDevices(); | ||||
| 
 | ||||
|         auto cam = sm.GetService<Service::CAM::Module::Interface>("cam:u"); | ||||
|         if (cam) { | ||||
|             auto cam_module = cam->GetModule(); | ||||
|             if (cam_module) { | ||||
|                 cam_module->ReloadCameraDevices(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| template <typename T> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue