From ab55f03fc2676ec68f8c0c6010cb0ef574af99e6 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 24 Nov 2015 11:38:19 +0000 Subject: [PATCH] Fixes for UAC1 enum issues on Windows - attempt to only expose 7 sample rates (> 7 crashes Windows UAC1 driver) --- module_usb_audio/endpoint0/descriptors.h | 101 ++++++++++++++++------- 1 file changed, 69 insertions(+), 32 deletions(-) diff --git a/module_usb_audio/endpoint0/descriptors.h b/module_usb_audio/endpoint0/descriptors.h index 49a54fdb..5e42ae5f 100644 --- a/module_usb_audio/endpoint0/descriptors.h +++ b/module_usb_audio/endpoint0/descriptors.h @@ -2211,8 +2211,8 @@ unsigned char cfgDesc_Null[] = /* In UAC1 supported sample rates are listed in descriptor */ /* Note, to make descriptors easier to produce we always report a fixed number freqs. * Multiple of MAX_FREQ_FS is reported for freqs not required - * Mote, reducing freq coint seems to cause an enumeration issue on Windows */ -#define NUM_FREQS_A1 (9) + * Mote, using a value of 2 or > 7 for NUM_FREQS_A1 causes enumeration issues on Windows */ +#define NUM_FREQS_A1 (7) #define AC_TOTAL_LENGTH (AC_LENGTH + (INPUT_INTERFACES_A1 * (19 + NUM_FREQS_A1 * 3)) + (OUTPUT_INTERFACES_A1 * (19 + (NUM_FREQS_A1 *3)))) #define STREAMING_INTERFACES (INPUT_INTERFACES_A1 + OUTPUT_INTERFACES_A1) @@ -2227,7 +2227,11 @@ unsigned char cfgDesc_Null[] = #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * 61) + (OUTPUT_INTERFACES_A1 * 61)) #endif -#define MAX_FREQ_A1_CHARS (MAX_FREQ_FS & 0xff),((MAX_FREQ_FS & 0xff00)>> 8),((MAX_FREQ_FS & 0xff0000)>> 16) +#define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16) + +#if (MIN_FREQ_FS < 12000) && (MAX_FREQ_FS > 48000) +#error SAMPLE RATE RANGE TO GREAT FOR UAC1 ON WINDOWS +#endif unsigned char cfgDesc_Audio1[] = { @@ -2390,58 +2394,75 @@ unsigned char cfgDesc_Audio1[] = NUM_FREQS_A1, /* SamFreqType - sample freq count */ +/* Attempting to keep this list to 7 */ +#if (MAX_FREQ_FS < 88200) #if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) - 0x40, 0x1F, 0x00, /* sampleFreq - 8000KHz */ + 0x40, 0x1F, 0x00, /* sampleFreq - 8KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if(MIN_FREQ <= 11025) && (MAX_FREQ_FS >= 11025) - 0x11, 0x2B, 0x00, /* sampleFreq - 11025KHz */ + 0x11, 0x2B, 0x00, /* sampleFreq - 11.25KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ +#endif #endif #if(MIN_FREQ <= 12000) && (MAX_FREQ_FS >= 12000) - 0xE0, 0x2E, 0x00, /* sampleFreq - 12000KHz */ + 0xE0, 0x2E, 0x00, /* sampleFreq - 12KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif -#if(MIN_FREQ <= 22050) && (MAX_FREQ_FS >= 22050) - 0x22, 0x56, 0x00, /* sampleFreq - 22.05KHz */ +#if(MIN_FREQ <= 16000) && (MAX_FREQ_FS >= 16000) + CHARIFY_SR(16000), /* sampleFreq - 16KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif -#if(MIN_FREQ <= 24000) && (MAX_FREQ_FS >= 24000) - 0xC0, 0x5D, 0x00, /* sampleFreq - 24KHz */ +#if(MIN_FREQ <= 32000) && (MAX_FREQ_FS >= 32000) + CHARIFY_SR(32000), /* sampleFreq - 32KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif +//#if(MIN_FREQ <= 22050) && (MAX_FREQ_FS >= 22050) +// 0x22, 0x56, 0x00, /* sampleFreq - 22.05KHz */ +//#else +// CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ +//#endif + +//#if(MIN_FREQ <= 24000) && (MAX_FREQ_FS >= 24000) +// 0xC0, 0x5D, 0x00, /* sampleFreq - 24KHz */ +//#else +// CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ +//#endif + #if (MIN_FREQ <= 44100) && (MAX_FREQ_FS >= 44100) 0x44, 0xAC, 0x00, /* sampleFreq - 44.1Khz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if (MIN_FREQ <= 48000) && (MAX_FREQ_FS >= 48000) 0x80, 0xBB, 0x00, /* sampleFreq - 48KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif +#if (MAX_FREQ_FS >= 88200) #if (MIN_FREQ <= 88200) && (MAX_FREQ_FS >= 88200) 0x88, 0x58, 0x01, /* sampleFreq - 88.2KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ +#endif #endif /* Standard AS Isochronous Audio Data Endpoint Descriptor 4.6.1.1 */ @@ -2521,58 +2542,74 @@ unsigned char cfgDesc_Audio1[] = FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS, /* bitResolution - Typically 24bit */ NUM_FREQS_A1, /* SamFreqType - sample freq count */ +#if(MAX_FREQ_FS < 88200) #if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) 0x40, 0x1F, 0x00, /* sampleFreq - 8000KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if(MIN_FREQ <= 11025) && (MAX_FREQ_FS >= 11025) 0x11, 0x2B, 0x00, /* sampleFreq - 11025KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ +#endif #endif #if(MIN_FREQ <= 12000) && (MAX_FREQ_FS >= 12000) 0xE0, 0x2E, 0x00, /* sampleFreq - 12000KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif -#if(MIN_FREQ <= 22050) && (MAX_FREQ_FS >= 22050) - 0x22, 0x56, 0x00, /* sampleFreq - 22.05KHz */ +#if(MIN_FREQ <= 16000) && (MAX_FREQ_FS >= 16000) + CHARIFY_SR(16000), /* sampleFreq - 32KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif -#if(MIN_FREQ <= 24000) && (MAX_FREQ_FS >= 24000) - 0xC0, 0x5D, 0x00, /* sampleFreq - 24KHz */ +#if(MIN_FREQ <= 32000) && (MAX_FREQ_FS >= 32000) + CHARIFY_SR(32000), /* sampleFreq - 32KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif +//#if(MIN_FREQ <= 22050) && (MAX_FREQ_FS >= 22050) +// 0x22, 0x56, 0x00, /* sampleFreq - 22.05KHz */ +//#else +// CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ +//#endif + +//#if(MIN_FREQ <= 24000) && (MAX_FREQ_FS >= 24000) +// 0xC0, 0x5D, 0x00, /* sampleFreq - 24KHz */ +//#else +// CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ +///#endif + #if (MIN_FREQ <= 44100) && (MAX_FREQ_FS >= 44100) 0x44, 0xAC, 0x00, /* sampleFreq - 44.1Khz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if (MIN_FREQ <= 48000) && (MAX_FREQ_FS >= 48000) 0x80, 0xBB, 0x00, /* sampleFreq - 48KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif +#if(MAX_FREQ_FS >= 88200) #if (MIN_FREQ <= 88200) && (MAX_FREQ_FS >= 88200) 0x88, 0x58, 0x01, /* sampleFreq - 88.2KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ #else - MAX_FREQ_A1_CHARS, /* sampleFreq - MAX_FREQ */ + CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ +#endif #endif /* Standard Endpoint Descriptor */