Skip to content

Commit 6943a00

Browse files
committed
Add ability to match orphan audio devices - fixes #501
Signed-off-by: Benn Snyder <[email protected]>
1 parent c29570e commit 6943a00

File tree

1 file changed

+51
-8
lines changed

1 file changed

+51
-8
lines changed

src/usb_libusb10.c

+51-8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
* either License.
2525
*/
2626

27+
#include <assert.h>
2728
#include <stdio.h>
2829
#include <stdlib.h>
2930
#include <string.h>
@@ -36,7 +37,6 @@
3637
# define sleep(x) Sleep((x)*1000)
3738
#endif
3839

39-
4040
FN_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+
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);
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

122165
FN_INTERNAL int fnusb_list_device_attributes(freenect_context *ctx, struct freenect_device_attributes** attribute_list)

0 commit comments

Comments
 (0)