void clearDeviceEnumeration() { // free enumerated device pointers, this should not affect opened devices for(UsbDeviceVector::iterator it = enumerated_devices_.begin(); it != enumerated_devices_.end(); ++it) { libusb_unref_device(it->dev); } enumerated_devices_.clear(); has_device_enumeration_ = false; }
void enumerateDevices() { std::cout << "[Freenect2Impl] enumerating devices..." << std::endl; libusb_device **device_list; int num_devices = libusb_get_device_list(usb_context_, &device_list); std::cout << "[Freenect2Impl] " << num_devices << " usb devices connected" << std::endl; if(num_devices > 0) { for(int idx = 0; idx < num_devices; ++idx) { libusb_device *dev = device_list[idx]; libusb_device_descriptor dev_desc; int r = libusb_get_device_descriptor(dev, &dev_desc); // this is always successful if(dev_desc.idVendor == Freenect2Device::VendorId && (dev_desc.idProduct == Freenect2Device::ProductId || dev_desc.idProduct == Freenect2Device::ProductIdPreview)) { Freenect2DeviceImpl *freenect2_dev; // prevent error if device is already open if(tryGetDevice(dev, &freenect2_dev)) { UsbDeviceWithSerial dev_with_serial; dev_with_serial.dev = dev; dev_with_serial.serial = freenect2_dev->getSerialNumber(); enumerated_devices_.push_back(dev_with_serial); continue; } else { libusb_device_handle *dev_handle; r = libusb_open(dev, &dev_handle); if(r == LIBUSB_SUCCESS) { unsigned char buffer[1024]; r = libusb_get_string_descriptor_ascii(dev_handle, dev_desc.iSerialNumber, buffer, sizeof(buffer)); if(r > LIBUSB_SUCCESS) { UsbDeviceWithSerial dev_with_serial; dev_with_serial.dev = dev; dev_with_serial.serial = std::string(reinterpret_cast<char *>(buffer), size_t(r)); std::cout << "[Freenect2Impl] found valid Kinect v2 " << PrintBusAndDevice(dev) << " with serial " << dev_with_serial.serial << std::endl; // valid Kinect v2 enumerated_devices_.push_back(dev_with_serial); continue; } else { std::cout << "[Freenect2Impl] failed to get serial number of Kinect v2 " << PrintBusAndDevice(dev) << "!" << std::endl; } libusb_close(dev_handle); } else { std::cout << "[Freenect2Impl] failed to open Kinect v2 " << PrintBusAndDevice(dev) << "!" << std::endl; } } } libusb_unref_device(dev); } } { std::sort(enumerated_devices_.begin(), enumerated_devices_.end(), asc); for (const UsbDeviceWithSerial& dev : enumerated_devices_) { std::cout << "[Freenect2Impl] [sorted] found valid Kinect v2 " << PrintBusAndDevice(dev.dev) << " with serial " << dev.serial << std::endl; } } libusb_free_device_list(device_list, 0); has_device_enumeration_ = true; std::cout << "[Freenect2Impl] found " << enumerated_devices_.size() << " devices" << std::endl; }