From 49466b8653112beccc4fb8b734db2e23a8a5426a Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Tue, 24 Nov 2015 18:34:54 +0000 Subject: [PATCH] UAC1 descriptors no longer always report 7 freqs - it reports atleast 3 freqs (and up to 7 - over 7 should generate a build error). If < 3 freqs are requested MAX_FREQ_FS is repeated as required. --- module_usb_audio/endpoint0/descriptors.h | 149 +++++++++++------------ 1 file changed, 70 insertions(+), 79 deletions(-) diff --git a/module_usb_audio/endpoint0/descriptors.h b/module_usb_audio/endpoint0/descriptors.h index 5e42ae5f..40124dc1 100644 --- a/module_usb_audio/endpoint0/descriptors.h +++ b/module_usb_audio/endpoint0/descriptors.h @@ -2208,13 +2208,43 @@ unsigned char cfgDesc_Null[] = #define AC_LENGTH (8 + INPUT_INTERFACES_A1 + OUTPUT_INTERFACES_A1) -/* 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, using a value of 2 or > 7 for NUM_FREQS_A1 causes enumeration issues on Windows */ -#define NUM_FREQS_A1 (7) +/* In UAC1 supported sample rates are listed in descriptor + * Note, using a value of <=2 or > 7 for num_freqs_a1 causes enumeration issues on Windows. + * To work around this we repeat MAX_FREQ_FS multiple times in some cases */ -#define AC_TOTAL_LENGTH (AC_LENGTH + (INPUT_INTERFACES_A1 * (19 + NUM_FREQS_A1 * 3)) + (OUTPUT_INTERFACES_A1 * (19 + (NUM_FREQS_A1 *3)))) +#define MAX(a,b) (((a)>(b))?(a):(b)) +const unsigned num_freqs_a1 = MAX(3, (0 +#if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) + + 1 +#endif +#if(MIN_FREQ <= 11025) && (MAX_FREQ_FS >= 11025) + +1 +#endif + +#if(MIN_FREQ <= 12000) && (MAX_FREQ_FS >= 12000) + +1 +#endif +#if(MIN_FREQ <= 16000) && (MAX_FREQ_FS >= 16000) + +1 +#endif +#if(MIN_FREQ <= 32000) && (MAX_FREQ_FS >= 32000) + +1 +#endif +#if (MIN_FREQ <= 44100) && (MAX_FREQ_FS >= 44100) + +1 +#endif +#if (MIN_FREQ <= 48000) && (MAX_FREQ_FS >= 48000) + +1 +#endif +#if (MIN_FREQ <= 88200) && (MAX_FREQ_FS >= 88200) + +1 +#endif +#if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) + +1 +#endif +)); + +#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) /* Number of interfaces for Audio 1.0 (+1 for control ) */ @@ -2384,7 +2414,7 @@ unsigned char cfgDesc_Audio1[] = 0x01, 0x00, /* wFormatTag - PCM */ /* CS_Interface Format Type Descriptor */ - (8 + (NUM_FREQS_A1 * 3)), + (8 + (num_freqs_a1 * 3)), UAC_CS_DESCTYPE_INTERFACE, 0x02, /* Subtype - FORMAT_TYPE */ 0x01, /* Format type - FORMAT_TYPE_1 */ @@ -2392,77 +2422,57 @@ unsigned char cfgDesc_Audio1[] = FS_STREAM_FORMAT_OUTPUT_1_SUBSLOT_BYTES, /* subFrameSize */ FS_STREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS, /* bitResolution */ - NUM_FREQS_A1, /* SamFreqType - sample freq count */ + num_freqs_a1, /* SamFreqType - sample freq count */ + +/* Windows enum issue with <= two sample rates work around */ +#if ((MIN_FREQ == 8000) && (MAX_FREQ_FS == 11025)) \ + || (MIN_FREQ == 11025) && (MAX_FREQ_FS == 12000) \ + || (MIN_FREQ == 12000) && (MAX_FREQ_FS == 16000) \ + || (MIN_FREQ == 16000) && (MAX_FREQ_FS == 32000) \ + || (MIN_FREQ == 44100) && (MAX_FREQ_FS == 48000) \ + || (MIN_FREQ == 48000) && (MAX_FREQ_FS == 88200) \ + || (MIN_FREQ == 88200) && (MAX_FREQ_FS == 96000) + CHARIFY_SR(MAX_FREQ_FS), +#endif +#if (MIN_FREQ == MAX_FREQ_FS) + CHARIFY_SR(MAX_FREQ_FS), + CHARIFY_SR(MAX_FREQ_FS), +#endif -/* Attempting to keep this list to 7 */ -#if (MAX_FREQ_FS < 88200) #if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) 0x40, 0x1F, 0x00, /* sampleFreq - 8KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if(MIN_FREQ <= 11025) && (MAX_FREQ_FS >= 11025) 0x11, 0x2B, 0x00, /* sampleFreq - 11.25KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ -#endif #endif #if(MIN_FREQ <= 12000) && (MAX_FREQ_FS >= 12000) 0xE0, 0x2E, 0x00, /* sampleFreq - 12KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if(MIN_FREQ <= 16000) && (MAX_FREQ_FS >= 16000) CHARIFY_SR(16000), /* sampleFreq - 16KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if(MIN_FREQ <= 32000) && (MAX_FREQ_FS >= 32000) CHARIFY_SR(32000), /* sampleFreq - 32KHz */ -#else - 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 - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if (MIN_FREQ <= 48000) && (MAX_FREQ_FS >= 48000) 0x80, 0xBB, 0x00, /* sampleFreq - 48KHz */ -#else - 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 - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ -#endif #endif /* Standard AS Isochronous Audio Data Endpoint Descriptor 4.6.1.1 */ @@ -2533,83 +2543,64 @@ unsigned char cfgDesc_Audio1[] = 0x01,0x00, /* Format - PCM */ /* CS_Interface Terminal Descriptor */ - (8 + (NUM_FREQS_A1 * 3)), + (8 + (num_freqs_a1 * 3)), UAC_CS_DESCTYPE_INTERFACE, 0x02, /* Subtype - FORMAT_TYPE */ 0x01, /* Format type - FORMAT_TYPE_1 */ NUM_USB_CHAN_IN_FS, /* bNrChannels - Typically 2 */ FS_STREAM_FORMAT_INPUT_1_SUBSLOT_BYTES, /* subFrameSize - Typically 4 bytes per slot */ FS_STREAM_FORMAT_INPUT_1_RESOLUTION_BITS, /* bitResolution - Typically 24bit */ - NUM_FREQS_A1, /* SamFreqType - sample freq count */ + num_freqs_a1, /* SamFreqType - sample freq count */ + +/* Windows enum issue with <= two sample rates work around */ +#if ((MIN_FREQ == 8000) && (MAX_FREQ_FS == 11025)) \ + || (MIN_FREQ == 11025) && (MAX_FREQ_FS == 12000) \ + || (MIN_FREQ == 12000) && (MAX_FREQ_FS == 16000) \ + || (MIN_FREQ == 16000) && (MAX_FREQ_FS == 32000) \ + || (MIN_FREQ == 44100) && (MAX_FREQ_FS == 48000) \ + || (MIN_FREQ == 48000) && (MAX_FREQ_FS == 88200) \ + || (MIN_FREQ == 88200) && (MAX_FREQ_FS == 96000) + CHARIFY_SR(MAX_FREQ_FS), +#endif +#if (MIN_FREQ == MAX_FREQ_FS) + CHARIFY_SR(MAX_FREQ_FS), + CHARIFY_SR(MAX_FREQ_FS), +#endif -#if(MAX_FREQ_FS < 88200) #if(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) 0x40, 0x1F, 0x00, /* sampleFreq - 8000KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if(MIN_FREQ <= 11025) && (MAX_FREQ_FS >= 11025) 0x11, 0x2B, 0x00, /* sampleFreq - 11025KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ -#endif #endif #if(MIN_FREQ <= 12000) && (MAX_FREQ_FS >= 12000) 0xE0, 0x2E, 0x00, /* sampleFreq - 12000KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if(MIN_FREQ <= 16000) && (MAX_FREQ_FS >= 16000) CHARIFY_SR(16000), /* sampleFreq - 32KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if(MIN_FREQ <= 32000) && (MAX_FREQ_FS >= 32000) CHARIFY_SR(32000), /* sampleFreq - 32KHz */ -#else - 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 - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if (MIN_FREQ <= 48000) && (MAX_FREQ_FS >= 48000) 0x80, 0xBB, 0x00, /* sampleFreq - 48KHz */ -#else - 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 - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ #endif #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ -#else - CHARIFY_SR(MAX_FREQ_FS), /* sampleFreq - MAX_FREQ */ -#endif #endif /* Standard Endpoint Descriptor */