diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index 05c8a906..350c9107 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -2360,7 +2360,11 @@ const unsigned num_freqs_a1 = MAX(3, (0 #if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP) #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (58 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) #else + #ifdef USB_CMD_CFG_SAMP_FREQ + #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3) + (40 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) + #else #define CFG_TOTAL_LENGTH_A1 (18 + AC_TOTAL_LENGTH + (INPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + (OUTPUT_INTERFACES_A1 * (49 + num_freqs_a1 * 3)) + CONTROL_INTERFACE_BYTES + DFU_INTERFACE_BYTES + HID_INTERFACE_BYTES) + #endif //USB_CMD_CFG_SAMP_FREQ #endif #define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16) @@ -2832,6 +2836,130 @@ unsigned char cfgDesc_Audio1[] = 0x00, /* Undefined */ 0x00, 0x00, /* Not used */ #endif // XUA_ADAPTIVE + +#ifdef USB_CMD_CFG_SAMP_FREQ + /* Standard Interface Descriptor - Audio streaming IN */ + 0x09, + 0x04, /* INTERFACE */ + (OUTPUT_INTERFACES_A1 + 1), /* bInterfaceNumber */ + 0x02, /* AlternateSetting */ + 0x01, /* bNumEndpoints */ + 0x01, /* Interface class - AUDIO */ + 0x02, /* Subclass - AUDIO_STREAMING */ + 0x00, /* Unused */ + offsetof(StringDescTable_t, inputInterfaceStr_Audio1)/sizeof(char *), + + /* CS_Interface AC interface header descriptor */ + 0x07, + UAC_CS_DESCTYPE_INTERFACE, + 0x01, /* subtype - GENERAL */ + 0x07, /* TerminalLink - linked to Streaming OUT terminal */ + 0x01, /* Interface delay */ + 0x01,0x00, /* Format - PCM */ + + /* CS_Interface Terminal Descriptor */ + (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 */ + +#ifdef USB_CMD_CFG_SAMP_FREQ + USB_IN_SAMP_FREQ_NUM, + CHARIFY_SR(USB_IN_SAMP_FREQ_0), + CHARIFY_SR(USB_IN_SAMP_FREQ_1), + CHARIFY_SR(USB_IN_SAMP_FREQ_2), +#else + 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(MIN_FREQ <= 8000) && (MAX_FREQ_FS >= 8000) + 0x40, 0x1F, 0x00, /* sampleFreq - 8000KHz */ +#endif + +#if(MIN_FREQ <= 11025) && (MAX_FREQ_FS >= 11025) + 0x11, 0x2B, 0x00, /* sampleFreq - 11025KHz */ +#endif + +#if(MIN_FREQ <= 12000) && (MAX_FREQ_FS >= 12000) + 0xE0, 0x2E, 0x00, /* sampleFreq - 12000KHz */ +#endif + +#if(MIN_FREQ <= 16000) && (MAX_FREQ_FS >= 16000) + CHARIFY_SR(16000), /* sampleFreq - 32KHz */ +#endif + +#if(MIN_FREQ <= 32000) && (MAX_FREQ_FS >= 32000) + CHARIFY_SR(32000), /* sampleFreq - 32KHz */ +#endif + +#if (MIN_FREQ <= 44100) && (MAX_FREQ_FS >= 44100) + 0x44, 0xAC, 0x00, /* sampleFreq - 44.1Khz */ +#endif + +#if (MIN_FREQ <= 48000) && (MAX_FREQ_FS >= 48000) + 0x80, 0xBB, 0x00, /* sampleFreq - 48KHz */ +#endif + +#if (MIN_FREQ <= 88200) && (MAX_FREQ_FS >= 88200) + 0x88, 0x58, 0x01, /* sampleFreq - 88.2KHz */ +#endif + +#if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) + 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ +#endif +#endif //USB_CMD_CFG_SAMP_FREQ + + /* Standard Endpoint Descriptor */ + 0x09, + 0x05, /* ENDPOINT */ + ENDPOINT_ADDRESS_IN_AUDIO, /* EndpointAddress */ +#ifdef XUA_ADAPTIVE + ISO_EP_ATTRIBUTES_ADAPTIVE, +#else + #if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP) + ISO_EP_ATTRIBUTES_ASYNCH, /* Iso, async, data endpoint */ + #else + ISO_EP_IMPL_ATTRIBUTES_ASYNCH, /* Feedback data endpoint */ + #endif +#endif + FS_STREAM_FORMAT_INPUT_1_MAXPACKETSIZE&0xff, /* 4 wMaxPacketSize (Typically 294 bytes)*/ + (FS_STREAM_FORMAT_INPUT_1_MAXPACKETSIZE&0xff00)>>8, /* 5 wMaxPacketSize */ + 0x01, /* bInterval */ + 0x00, /* bRefresh */ + 0x00, /* bSynchAddress */ + + /* CS_Endpoint Descriptor */ + 0x07, + 0x25, /* CS_ENDPOINT */ + 0x01, /* Subtype - GENERAL */ + 0x01, /* Attributes. D[0]: sample freq ctrl. */ +#ifdef XUA_ADAPTIVE + 0x02, /* Lock Delay units PCM samples*/ + 0x08, 0x00, /* No lock delay */ +#else + 0x00, /* Undefined */ + 0x00, 0x00, /* Not used */ +#endif // XUA_ADAPTIVE +#endif//USB_CMD_CFG_SAMP_FREQ + + #endif #if (XUA_DFU_EN == 1) && (FORCE_UAC1_DFU == 1) diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index d096c9c9..22bfc43f 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -57,8 +57,9 @@ extern unsigned int g_curAudOut_SamFreq; #endif /* Global var for current frequency, set to default freq */ -#ifdef DEFAULT_AUDOUT_FREQ -unsigned int g_curSamFreq = DEFAULT_AUDOUT_FREQ; +#ifdef USB_CMD_CFG_SAMP_FREQ +#define g_curSamFreq g_curAudOut_SamFreq +//unsigned int g_curSamFreq = DEFAULT_AUDOUT_FREQ; #else unsigned int g_curSamFreq = DEFAULT_FREQ; #endif