service: set: Implement more Qlaunch Settings
This commit is contained in:
		| @@ -4,6 +4,8 @@ | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/service/audio/audctl.h" | ||||
| #include "core/hle/service/ipc_helpers.h" | ||||
| #include "core/hle/service/set/system_settings_server.h" | ||||
| #include "core/hle/service/sm/sm.h" | ||||
|  | ||||
| namespace Service::Audio { | ||||
|  | ||||
| @@ -19,15 +21,15 @@ AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} { | ||||
|         {6, nullptr, "IsTargetConnected"}, | ||||
|         {7, nullptr, "SetDefaultTarget"}, | ||||
|         {8, nullptr, "GetDefaultTarget"}, | ||||
|         {9, nullptr, "GetAudioOutputMode"}, | ||||
|         {10, nullptr, "SetAudioOutputMode"}, | ||||
|         {9, &AudCtl::GetAudioOutputMode, "GetAudioOutputMode"}, | ||||
|         {10, &AudCtl::SetAudioOutputMode, "SetAudioOutputMode"}, | ||||
|         {11, nullptr, "SetForceMutePolicy"}, | ||||
|         {12, &AudCtl::GetForceMutePolicy, "GetForceMutePolicy"}, | ||||
|         {13, &AudCtl::GetOutputModeSetting, "GetOutputModeSetting"}, | ||||
|         {14, nullptr, "SetOutputModeSetting"}, | ||||
|         {14, &AudCtl::SetOutputModeSetting, "SetOutputModeSetting"}, | ||||
|         {15, nullptr, "SetOutputTarget"}, | ||||
|         {16, nullptr, "SetInputTargetForceEnabled"}, | ||||
|         {17, nullptr, "SetHeadphoneOutputLevelMode"}, | ||||
|         {17, &AudCtl::SetHeadphoneOutputLevelMode, "SetHeadphoneOutputLevelMode"}, | ||||
|         {18, &AudCtl::GetHeadphoneOutputLevelMode, "GetHeadphoneOutputLevelMode"}, | ||||
|         {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"}, | ||||
|         {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"}, | ||||
| @@ -40,7 +42,7 @@ AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} { | ||||
|         {27, nullptr, "SetVolumeMappingTableForDev"}, | ||||
|         {28, nullptr, "GetAudioOutputChannelCountForPlayReport"}, | ||||
|         {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, | ||||
|         {30, nullptr, "SetSpeakerAutoMuteEnabled"}, | ||||
|         {30, &AudCtl::SetSpeakerAutoMuteEnabled, "SetSpeakerAutoMuteEnabled"}, | ||||
|         {31, &AudCtl::IsSpeakerAutoMuteEnabled, "IsSpeakerAutoMuteEnabled"}, | ||||
|         {32, nullptr, "GetActiveOutputTarget"}, | ||||
|         {33, nullptr, "GetTargetDeviceInfo"}, | ||||
| @@ -68,6 +70,9 @@ AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} { | ||||
|     // clang-format on | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     m_set_sys = | ||||
|         system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true); | ||||
| } | ||||
|  | ||||
| AudCtl::~AudCtl() = default; | ||||
| @@ -96,6 +101,33 @@ void AudCtl::GetTargetVolumeMax(HLERequestContext& ctx) { | ||||
|     rb.Push(target_max_volume); | ||||
| } | ||||
|  | ||||
| void AudCtl::GetAudioOutputMode(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()}; | ||||
|  | ||||
|     Set::AudioOutputMode output_mode{}; | ||||
|     const auto result = m_set_sys->GetAudioOutputMode(output_mode, target); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(result); | ||||
|     rb.PushEnum(output_mode); | ||||
| } | ||||
|  | ||||
| void AudCtl::SetAudioOutputMode(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()}; | ||||
|     const auto output_mode{rp.PopEnum<Set::AudioOutputMode>()}; | ||||
|  | ||||
|     const auto result = m_set_sys->SetAudioOutputMode(target, output_mode); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
| } | ||||
|  | ||||
| void AudCtl::GetForceMutePolicy(HLERequestContext& ctx) { | ||||
|     LOG_WARNING(Audio, "(STUBBED) called"); | ||||
|  | ||||
| @@ -106,13 +138,31 @@ void AudCtl::GetForceMutePolicy(HLERequestContext& ctx) { | ||||
|  | ||||
| void AudCtl::GetOutputModeSetting(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto value = rp.Pop<u32>(); | ||||
|     const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()}; | ||||
|  | ||||
|     LOG_WARNING(Audio, "(STUBBED) called, value={}", value); | ||||
|     LOG_WARNING(Audio, "(STUBBED) called, target={}", target); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.PushEnum(AudioOutputMode::PcmAuto); | ||||
|     rb.PushEnum(Set::AudioOutputMode::ch_7_1); | ||||
| } | ||||
|  | ||||
| void AudCtl::SetOutputModeSetting(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto target{rp.PopEnum<Set::AudioOutputModeTarget>()}; | ||||
|     const auto output_mode{rp.PopEnum<Set::AudioOutputMode>()}; | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void AudCtl::SetHeadphoneOutputLevelMode(HLERequestContext& ctx) { | ||||
|     LOG_WARNING(Audio, "(STUBBED) called"); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void AudCtl::GetHeadphoneOutputLevelMode(HLERequestContext& ctx) { | ||||
| @@ -123,14 +173,28 @@ void AudCtl::GetHeadphoneOutputLevelMode(HLERequestContext& ctx) { | ||||
|     rb.PushEnum(HeadphoneOutputLevelMode::Normal); | ||||
| } | ||||
|  | ||||
| void AudCtl::SetSpeakerAutoMuteEnabled(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto is_speaker_auto_mute_enabled{rp.Pop<bool>()}; | ||||
|  | ||||
|     LOG_WARNING(Audio, "(STUBBED) called, is_speaker_auto_mute_enabled={}", | ||||
|                 is_speaker_auto_mute_enabled); | ||||
|  | ||||
|     const auto result = m_set_sys->SetSpeakerAutoMuteFlag(is_speaker_auto_mute_enabled); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
| } | ||||
|  | ||||
| void AudCtl::IsSpeakerAutoMuteEnabled(HLERequestContext& ctx) { | ||||
|     const bool is_speaker_auto_mute_enabled = false; | ||||
|     bool is_speaker_auto_mute_enabled{}; | ||||
|     const auto result = m_set_sys->GetSpeakerAutoMuteFlag(is_speaker_auto_mute_enabled); | ||||
|  | ||||
|     LOG_WARNING(Audio, "(STUBBED) called, is_speaker_auto_mute_enabled={}", | ||||
|                 is_speaker_auto_mute_enabled); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.Push(result); | ||||
|     rb.Push<u8>(is_speaker_auto_mute_enabled); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,10 @@ namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::Set { | ||||
| class ISystemSettingsServer; | ||||
| } | ||||
|  | ||||
| namespace Service::Audio { | ||||
|  | ||||
| class AudCtl final : public ServiceFramework<AudCtl> { | ||||
| @@ -17,14 +21,6 @@ public: | ||||
|     ~AudCtl() override; | ||||
|  | ||||
| private: | ||||
|     enum class AudioOutputMode { | ||||
|         Invalid, | ||||
|         Pcm1ch, | ||||
|         Pcm2ch, | ||||
|         Pcm6ch, | ||||
|         PcmAuto, | ||||
|     }; | ||||
|  | ||||
|     enum class ForceMutePolicy { | ||||
|         Disable, | ||||
|         SpeakerMuteOnHeadphoneUnplugged, | ||||
| @@ -37,10 +33,18 @@ private: | ||||
|  | ||||
|     void GetTargetVolumeMin(HLERequestContext& ctx); | ||||
|     void GetTargetVolumeMax(HLERequestContext& ctx); | ||||
|     void GetAudioOutputMode(HLERequestContext& ctx); | ||||
|     void SetAudioOutputMode(HLERequestContext& ctx); | ||||
|     void GetForceMutePolicy(HLERequestContext& ctx); | ||||
|     void GetOutputModeSetting(HLERequestContext& ctx); | ||||
|     void SetOutputModeSetting(HLERequestContext& ctx); | ||||
|     void SetHeadphoneOutputLevelMode(HLERequestContext& ctx); | ||||
|     void GetHeadphoneOutputLevelMode(HLERequestContext& ctx); | ||||
|     void SetSpeakerAutoMuteEnabled(HLERequestContext& ctx); | ||||
|     void IsSpeakerAutoMuteEnabled(HLERequestContext& ctx); | ||||
|     void AcquireTargetNotification(HLERequestContext& ctx); | ||||
|  | ||||
|     std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::Audio | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include "common/settings.h" | ||||
| #include "core/hle/service/set/setting_formats/system_settings.h" | ||||
|  | ||||
| namespace Service::Set { | ||||
| @@ -52,6 +53,17 @@ SystemSettings DefaultSystemSettings() { | ||||
|     settings.chinese_traditional_input_method = ChineseTraditionalInputMethod::Unknown0; | ||||
|     settings.vibration_master_volume = 1.0f; | ||||
|  | ||||
|     const auto language_code = | ||||
|         available_language_codes[static_cast<s32>(::Settings::values.language_index.GetValue())]; | ||||
|     const auto key_code = | ||||
|         std::find_if(language_to_layout.cbegin(), language_to_layout.cend(), | ||||
|                      [=](const auto& element) { return element.first == language_code; }); | ||||
|  | ||||
|     settings.keyboard_layout = KeyboardLayout::EnglishUs; | ||||
|     if (key_code != language_to_layout.end()) { | ||||
|         settings.keyboard_layout = key_code->second; | ||||
|     } | ||||
|  | ||||
|     return settings; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -213,10 +213,9 @@ struct SystemSettings { | ||||
|     // nn::settings::system::AudioVolume | ||||
|     std::array<u8, 0x8> audio_volume_type0; | ||||
|     std::array<u8, 0x8> audio_volume_type1; | ||||
|     // nn::settings::system::AudioOutputMode | ||||
|     s32 audio_output_mode_type0; | ||||
|     s32 audio_output_mode_type1; | ||||
|     s32 audio_output_mode_type2; | ||||
|     AudioOutputMode audio_output_mode_hdmi; | ||||
|     AudioOutputMode audio_output_mode_speaker; | ||||
|     AudioOutputMode audio_output_mode_headphone; | ||||
|     bool force_mute_on_headphone_removed; | ||||
|     INSERT_PADDING_BYTES(0x3); | ||||
|     s32 headphone_volume_warning_count; | ||||
| @@ -224,9 +223,8 @@ struct SystemSettings { | ||||
|     INSERT_PADDING_BYTES(0x3); | ||||
|     // nn::settings::system::AudioVolume | ||||
|     std::array<u8, 0x8> audio_volume_type2; | ||||
|     // nn::settings::system::AudioOutputMode | ||||
|     s32 audio_output_mode_type3; | ||||
|     s32 audio_output_mode_type4; | ||||
|     AudioOutputMode audio_output_mode_type3; | ||||
|     AudioOutputMode audio_output_mode_type4; | ||||
|     bool hearing_protection_safeguard_flag; | ||||
|     INSERT_PADDING_BYTES(0x3); | ||||
|     INSERT_PADDING_BYTES(0x4); // Reserved | ||||
|   | ||||
| @@ -23,9 +23,12 @@ enum class AudioOutputMode : u32 { | ||||
|  | ||||
| /// This is nn::settings::system::AudioOutputModeTarget | ||||
| enum class AudioOutputModeTarget : u32 { | ||||
|     None, | ||||
|     Hdmi, | ||||
|     Speaker, | ||||
|     Headphone, | ||||
|     Type3, | ||||
|     Type4, | ||||
| }; | ||||
|  | ||||
| /// This is nn::settings::system::AudioVolumeTarget | ||||
| @@ -367,6 +370,12 @@ struct AccountNotificationSettings { | ||||
| static_assert(sizeof(AccountNotificationSettings) == 0x18, | ||||
|               "AccountNotificationSettings is an invalid size"); | ||||
|  | ||||
| /// This is nn::settings::factory::BatteryLot | ||||
| struct BatteryLot { | ||||
|     std::array<char, 0x18> lot_number; | ||||
| }; | ||||
| static_assert(sizeof(BatteryLot) == 0x18, "BatteryLot is an invalid size"); | ||||
|  | ||||
| /// This is nn::settings::system::EulaVersion | ||||
| struct EulaVersion { | ||||
|     u32 version; | ||||
| @@ -436,6 +445,12 @@ struct NotificationSettings { | ||||
| }; | ||||
| static_assert(sizeof(NotificationSettings) == 0x18, "NotificationSettings is an invalid size"); | ||||
|  | ||||
| /// This is nn::settings::factory::SerialNumber | ||||
| struct SerialNumber { | ||||
|     std::array<char, 0x18> serial_number; | ||||
| }; | ||||
| static_assert(sizeof(SerialNumber) == 0x18, "SerialNumber is an invalid size"); | ||||
|  | ||||
| /// This is nn::settings::system::SleepSettings | ||||
| struct SleepSettings { | ||||
|     SleepFlag flags; | ||||
|   | ||||
| @@ -131,10 +131,10 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | ||||
|         {40, &ISystemSettingsServer::SetTvSettings, "SetTvSettings"}, | ||||
|         {41, nullptr, "GetEdid"}, | ||||
|         {42, nullptr, "SetEdid"}, | ||||
|         {43, nullptr, "GetAudioOutputMode"}, | ||||
|         {44, nullptr, "SetAudioOutputMode"}, | ||||
|         {45, &ISystemSettingsServer::IsForceMuteOnHeadphoneRemoved, "IsForceMuteOnHeadphoneRemoved"}, | ||||
|         {46, &ISystemSettingsServer::SetForceMuteOnHeadphoneRemoved, "SetForceMuteOnHeadphoneRemoved"}, | ||||
|         {43, &ISystemSettingsServer::GetAudioOutputMode, "GetAudioOutputMode"}, | ||||
|         {44, &ISystemSettingsServer::SetAudioOutputMode, "SetAudioOutputMode"}, | ||||
|         {45, &ISystemSettingsServer::GetSpeakerAutoMuteFlag , "GetSpeakerAutoMuteFlag"}, | ||||
|         {46, &ISystemSettingsServer::SetSpeakerAutoMuteFlag , "SetSpeakerAutoMuteFlag"}, | ||||
|         {47, &ISystemSettingsServer::GetQuestFlag, "GetQuestFlag"}, | ||||
|         {48, &ISystemSettingsServer::SetQuestFlag, "SetQuestFlag"}, | ||||
|         {49, nullptr, "GetDataDeletionSettings"}, | ||||
| @@ -155,8 +155,8 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | ||||
|         {64, &ISystemSettingsServer::SetPrimaryAlbumStorage, "SetPrimaryAlbumStorage"}, | ||||
|         {65, nullptr, "GetUsb30EnableFlag"}, | ||||
|         {66, nullptr, "SetUsb30EnableFlag"}, | ||||
|         {67, nullptr, "GetBatteryLot"}, | ||||
|         {68, nullptr, "GetSerialNumber"}, | ||||
|         {67, &ISystemSettingsServer::GetBatteryLot, "GetBatteryLot"}, | ||||
|         {68, &ISystemSettingsServer::GetSerialNumber, "GetSerialNumber"}, | ||||
|         {69, &ISystemSettingsServer::GetNfcEnableFlag, "GetNfcEnableFlag"}, | ||||
|         {70, &ISystemSettingsServer::SetNfcEnableFlag, "SetNfcEnableFlag"}, | ||||
|         {71, &ISystemSettingsServer::GetSleepSettings, "GetSleepSettings"}, | ||||
| @@ -184,11 +184,11 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | ||||
|         {93, nullptr, "AcquireFatalDirtyFlagEventHandle"}, | ||||
|         {94, nullptr, "GetFatalDirtyFlags"}, | ||||
|         {95, &ISystemSettingsServer::GetAutoUpdateEnableFlag, "GetAutoUpdateEnableFlag"}, | ||||
|         {96, nullptr, "SetAutoUpdateEnableFlag"}, | ||||
|         {96,  &ISystemSettingsServer::SetAutoUpdateEnableFlag, "SetAutoUpdateEnableFlag"}, | ||||
|         {97, nullptr, "GetNxControllerSettings"}, | ||||
|         {98, nullptr, "SetNxControllerSettings"}, | ||||
|         {99, &ISystemSettingsServer::GetBatteryPercentageFlag, "GetBatteryPercentageFlag"}, | ||||
|         {100, nullptr, "SetBatteryPercentageFlag"}, | ||||
|         {100, &ISystemSettingsServer::SetBatteryPercentageFlag, "SetBatteryPercentageFlag"}, | ||||
|         {101, nullptr, "GetExternalRtcResetFlag"}, | ||||
|         {102, nullptr, "SetExternalRtcResetFlag"}, | ||||
|         {103, nullptr, "GetUsbFullKeyEnableFlag"}, | ||||
| @@ -208,12 +208,12 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | ||||
|         {117, nullptr, "GetHeadphoneVolumeUpdateFlag"}, | ||||
|         {118, nullptr, "SetHeadphoneVolumeUpdateFlag"}, | ||||
|         {119, nullptr, "NeedsToUpdateHeadphoneVolume"}, | ||||
|         {120, nullptr, "GetPushNotificationActivityModeOnSleep"}, | ||||
|         {121, nullptr, "SetPushNotificationActivityModeOnSleep"}, | ||||
|         {120, &ISystemSettingsServer::GetPushNotificationActivityModeOnSleep, "GetPushNotificationActivityModeOnSleep"}, | ||||
|         {121, &ISystemSettingsServer::SetPushNotificationActivityModeOnSleep, "SetPushNotificationActivityModeOnSleep"}, | ||||
|         {122, nullptr, "GetServiceDiscoveryControlSettings"}, | ||||
|         {123, nullptr, "SetServiceDiscoveryControlSettings"}, | ||||
|         {124, &ISystemSettingsServer::GetErrorReportSharePermission, "GetErrorReportSharePermission"}, | ||||
|         {125, nullptr, "SetErrorReportSharePermission"}, | ||||
|         {125, &ISystemSettingsServer::SetErrorReportSharePermission, "SetErrorReportSharePermission"}, | ||||
|         {126, &ISystemSettingsServer::GetAppletLaunchFlags, "GetAppletLaunchFlags"}, | ||||
|         {127, &ISystemSettingsServer::SetAppletLaunchFlags, "SetAppletLaunchFlags"}, | ||||
|         {128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"}, | ||||
| @@ -225,7 +225,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | ||||
|         {134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"}, | ||||
|         {135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"}, | ||||
|         {136, &ISystemSettingsServer::GetKeyboardLayout, "GetKeyboardLayout"}, | ||||
|         {137, nullptr, "SetKeyboardLayout"}, | ||||
|         {137, &ISystemSettingsServer::SetKeyboardLayout, "SetKeyboardLayout"}, | ||||
|         {138, nullptr, "GetWebInspectorFlag"}, | ||||
|         {139, nullptr, "GetAllowedSslHosts"}, | ||||
|         {140, nullptr, "GetHostFsMountPoint"}, | ||||
| @@ -291,8 +291,8 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | ||||
|         {200, nullptr, "SetButtonConfigRegisteredSettings"}, | ||||
|         {201, &ISystemSettingsServer::GetFieldTestingFlag, "GetFieldTestingFlag"}, | ||||
|         {202, nullptr, "SetFieldTestingFlag"}, | ||||
|         {203, nullptr, "GetPanelCrcMode"}, | ||||
|         {204, nullptr, "SetPanelCrcMode"}, | ||||
|         {203, &ISystemSettingsServer::GetPanelCrcMode, "GetPanelCrcMode"}, | ||||
|         {204, &ISystemSettingsServer::SetPanelCrcMode, "SetPanelCrcMode"}, | ||||
|         {205, nullptr, "GetNxControllerSettingsEx"}, | ||||
|         {206, nullptr, "SetNxControllerSettingsEx"}, | ||||
|         {207, nullptr, "GetHearingProtectionSafeguardFlag"}, | ||||
| @@ -390,7 +390,7 @@ bool ISystemSettingsServer::StoreSettingsFile(std::filesystem::path& path, auto& | ||||
|     } | ||||
|  | ||||
|     auto settings_base = path / "settings"; | ||||
|     auto settings_tmp_file = settings_base; | ||||
|     std::filesystem::path settings_tmp_file = settings_base; | ||||
|     settings_tmp_file = settings_tmp_file.replace_extension("tmp"); | ||||
|     std::ofstream file(settings_tmp_file, std::ios::binary | std::ios::out); | ||||
|     if (!file.is_open()) { | ||||
| @@ -814,7 +814,34 @@ void ISystemSettingsServer::SetTvSettings(HLERequestContext& ctx) { | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::IsForceMuteOnHeadphoneRemoved(HLERequestContext& ctx) { | ||||
| void ISystemSettingsServer::GetAudioOutputMode(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto target{rp.PopEnum<AudioOutputModeTarget>()}; | ||||
|  | ||||
|     AudioOutputMode output_mode{}; | ||||
|     const auto result = GetAudioOutputMode(output_mode, target); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(result); | ||||
|     rb.PushEnum(output_mode); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetAudioOutputMode(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto target{rp.PopEnum<AudioOutputModeTarget>()}; | ||||
|     const auto output_mode{rp.PopEnum<AudioOutputMode>()}; | ||||
|  | ||||
|     const auto result = SetAudioOutputMode(target, output_mode); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, target={}, output_mode={}", target, output_mode); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(result); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetSpeakerAutoMuteFlag(HLERequestContext& ctx) { | ||||
|     LOG_INFO(Service_SET, "called, force_mute_on_headphone_removed={}", | ||||
|              m_system_settings.force_mute_on_headphone_removed); | ||||
|  | ||||
| @@ -823,7 +850,7 @@ void ISystemSettingsServer::IsForceMuteOnHeadphoneRemoved(HLERequestContext& ctx | ||||
|     rb.PushRaw(m_system_settings.force_mute_on_headphone_removed); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetForceMuteOnHeadphoneRemoved(HLERequestContext& ctx) { | ||||
| void ISystemSettingsServer::SetSpeakerAutoMuteFlag(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     m_system_settings.force_mute_on_headphone_removed = rp.PopRaw<bool>(); | ||||
|     SetSaveNeeded(); | ||||
| @@ -966,6 +993,26 @@ void ISystemSettingsServer::SetPrimaryAlbumStorage(HLERequestContext& ctx) { | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetBatteryLot(HLERequestContext& ctx) { | ||||
|     BatteryLot battery_lot = {"YUZUEMULATOR123456789"}; | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called"); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 8}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.PushRaw(battery_lot); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetSerialNumber(HLERequestContext& ctx) { | ||||
|     SerialNumber console_serial = {"YUZ10012345678"}; | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called"); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 8}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.PushRaw(console_serial); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetNfcEnableFlag(HLERequestContext& ctx) { | ||||
|     LOG_INFO(Service_SET, "called, nfc_enable_flag={}", m_system_settings.nfc_enable_flag); | ||||
|  | ||||
| @@ -1129,6 +1176,17 @@ void ISystemSettingsServer::GetAutoUpdateEnableFlag(HLERequestContext& ctx) { | ||||
|     rb.Push(m_system_settings.auto_update_enable_flag); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetAutoUpdateEnableFlag(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     m_system_settings.auto_update_enable_flag = rp.Pop<bool>(); | ||||
|     SetSaveNeeded(); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, auto_update_flag={}", m_system_settings.auto_update_enable_flag); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetBatteryPercentageFlag(HLERequestContext& ctx) { | ||||
|     LOG_DEBUG(Service_SET, "called, battery_percentage_flag={}", | ||||
|               m_system_settings.battery_percentage_flag); | ||||
| @@ -1138,6 +1196,18 @@ void ISystemSettingsServer::GetBatteryPercentageFlag(HLERequestContext& ctx) { | ||||
|     rb.Push(m_system_settings.battery_percentage_flag); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetBatteryPercentageFlag(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     m_system_settings.battery_percentage_flag = rp.Pop<bool>(); | ||||
|     SetSaveNeeded(); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, battery_percentage_flag={}", | ||||
|              m_system_settings.battery_percentage_flag); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetExternalSteadyClockInternalOffset(HLERequestContext& ctx) { | ||||
|     LOG_DEBUG(Service_SET, "called."); | ||||
|  | ||||
| @@ -1161,6 +1231,27 @@ void ISystemSettingsServer::GetExternalSteadyClockInternalOffset(HLERequestConte | ||||
|     rb.Push(offset); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetPushNotificationActivityModeOnSleep(HLERequestContext& ctx) { | ||||
|     LOG_INFO(Service_SET, "called, push_notification_activity_mode_on_sleep={}", | ||||
|              m_system_settings.push_notification_activity_mode_on_sleep); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.Push(m_system_settings.push_notification_activity_mode_on_sleep); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetPushNotificationActivityModeOnSleep(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     m_system_settings.push_notification_activity_mode_on_sleep = rp.Pop<s32>(); | ||||
|     SetSaveNeeded(); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, push_notification_activity_mode_on_sleep={}", | ||||
|              m_system_settings.push_notification_activity_mode_on_sleep); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetErrorReportSharePermission(HLERequestContext& ctx) { | ||||
|     LOG_INFO(Service_SET, "called, error_report_share_permission={}", | ||||
|              m_system_settings.error_report_share_permission); | ||||
| @@ -1170,6 +1261,18 @@ void ISystemSettingsServer::GetErrorReportSharePermission(HLERequestContext& ctx | ||||
|     rb.PushEnum(m_system_settings.error_report_share_permission); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetErrorReportSharePermission(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     m_system_settings.error_report_share_permission = rp.PopEnum<ErrorReportSharePermission>(); | ||||
|     SetSaveNeeded(); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, error_report_share_permission={}", | ||||
|              m_system_settings.error_report_share_permission); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetAppletLaunchFlags(HLERequestContext& ctx) { | ||||
|     LOG_INFO(Service_SET, "called, applet_launch_flag={}", m_system_settings.applet_launch_flag); | ||||
|  | ||||
| @@ -1190,22 +1293,22 @@ void ISystemSettingsServer::SetAppletLaunchFlags(HLERequestContext& ctx) { | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetKeyboardLayout(HLERequestContext& ctx) { | ||||
|     const auto language_code = | ||||
|         available_language_codes[static_cast<s32>(::Settings::values.language_index.GetValue())]; | ||||
|     const auto key_code = | ||||
|         std::find_if(language_to_layout.cbegin(), language_to_layout.cend(), | ||||
|                      [=](const auto& element) { return element.first == language_code; }); | ||||
|  | ||||
|     KeyboardLayout selected_keyboard_layout = KeyboardLayout::EnglishUs; | ||||
|     if (key_code != language_to_layout.end()) { | ||||
|         selected_keyboard_layout = key_code->second; | ||||
|     } | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, selected_keyboard_layout={}", selected_keyboard_layout); | ||||
|     LOG_INFO(Service_SET, "called, keyboard_layout={}", m_system_settings.keyboard_layout); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.Push(static_cast<u32>(selected_keyboard_layout)); | ||||
|     rb.Push(static_cast<u32>(m_system_settings.keyboard_layout)); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetKeyboardLayout(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     m_system_settings.keyboard_layout = rp.PopRaw<KeyboardLayout>(); | ||||
|     SetSaveNeeded(); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, keyboard_layout={}", m_system_settings.keyboard_layout); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx) { | ||||
| @@ -1297,6 +1400,25 @@ void ISystemSettingsServer::GetFieldTestingFlag(HLERequestContext& ctx) { | ||||
|     rb.Push(m_system_settings.field_testing_flag); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::GetPanelCrcMode(HLERequestContext& ctx) { | ||||
|     LOG_INFO(Service_SET, "called, panel_crc_mode={}", m_system_settings.panel_crc_mode); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 3}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.Push(m_system_settings.panel_crc_mode); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetPanelCrcMode(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     m_system_settings.panel_crc_mode = rp.PopRaw<s32>(); | ||||
|     SetSaveNeeded(); | ||||
|  | ||||
|     LOG_INFO(Service_SET, "called, panel_crc_mode={}", m_system_settings.panel_crc_mode); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|     rb.Push(ResultSuccess); | ||||
| } | ||||
|  | ||||
| void ISystemSettingsServer::SetupSettings() { | ||||
|     auto system_dir = | ||||
|         Common::FS::GetYuzuPath(Common::FS::YuzuPath::NANDDir) / "system/save/8000000000000050"; | ||||
| @@ -1387,6 +1509,66 @@ Result ISystemSettingsServer::SetVibrationMasterVolume(f32 volume) { | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result ISystemSettingsServer::GetAudioOutputMode(AudioOutputMode& out_output_mode, | ||||
|                                                  AudioOutputModeTarget target) const { | ||||
|     switch (target) { | ||||
|     case AudioOutputModeTarget::Hdmi: | ||||
|         out_output_mode = m_system_settings.audio_output_mode_hdmi; | ||||
|         break; | ||||
|     case AudioOutputModeTarget::Speaker: | ||||
|         out_output_mode = m_system_settings.audio_output_mode_speaker; | ||||
|         break; | ||||
|     case AudioOutputModeTarget::Headphone: | ||||
|         out_output_mode = m_system_settings.audio_output_mode_headphone; | ||||
|         break; | ||||
|     case AudioOutputModeTarget::Type3: | ||||
|         out_output_mode = m_system_settings.audio_output_mode_type3; | ||||
|         break; | ||||
|     case AudioOutputModeTarget::Type4: | ||||
|         out_output_mode = m_system_settings.audio_output_mode_type4; | ||||
|         break; | ||||
|     default: | ||||
|         LOG_ERROR(Service_SET, "Invalid audio output mode target {}", target); | ||||
|     } | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result ISystemSettingsServer::SetAudioOutputMode(AudioOutputModeTarget target, | ||||
|                                                  AudioOutputMode output_mode) { | ||||
|     switch (target) { | ||||
|     case AudioOutputModeTarget::Hdmi: | ||||
|         m_system_settings.audio_output_mode_hdmi = output_mode; | ||||
|         break; | ||||
|     case AudioOutputModeTarget::Speaker: | ||||
|         m_system_settings.audio_output_mode_speaker = output_mode; | ||||
|         break; | ||||
|     case AudioOutputModeTarget::Headphone: | ||||
|         m_system_settings.audio_output_mode_headphone = output_mode; | ||||
|         break; | ||||
|     case AudioOutputModeTarget::Type3: | ||||
|         m_system_settings.audio_output_mode_type3 = output_mode; | ||||
|         break; | ||||
|     case AudioOutputModeTarget::Type4: | ||||
|         m_system_settings.audio_output_mode_type4 = output_mode; | ||||
|         break; | ||||
|     default: | ||||
|         LOG_ERROR(Service_SET, "Invalid audio output mode target {}", target); | ||||
|     } | ||||
|     SetSaveNeeded(); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result ISystemSettingsServer::GetSpeakerAutoMuteFlag(bool& is_auto_mute) const { | ||||
|     is_auto_mute = m_system_settings.force_mute_on_headphone_removed; | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result ISystemSettingsServer::SetSpeakerAutoMuteFlag(bool is_auto_mute) { | ||||
|     m_system_settings.force_mute_on_headphone_removed = is_auto_mute; | ||||
|     SetSaveNeeded(); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result ISystemSettingsServer::GetExternalSteadyClockSourceId(Common::UUID& out_id) const { | ||||
|     out_id = m_private_settings.external_clock_source_id; | ||||
|     R_SUCCEED(); | ||||
|   | ||||
| @@ -50,6 +50,10 @@ public: | ||||
|  | ||||
|     Result GetVibrationMasterVolume(f32& out_volume) const; | ||||
|     Result SetVibrationMasterVolume(f32 volume); | ||||
|     Result GetAudioOutputMode(AudioOutputMode& out_output_mode, AudioOutputModeTarget target) const; | ||||
|     Result SetAudioOutputMode(AudioOutputModeTarget target, AudioOutputMode output_mode); | ||||
|     Result GetSpeakerAutoMuteFlag(bool& is_auto_mute) const; | ||||
|     Result SetSpeakerAutoMuteFlag(bool auto_mute); | ||||
|     Result GetExternalSteadyClockSourceId(Common::UUID& out_id) const; | ||||
|     Result SetExternalSteadyClockSourceId(const Common::UUID& id); | ||||
|     Result GetUserSystemClockContext(Service::PSC::Time::SystemClockContext& out_context) const; | ||||
| @@ -97,8 +101,10 @@ private: | ||||
|     void GetSettingsItemValue(HLERequestContext& ctx); | ||||
|     void GetTvSettings(HLERequestContext& ctx); | ||||
|     void SetTvSettings(HLERequestContext& ctx); | ||||
|     void IsForceMuteOnHeadphoneRemoved(HLERequestContext& ctx); | ||||
|     void SetForceMuteOnHeadphoneRemoved(HLERequestContext& ctx); | ||||
|     void GetAudioOutputMode(HLERequestContext& ctx); | ||||
|     void SetAudioOutputMode(HLERequestContext& ctx); | ||||
|     void GetSpeakerAutoMuteFlag(HLERequestContext& ctx); | ||||
|     void SetSpeakerAutoMuteFlag(HLERequestContext& ctx); | ||||
|     void GetDebugModeFlag(HLERequestContext& ctx); | ||||
|     void GetQuestFlag(HLERequestContext& ctx); | ||||
|     void SetQuestFlag(HLERequestContext& ctx); | ||||
| @@ -111,6 +117,8 @@ private: | ||||
|     void SetUserSystemClockAutomaticCorrectionEnabled(HLERequestContext& ctx); | ||||
|     void GetPrimaryAlbumStorage(HLERequestContext& ctx); | ||||
|     void SetPrimaryAlbumStorage(HLERequestContext& ctx); | ||||
|     void GetBatteryLot(HLERequestContext& ctx); | ||||
|     void GetSerialNumber(HLERequestContext& ctx); | ||||
|     void GetNfcEnableFlag(HLERequestContext& ctx); | ||||
|     void SetNfcEnableFlag(HLERequestContext& ctx); | ||||
|     void GetSleepSettings(HLERequestContext& ctx); | ||||
| @@ -126,13 +134,19 @@ private: | ||||
|     void SetBluetoothEnableFlag(HLERequestContext& ctx); | ||||
|     void GetMiiAuthorId(HLERequestContext& ctx); | ||||
|     void GetAutoUpdateEnableFlag(HLERequestContext& ctx); | ||||
|     void SetAutoUpdateEnableFlag(HLERequestContext& ctx); | ||||
|     void GetBatteryPercentageFlag(HLERequestContext& ctx); | ||||
|     void SetBatteryPercentageFlag(HLERequestContext& ctx); | ||||
|     void SetExternalSteadyClockInternalOffset(HLERequestContext& ctx); | ||||
|     void GetExternalSteadyClockInternalOffset(HLERequestContext& ctx); | ||||
|     void GetPushNotificationActivityModeOnSleep(HLERequestContext& ctx); | ||||
|     void SetPushNotificationActivityModeOnSleep(HLERequestContext& ctx); | ||||
|     void GetErrorReportSharePermission(HLERequestContext& ctx); | ||||
|     void SetErrorReportSharePermission(HLERequestContext& ctx); | ||||
|     void GetAppletLaunchFlags(HLERequestContext& ctx); | ||||
|     void SetAppletLaunchFlags(HLERequestContext& ctx); | ||||
|     void GetKeyboardLayout(HLERequestContext& ctx); | ||||
|     void SetKeyboardLayout(HLERequestContext& ctx); | ||||
|     void GetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx); | ||||
|     void SetDeviceTimeZoneLocationUpdatedTime(HLERequestContext& ctx); | ||||
|     void GetUserSystemClockAutomaticCorrectionUpdatedTime(HLERequestContext& ctx); | ||||
| @@ -141,6 +155,8 @@ private: | ||||
|     void GetHomeMenuScheme(HLERequestContext& ctx); | ||||
|     void GetHomeMenuSchemeModel(HLERequestContext& ctx); | ||||
|     void GetFieldTestingFlag(HLERequestContext& ctx); | ||||
|     void GetPanelCrcMode(HLERequestContext& ctx); | ||||
|     void SetPanelCrcMode(HLERequestContext& ctx); | ||||
|  | ||||
|     bool LoadSettingsFile(std::filesystem::path& path, auto&& default_func); | ||||
|     bool StoreSettingsFile(std::filesystem::path& path, auto& settings); | ||||
|   | ||||
| @@ -184,7 +184,7 @@ void ResourceManager::InitializeHidCommonSampler() { | ||||
|     keyboard->SetAppletResource(applet_resource, &shared_mutex); | ||||
|  | ||||
|     const auto settings = | ||||
|         system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys"); | ||||
|         system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true); | ||||
|     npad->SetNpadExternals(applet_resource, &shared_mutex, handheld_config, settings); | ||||
|  | ||||
|     six_axis->SetAppletResource(applet_resource, &shared_mutex); | ||||
|   | ||||
| @@ -8,7 +8,8 @@ | ||||
| namespace Service::HID { | ||||
|  | ||||
| HidFirmwareSettings::HidFirmwareSettings(Core::System& system) { | ||||
|     m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys"); | ||||
|     m_set_sys = | ||||
|         system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true); | ||||
|     LoadSettings(true); | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user