diff --git a/rpcs3/ds4_pad_handler.cpp b/rpcs3/ds4_pad_handler.cpp index 32c1876def..a9219105c0 100644 --- a/rpcs3/ds4_pad_handler.cpp +++ b/rpcs3/ds4_pad_handler.cpp @@ -616,6 +616,7 @@ void ds4_thread::on_init(const std::shared_ptr& _this) for (auto pid : ds4Pids) { hid_device_info* devInfo = hid_enumerate(DS4_VID, pid); + hid_device_info* head = devInfo; while (devInfo) { @@ -628,6 +629,8 @@ void ds4_thread::on_init(const std::shared_ptr& _this) devInfo = devInfo->next; } + + hid_free_enumeration(head); } if (controllers.size() == 0) @@ -715,13 +718,6 @@ void ds4_thread::on_task() if (dev) { hid_set_nonblocking(dev, 1); - if (controller.second.btCon) - { - // We already have calibration data, but we still need this to kick BT into sending correct 0x11 reports - std::array buf{}; - buf[0] = 0x2; - hid_get_feature_report(dev, buf.data(), buf.size()); - } controller.second.hidDevice = dev; } else @@ -746,6 +742,16 @@ void ds4_thread::on_task() if (res == 0) continue; + // bt controller sends this until 0x02 feature report is sent back (happens on controller init/restart) + if (controller.second.btCon && buf[0] == 0x1) + { + // tells controller to send 0x11 reports + std::array buf{}; + buf[0] = 0x2; + hid_get_feature_report(controller.second.hidDevice, buf.data(), buf.size()); + continue; + } + int offset = 0; // check report and set offset if (controller.second.btCon && buf[0] == 0x11 && res == 78) @@ -788,4 +794,5 @@ void ds4_thread::on_task() } std::this_thread::sleep_for((online > 0) ? THREAD_SLEEP : THREAD_SLEEP_INACTIVE); } -} \ No newline at end of file +} +