2424 * either License.
2525 */
2626
27+ #include <assert.h>
2728#include <stdio.h>
2829#include <stdlib.h>
2930#include <string.h>
3637 # define sleep (x ) Sleep((x)*1000)
3738#endif
3839
39-
4040FN_INTERNAL int fnusb_num_devices (freenect_context * ctx )
4141{
4242 libusb_device * * devs ; // pointer to pointer of device, used to retrieve a list of devices
@@ -78,16 +78,59 @@ FN_INTERNAL int fnusb_is_pid_k4w_audio(int pid)
7878 return (pid == PID_K4W_AUDIO || pid == PID_K4W_AUDIO_ALT_1 || pid == PID_K4W_AUDIO_ALT_2 );
7979}
8080
81- FN_INTERNAL libusb_device * fnusb_find_connected_audio_device (libusb_device * camera , libusb_device * * deviceList , int cnt )
81+ FN_INTERNAL libusb_device * fnusb_find_orphan_audio (libusb_device * camera , libusb_device * * deviceList , int count )
8282{
83- if (cnt <= 0 ) return NULL ;
83+ if (count <= 0 ) return NULL ;
8484
85- int cameraBusNo = libusb_get_bus_number (camera );
85+ const int cameraBusNo = libusb_get_bus_number (camera );
86+ if (cameraBusNo < 0 ) return NULL ;
87+
88+ #define max_busses 4096
89+ assert (cameraBusNo <= max_busses );
90+ int numAudioByBus [max_busses ] = { 0 };
91+ libusb_device * devicesByBus_Unique [max_busses ] = { NULL };
92+
93+ int i = 0 ;
94+ for (i = 0 ; i < count ; i ++ )
95+ {
96+ struct libusb_device_descriptor desc ;
97+ int res = libusb_get_device_descriptor (deviceList [i ], & desc );
98+ if (res < 0 )
99+ {
100+ continue ;
101+ }
102+
103+ if (desc .idVendor == VID_MICROSOFT )
104+ {
105+ // make sure its some type of Kinect audio device
106+ if ((desc .idProduct == PID_NUI_AUDIO || fnusb_is_pid_k4w_audio (desc .idProduct )))
107+ {
108+ const int audioBusNo = libusb_get_bus_number (deviceList [i ]);
109+ if (audioBusNo == cameraBusNo )
110+ {
111+ if (++ (numAudioByBus [cameraBusNo ]) == 1 ) {
112+ devicesByBus_Unique [cameraBusNo ] = deviceList [i ];
113+ } else {
114+ devicesByBus_Unique [cameraBusNo ] = NULL ; // no duplicates!
115+ }
116+ }
117+ }
118+ }
119+ }
120+
121+ return devicesByBus_Unique [cameraBusNo ];
122+ }
123+
124+ FN_INTERNAL libusb_device * fnusb_find_connected_audio_device (libusb_device * camera , libusb_device * * deviceList , int count )
125+ {
126+ if (count <= 0 ) return NULL ;
127+
128+ const int cameraBusNo = libusb_get_bus_number (camera );
86129 if (cameraBusNo < 0 ) return NULL ;
87130 libusb_device * cameraParent = libusb_get_parent (camera );
88131
89132 int i = 0 ;
90- for (i = 0 ; i < cnt ; i ++ )
133+ for (i = 0 ; i < count ; i ++ )
91134 {
92135 struct libusb_device_descriptor desc ;
93136 int res = libusb_get_device_descriptor (deviceList [i ], & desc );
@@ -101,12 +144,12 @@ FN_INTERNAL libusb_device * fnusb_find_connected_audio_device(libusb_device * ca
101144 // make sure its some type of Kinect audio device
102145 if ((desc .idProduct == PID_NUI_AUDIO || fnusb_is_pid_k4w_audio (desc .idProduct )))
103146 {
104- int audioBusNo = libusb_get_bus_number (deviceList [i ]);
147+ const int audioBusNo = libusb_get_bus_number (deviceList [i ]);
105148 if (audioBusNo == cameraBusNo )
106149 {
107150 // we have a match!
108151 // let's double check
109- libusb_device * audioParent = libusb_get_parent (deviceList [i ]);
152+ const libusb_device * audioParent = libusb_get_parent (deviceList [i ]);
110153 if (cameraParent == audioParent )
111154 {
112155 return deviceList [i ];
@@ -116,7 +159,7 @@ FN_INTERNAL libusb_device * fnusb_find_connected_audio_device(libusb_device * ca
116159 }
117160 }
118161
119- return NULL ;
162+ return fnusb_find_orphan_audio ( camera , deviceList , count ) ;
120163}
121164
122165FN_INTERNAL int fnusb_list_device_attributes (freenect_context * ctx , struct freenect_device_attributes * * attribute_list )
0 commit comments