Fixes for UAC1 enum issues on Windows - attempt to only expose 7 sample rates (> 7 crashes Windows UAC1 driver)

This commit is contained in:
Ross Owen
2015-11-24 11:38:19 +00:00
parent ab7db51b17
commit ab55f03fc2

View File

@@ -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 */