added option USB_CMD_CFG_SAMP_FREQ that allows host to conifgure sampling rate by endpoint command

This commit is contained in:
Keith Au
2020-01-07 17:58:20 +08:00
parent 6b1da7610f
commit 5361ef8866
3 changed files with 54 additions and 6 deletions

View File

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

View File

@@ -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,

View File

@@ -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);