Mixer Host App: Multi device error handeling & device ID agnostic (#315)

Removed device product ID requirement from macOS and added error messages when multiple devices are connected
This commit is contained in:
TDW89
2023-03-02 16:01:17 +00:00
committed by GitHub
parent 49a116c705
commit 3fe4593b52

View File

@@ -18,15 +18,7 @@
// Currently res, max, min dont get populated
#define XMOS_VID 0x20b1
uint16_t XMOS_PID[] = {
0x0002, //L1_AUDIO2
0x0003, //L1_AUDIO1
0x0004, //L2_AUDIO2
0x000E, //xk_216_AUDIO2
0x000F, //xk_216_AUDIO1
0x0016, //xk_316_AUDIO2
0x0017, //xk_316_AUDIO1
};
#define XMOS_DEBUG_PID 0xF7D1
#define USB_REQUEST_TO_DEV 0x21 /* D7 Data direction: 0 (Host to device)
* D6:5 Type: 01 (Class)
@@ -137,16 +129,6 @@ static usb_mixer_handle *usb_mixers = NULL;
static TUsbAudioHandle devh;
#endif
bool is_supported_device(uint16_t pid)
{
for(uint16_t id : XMOS_PID)
{
if (pid == id) return true;
}
fprintf(stderr, "ERROR :: Device not supported\n");
return false;
}
/* Issue a generic control/class GET request to a specific unit in the Audio Interface */
int usb_audio_class_get(unsigned char bRequest, unsigned char cs, unsigned char cn, unsigned short unitID, unsigned short wLength, unsigned char *data)
{
@@ -662,31 +644,46 @@ static int get_mixer_info(const unsigned char *data, int length, unsigned int mi
static int find_xmos_device(unsigned int id)
{
int i = 0;
int found = 0;
int found = -1;
#if defined(__APPLE__)
libusb_device *dev;
libusb_device **devs;
libusb_get_device_list(NULL, &devs);
while ((dev = devs[i++]) != NULL)
while ((dev = devs[i]) != NULL)
{
struct libusb_device_descriptor desc;
libusb_get_device_descriptor(dev, &desc);
// printf("VID = 0x%x, PID = 0x%x\n", desc.idVendor, desc.idProduct);
if (desc.idVendor == XMOS_VID && is_supported_device(desc.idProduct))
if (desc.idVendor == XMOS_VID && desc.idProduct < XMOS_DEBUG_PID)
{
if (found == id)
{
break;
}
found++;
if (found == id)
{
id = i;
}
}
i++;
}
if (found == -1) {
fprintf(stderr, "ERROR :: No device detected\n");
return USB_MIXER_FAILURE;
}
else if (found > 0) {
fprintf(stderr, "ERROR :: Multiple devices detected\n");
return USB_MIXER_FAILURE;
}
#elif defined(_WIN32)
TUsbAudioStatus st;
unsigned int devcnt = gDrvApi.TUSBAUDIO_GetDeviceCount();
if (0 == devcnt) {
if (devcnt == 0) {
fprintf(stderr, "ERROR :: No device detected\n");
return USB_MIXER_FAILURE;
}
else if (devcnt > 1) {
fprintf(stderr, "ERROR :: Multiple devices detected\n");
return USB_MIXER_FAILURE;
}
@@ -694,7 +691,7 @@ static int find_xmos_device(unsigned int id)
#endif
if (
#if defined(__APPLE__)
libusb_open(dev, &devh) < 0
libusb_open(devs[id], &devh) < 0
#elif defined(_WIN32)
TSTATUS_SUCCESS != st
#endif
@@ -707,7 +704,7 @@ static int find_xmos_device(unsigned int id)
{
#if defined(__APPLE__)
libusb_config_descriptor *config_desc = NULL;
libusb_get_active_config_descriptor(dev, &config_desc);
libusb_get_active_config_descriptor(devs[id], &config_desc);
if (config_desc != NULL)
{
//unsigned int num_mixers_found = 0;