24
24
* either License.
25
25
*/
26
26
27
+ #include <assert.h>
27
28
#include <stdio.h>
28
29
#include <stdlib.h>
29
30
#include <string.h>
36
37
# define sleep (x ) Sleep((x)*1000)
37
38
#endif
38
39
39
-
40
40
FN_INTERNAL int fnusb_num_devices (freenect_context * ctx )
41
41
{
42
42
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)
78
78
return (pid == PID_K4W_AUDIO || pid == PID_K4W_AUDIO_ALT_1 || pid == PID_K4W_AUDIO_ALT_2 );
79
79
}
80
80
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 )
82
82
{
83
- if (cnt <= 0 ) return NULL ;
83
+ if (count <= 0 ) return NULL ;
84
84
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
+ const size_t 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 );
86
129
if (cameraBusNo < 0 ) return NULL ;
87
130
libusb_device * cameraParent = libusb_get_parent (camera );
88
131
89
132
int i = 0 ;
90
- for (i = 0 ; i < cnt ; i ++ )
133
+ for (i = 0 ; i < count ; i ++ )
91
134
{
92
135
struct libusb_device_descriptor desc ;
93
136
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
101
144
// make sure its some type of Kinect audio device
102
145
if ((desc .idProduct == PID_NUI_AUDIO || fnusb_is_pid_k4w_audio (desc .idProduct )))
103
146
{
104
- int audioBusNo = libusb_get_bus_number (deviceList [i ]);
147
+ const int audioBusNo = libusb_get_bus_number (deviceList [i ]);
105
148
if (audioBusNo == cameraBusNo )
106
149
{
107
150
// we have a match!
108
151
// let's double check
109
- libusb_device * audioParent = libusb_get_parent (deviceList [i ]);
152
+ const libusb_device * audioParent = libusb_get_parent (deviceList [i ]);
110
153
if (cameraParent == audioParent )
111
154
{
112
155
return deviceList [i ];
@@ -116,7 +159,7 @@ FN_INTERNAL libusb_device * fnusb_find_connected_audio_device(libusb_device * ca
116
159
}
117
160
}
118
161
119
- return NULL ;
162
+ return fnusb_find_orphan_audio ( camera , deviceList , count ) ;
120
163
}
121
164
122
165
FN_INTERNAL int fnusb_list_device_attributes (freenect_context * ctx , struct freenect_device_attributes * * attribute_list )
0 commit comments