diff --git a/lib_xua/api/xua_conf_default.h b/lib_xua/api/xua_conf_default.h index 828e9682..2b2a722a 100644 --- a/lib_xua/api/xua_conf_default.h +++ b/lib_xua/api/xua_conf_default.h @@ -231,13 +231,30 @@ */ #ifndef DEFAULT_AUDOUT_FREQ #define DEFAULT_AUDOUT_FREQ (48000) - -#define USB_IN_DESCRIPTOR_FREQ_OVERRIDE //used if USB in frequency is not conifigurable by USB endpoint command -#ifdef USB_IN_DESCRIPTOR_FREQ_OVERRIDE - #define USB_IN_FREQ_DESCIPTOR_OFFSET 161 //161- (3 * 3) are the position of descriptor that needed to be modified for USB in frequency - #define CHARIFY_SR(x) (x & 0xff),((x & 0xff00)>> 8),((x & 0xff0000)>> 16) #endif +#define USB_CMD_CFG_SAMP_FREQ +// Not ready yet +// #define USB_IN_CONFIGURABLE_BIT_RES +// #ifdef USB_IN_CONFIGURABLE_BIT_RES + // #define USB_IN_BIT_RES_0 STREAM_FORMAT_INPUT_1_RESOLUTION_BITS + // #define USB_IN_BIT_RES_1 STREAM_FORMAT_INPUT_1_RESOLUTION_BITS//24 +// #endif + +#ifdef USB_CMD_CFG_SAMP_FREQ + #define USB_IN_SAMP_FREQ_NUM 3 + #define USB_IN_SAMP_FREQ_0 DEFAULT_AUDOUT_FREQ + #define USB_IN_SAMP_FREQ_1 16000 + #define USB_IN_SAMP_FREQ_2 16000 + + #if (USB_IN_SAMP_FREQ_NUM < 3) + #error "USB_IN_SAMP_FREQ_NUM must be >=3" + #endif +#else + #define USB_IN_DESCRIPTOR_FREQ_OVERRIDE //used if USB in frequency is not conifigurable by USB endpoint command + #ifdef USB_IN_DESCRIPTOR_FREQ_OVERRIDE + #define USB_IN_FREQ_DESCIPTOR_OFFSET 161 //161- (3 * 3) are the position of descriptor that needed to be modified for USB in frequency + #endif #endif /* Audio Class Defines */ diff --git a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h index fcc1e45b..bcb2178e 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h +++ b/lib_xua/src/core/endpoint0/xua_ep0_descriptors.h @@ -20,6 +20,8 @@ #include "iap2.h" /* Defines iAP EA Native Transport protocol name */ #endif +#include "xua_conf_default.h" + #define APPEND_VENDOR_STR(x) VENDOR_STR" "#x #define APPEND_PRODUCT_STR_A2(x) PRODUCT_STR_A2 " "#x @@ -2738,6 +2740,13 @@ unsigned char cfgDesc_Audio1[] = 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 */ @@ -2790,6 +2799,7 @@ unsigned char cfgDesc_Audio1[] = #if (MIN_FREQ <= 96000) && (MAX_FREQ_FS >= 96000) 0x00, 0x77, 0x01, /* sampleFreq - 96KHz */ #endif +#endif //USB_CMD_CFG_SAMP_FREQ /* Standard Endpoint Descriptor */ 0x09, diff --git a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc index 2fdd434c..d07ffe59 100644 --- a/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc +++ b/lib_xua/src/core/endpoint0/xua_ep0_uacreqs.xc @@ -17,6 +17,12 @@ #ifdef MIXER #include "mixer.h" #endif +#include "xua_conf_default.h" + + +#define DEBUG_UNIT XUA_EP0_UACREQS +#define DEBUG_PRINT_ENABLE_XUA_EP0_UACREQS 0 +#include "debug_print.h" #define CS_XU_MIXSEL (0x06) @@ -45,8 +51,17 @@ extern unsigned char channelMapUsb[NUM_USB_CHAN_IN]; extern unsigned char mixSel[MAX_MIX_COUNT][MIX_INPUTS]; #endif + +#ifdef USB_CMD_CFG_SAMP_FREQ +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; +#else unsigned int g_curSamFreq = DEFAULT_FREQ; +#endif #if 0 unsigned int g_curSamFreq48000Family = DEFAULT_FREQ % 48000 == 0; @@ -325,6 +340,9 @@ int AudioClassRequests_2(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp, c int newMasterClock; g_curSamFreq = newSampleRate; + #ifdef USB_CMD_CFG_SAMP_FREQ + g_curAudOut_SamFreq = newSampleRate; + #endif #if 0 /* Original feedback implementation */ g_curSamFreq48000Family = ((MCLK_48 % g_curSamFreq) == 0); @@ -1098,7 +1116,7 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp { return result; } -#if (MAX_FREQ != MIN_FREQ) +#if ((MAX_FREQ != MIN_FREQ) || (defined USB_CMD_CFG_SAMP_FREQ) if(controlSelector == SAMPLING_FREQ_CONTROL) { /* Expect length 3 for sample rate */ @@ -1120,6 +1138,9 @@ int AudioEndpointRequests_1(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_t &sp if(curSamFreq48000Family || curSamFreq44100Family) { g_curSamFreq = newSampleRate; + #ifdef USB_CMD_CFG_SAMP_FREQ + g_curAudOut_SamFreq = newSampleRate; + #endif /* Instruct audio thread to change sample freq */ outuint(c_audioControl, SET_SAMPLE_FREQ);