@@ -318,8 +318,8 @@ FN_INTERNAL int fnusb_open_subdevices(freenect_device *dev, int index)
318
318
if (cnt < 0 )
319
319
return -1 ;
320
320
321
- int i = 0 , nr_cam = 0 , nr_mot = 0 ;
322
- int nr_audio = 0 ;
321
+ int i = 0 , nr_cam = 0 ;
322
+
323
323
int res ;
324
324
struct libusb_device_descriptor desc ;
325
325
@@ -424,19 +424,32 @@ FN_INTERNAL int fnusb_open_subdevices(freenect_device *dev, int index)
424
424
if (ctx -> enabled_subdevices == FREENECT_DEVICE_CAMERA || res < 0 )
425
425
cnt = 0 ;
426
426
427
- // Search for the motor
428
- for (i = 0 ; i < cnt ; i ++ )
429
- {
427
+ //FIND MOTOR BASED ON PARENT HUB
428
+ if ( (ctx -> enabled_subdevices & FREENECT_DEVICE_MOTOR ) && dev -> usb_cam .dev != NULL )
429
+ {
430
+
431
+ libusb_device * camera = libusb_get_device ( dev -> usb_cam .dev );
432
+ libusb_device * cameraParent = libusb_get_parent ( camera );
433
+
434
+ if ( cameraParent != NULL )
435
+ {
436
+
437
+ for (i = 0 ; i < cnt ; i ++ )
438
+ {
439
+
440
+ // Match audio based on camera parent
441
+ if ( cameraParent == libusb_get_parent (devs [i ]) )
442
+ {
443
+
430
444
int r = libusb_get_device_descriptor (devs [i ], & desc );
431
445
if (r < 0 )
432
446
continue ;
433
447
434
448
if (desc .idVendor != VID_MICROSOFT )
435
449
continue ;
436
- if ((ctx -> enabled_subdevices & FREENECT_DEVICE_MOTOR ) && !dev -> usb_motor .dev && desc .idProduct == PID_NUI_MOTOR )
437
- {
438
- // If the index given by the user matches our camera index
439
- if (nr_mot == index )
450
+
451
+ // This has to be the device we are looking for as it is a Kinect motor device with the same parent as the camera
452
+ if ( !dev -> usb_motor .dev && desc .idProduct == PID_NUI_MOTOR )
440
453
{
441
454
dev -> usb_motor .VID = desc .idVendor ;
442
455
dev -> usb_motor .PID = desc .idProduct ;
@@ -456,18 +469,39 @@ FN_INTERNAL int fnusb_open_subdevices(freenect_device *dev, int index)
456
469
dev -> usb_motor .dev = NULL ;
457
470
break ;
458
471
}
459
- }
460
- else
461
- {
462
- nr_mot ++ ;
463
- }
464
- }
465
-
466
- // Search for the audio
467
- if ((ctx -> enabled_subdevices & FREENECT_DEVICE_AUDIO ) && !dev -> usb_audio .dev && (desc .idProduct == PID_NUI_AUDIO || fnusb_is_pid_k4w_audio (desc .idProduct )))
468
- {
469
- // If the index given by the user matches our audio index
470
- if (nr_audio == index )
472
+
473
+ // This has to be the device we need, as it is matched by parent - so don't try any others
474
+ break ;
475
+ }
476
+ }
477
+ }
478
+ }
479
+ }
480
+
481
+ // FIND AUDIO BASED ON PARENT HUB
482
+ if ( (ctx -> enabled_subdevices & FREENECT_DEVICE_AUDIO ) && dev -> usb_cam .dev != NULL )
483
+ {
484
+
485
+ libusb_device * camera = libusb_get_device ( dev -> usb_cam .dev );
486
+ libusb_device * cameraParent = libusb_get_parent ( camera );
487
+
488
+ if ( cameraParent != NULL )
489
+ {
490
+
491
+ for (i = 0 ; i < cnt ; i ++ )
492
+ {
493
+ // Match audio based on camera parent
494
+ if ( cameraParent == libusb_get_parent (devs [i ]) )
495
+ {
496
+ int r = libusb_get_device_descriptor (devs [i ], & desc );
497
+ if (r < 0 )
498
+ continue ;
499
+
500
+ if (desc .idVendor != VID_MICROSOFT )
501
+ continue ;
502
+
503
+ // This has to be the device we are looking for as it is a Kinect audio device with the same parent as the camera
504
+ if ( !dev -> usb_audio .dev && (desc .idProduct == PID_NUI_AUDIO || fnusb_is_pid_k4w_audio (desc .idProduct )))
471
505
{
472
506
dev -> usb_audio .VID = desc .idVendor ;
473
507
dev -> usb_audio .PID = desc .idProduct ;
@@ -625,10 +659,11 @@ FN_INTERNAL int fnusb_open_subdevices(freenect_device *dev, int index)
625
659
}
626
660
free (audio_serial );
627
661
}
628
- }
629
- else
630
- {
631
- nr_audio ++ ;
662
+
663
+ // This has to be the device we need, as it is matched by parent - so don't try any others
664
+ break ;
665
+ }
666
+ }
632
667
}
633
668
}
634
669
}
0 commit comments