@@ -400,19 +400,29 @@ FN_INTERNAL int fnusb_keep_alive_led(freenect_context* ctx, libusb_device* audio
400400 return res ;
401401}
402402
403+ FN_INTERNAL void fnusb_reset_subdevice (fnusb_dev * dev , freenect_device * parent )
404+ {
405+ if (dev ) {
406+ if (dev -> dev ) {
407+ libusb_release_interface (dev -> dev , 0 );
408+ libusb_attach_kernel_driver (dev -> dev , 0 );
409+ libusb_close (dev -> dev );
410+ dev -> dev = NULL ;
411+ }
412+ dev -> parent = parent ;
413+ }
414+ }
415+
403416FN_INTERNAL int fnusb_open_subdevices (freenect_device * dev , int index )
404417{
405418 freenect_context * ctx = dev -> parent ;
406419
407420 dev -> device_does_motor_control_with_audio = 0 ;
408421 dev -> motor_control_with_audio_enabled = 0 ;
409422
410- dev -> usb_cam .parent = dev ;
411- dev -> usb_cam .dev = NULL ;
412- dev -> usb_motor .parent = dev ;
413- dev -> usb_motor .dev = NULL ;
414- dev -> usb_audio .parent = dev ;
415- dev -> usb_audio .dev = NULL ;
423+ fnusb_reset_subdevice (& dev -> usb_cam , dev );
424+ fnusb_reset_subdevice (& dev -> usb_motor , dev );
425+ fnusb_reset_subdevice (& dev -> usb_audio , dev );
416426
417427 libusb_device * * devs ; // pointer to pointer of device, used to retrieve a list of devices
418428 ssize_t count = libusb_get_device_list (dev -> parent -> usb .ctx , & devs ); //get the list of devices
@@ -724,24 +734,9 @@ FN_INTERNAL int fnusb_open_subdevices(freenect_device *dev, int index)
724734
725735FN_INTERNAL int fnusb_close_subdevices (freenect_device * dev )
726736{
727- if (dev -> usb_cam .dev ) {
728- libusb_release_interface (dev -> usb_cam .dev , 0 );
729- #ifndef _WIN32
730- libusb_attach_kernel_driver (dev -> usb_cam .dev , 0 );
731- #endif
732- libusb_close (dev -> usb_cam .dev );
733- dev -> usb_cam .dev = NULL ;
734- }
735- if (dev -> usb_motor .dev ) {
736- libusb_release_interface (dev -> usb_motor .dev , 0 );
737- libusb_close (dev -> usb_motor .dev );
738- dev -> usb_motor .dev = NULL ;
739- }
740- if (dev -> usb_audio .dev ) {
741- libusb_release_interface (dev -> usb_audio .dev , 0 );
742- libusb_close (dev -> usb_audio .dev );
743- dev -> usb_audio .dev = NULL ;
744- }
737+ fnusb_reset_subdevice (& dev -> usb_cam , dev );
738+ fnusb_reset_subdevice (& dev -> usb_motor , dev );
739+ fnusb_reset_subdevice (& dev -> usb_audio , dev );
745740 return 0 ;
746741}
747742
0 commit comments