diff options
| author | liamwhite <liamwhite@users.noreply.github.com> | 2023-11-25 10:17:11 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-25 10:17:11 -0500 | 
| commit | bc4818b058bef926c320ef742053007b7bb33cc0 (patch) | |
| tree | 836d1902acbc83005d53a534608bed96ac734911 | |
| parent | 2993d3bb4955c222cfba3a4b210c89010aee3198 (diff) | |
| parent | 02a0b41a152d24dc4ba50ae63be625656838ba1a (diff) | |
Merge pull request #12151 from german77/no-crash
core: hid: Ensure output devices are initialized
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 50 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.h | 1 | 
2 files changed, 51 insertions, 0 deletions
| diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index a22015ada..a6e681e15 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp @@ -509,9 +509,11 @@ void EmulatedController::ReloadInput() {          });      }      turbo_button_state = 0; +    is_initalized = true;  }  void EmulatedController::UnloadInput() { +    is_initalized = false;      for (auto& button : button_devices) {          button.reset();      } @@ -1207,6 +1209,9 @@ void EmulatedController::SetNfc(const Common::Input::CallbackStatus& callback) {  }  bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { +    if (!is_initalized) { +        return false; +    }      if (device_index >= output_devices.size()) {          return false;      } @@ -1242,6 +1247,10 @@ bool EmulatedController::IsVibrationEnabled(std::size_t device_index) {      const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);      const auto& player = Settings::values.players.GetValue()[player_index]; +    if (!is_initalized) { +        return false; +    } +      if (!player.vibration_enabled) {          return false;      } @@ -1261,6 +1270,10 @@ Common::Input::DriverResult EmulatedController::SetPollingMode(      EmulatedDeviceIndex device_index, Common::Input::PollingMode polling_mode) {      LOG_INFO(Service_HID, "Set polling mode {}, device_index={}", polling_mode, device_index); +    if (!is_initalized) { +        return Common::Input::DriverResult::InvalidHandle; +    } +      auto& left_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Left)];      auto& right_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];      auto& nfc_output_device = output_devices[3]; @@ -1306,6 +1319,10 @@ bool EmulatedController::SetCameraFormat(      Core::IrSensor::ImageTransferProcessorFormat camera_format) {      LOG_INFO(Service_HID, "Set camera format {}", camera_format); +    if (!is_initalized) { +        return false; +    } +      auto& right_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];      auto& camera_output_device = output_devices[2]; @@ -1329,6 +1346,11 @@ void EmulatedController::SetRingParam(Common::ParamPackage param) {  }  bool EmulatedController::HasNfc() const { + +    if (!is_initalized) { +        return false; +    } +      const auto& nfc_output_device = output_devices[3];      switch (npad_type) { @@ -1366,6 +1388,10 @@ bool EmulatedController::RemoveNfcHandle() {  }  bool EmulatedController::StartNfcPolling() { +    if (!is_initalized) { +        return false; +    } +      auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];      auto& nfc_virtual_output_device = output_devices[3]; @@ -1377,6 +1403,10 @@ bool EmulatedController::StartNfcPolling() {  }  bool EmulatedController::StopNfcPolling() { +    if (!is_initalized) { +        return false; +    } +      auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];      auto& nfc_virtual_output_device = output_devices[3]; @@ -1388,6 +1418,10 @@ bool EmulatedController::StopNfcPolling() {  }  bool EmulatedController::ReadAmiiboData(std::vector<u8>& data) { +    if (!is_initalized) { +        return false; +    } +      auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];      auto& nfc_virtual_output_device = output_devices[3]; @@ -1400,6 +1434,10 @@ bool EmulatedController::ReadAmiiboData(std::vector<u8>& data) {  bool EmulatedController::ReadMifareData(const Common::Input::MifareRequest& request,                                          Common::Input::MifareRequest& out_data) { +    if (!is_initalized) { +        return false; +    } +      auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];      auto& nfc_virtual_output_device = output_devices[3]; @@ -1412,6 +1450,10 @@ bool EmulatedController::ReadMifareData(const Common::Input::MifareRequest& requ  }  bool EmulatedController::WriteMifareData(const Common::Input::MifareRequest& request) { +    if (!is_initalized) { +        return false; +    } +      auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];      auto& nfc_virtual_output_device = output_devices[3]; @@ -1423,6 +1465,10 @@ bool EmulatedController::WriteMifareData(const Common::Input::MifareRequest& req  }  bool EmulatedController::WriteNfc(const std::vector<u8>& data) { +    if (!is_initalized) { +        return false; +    } +      auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];      auto& nfc_virtual_output_device = output_devices[3]; @@ -1434,6 +1480,10 @@ bool EmulatedController::WriteNfc(const std::vector<u8>& data) {  }  void EmulatedController::SetLedPattern() { +    if (!is_initalized) { +        return; +    } +      for (auto& device : output_devices) {          if (!device) {              continue; diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h index ea18c2343..d6e20ab66 100644 --- a/src/core/hid/emulated_controller.h +++ b/src/core/hid/emulated_controller.h @@ -559,6 +559,7 @@ private:      NpadStyleTag supported_style_tag{NpadStyleSet::All};      bool is_connected{false};      bool is_configuring{false}; +    bool is_initalized{false};      bool system_buttons_enabled{true};      f32 motion_sensitivity{Core::HID::MotionInput::IsAtRestStandard};      u32 turbo_button_state{0}; | 
