From 1d84f735d3badb6ef2ddc148fe909afe83def620 Mon Sep 17 00:00:00 2001 From: Zhihong Chen Date: Mon, 2 Jan 2023 10:53:30 +0800 Subject: [PATCH] update audio class and demo template - fix descriptor error. - move audio v2 default_sampling_freq_table from class driver to demo template. Signed-off-by: Zhihong Chen --- class/audio/usb_audio.h | 26 +++--- class/audio/usbd_audio.c | 39 ++------- demo/audio_v1_mic_multichan_template.c | 24 +++--- .../audio_v1_mic_speaker_multichan_template.c | 21 +++-- demo/audio_v2_mic_multichan_template.c | 38 +++++--- .../audio_v2_mic_speaker_multichan_template.c | 86 +++++++++++++------ demo/audio_v2_speaker_multichan_template.c | 52 +++++++---- 7 files changed, 170 insertions(+), 116 deletions(-) diff --git a/class/audio/usb_audio.h b/class/audio/usb_audio.h index e9d4ff49..cdb0bd98 100644 --- a/class/audio/usb_audio.h +++ b/class/audio/usb_audio.h @@ -132,6 +132,12 @@ #define AUDIO_FORMAT_ALAW 0x0004 #define AUDIO_FORMAT_MULAW 0x0005 +#define AUDIO_V2_FORMAT_PCM 0x00000001 +#define AUDIO_V2_FORMAT_PCM8 0x00000002 +#define AUDIO_V2_FORMAT_IEEE_FLOAT 0x00000004 +#define AUDIO_V2_FORMAT_ALAW 0x00000008 +#define AUDIO_V2_FORMAT_MULAW 0x00000010 + /* bmChannelConfig: a bitmap field that indicates which spatial locations * are occupied by the channels present in the cluster. The bit allocations * are as follows: @@ -640,7 +646,7 @@ struct audio_cs_if_ac_feature_unit_descriptor { uint8_t iFeature; } __PACKED; -#define AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(ch, n) (7 + ch * n) +#define AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(ch, n) (7 + (ch + 1) * n) struct audio_cs_if_as_general_descriptor { uint8_t bLength; @@ -754,7 +760,7 @@ struct audio_cs_ep_ep_general_descriptor { __VA_ARGS__, /* bmaControls(0) Mute */ \ 0x00 /* iTerminal */ -#define AUDIO_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bEndpointAddress, wMaxPacketSize, bInterval, ...) \ +#define AUDIO_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval, ...) \ 0x09, /* bLength */ \ USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ bInterfaceNumber, /* bInterfaceNumber */ \ @@ -784,8 +790,8 @@ struct audio_cs_ep_ep_general_descriptor { AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ \ AUDIO_FORMAT_TYPE_I, /* bFormatType */ \ bNrChannels, /* bNrChannels */ \ - 0x02, /* bSubFrameSize : 2 Bytes per audio subframe */ \ - 0x10, /* bBitResolution : 16 bits per sample */ \ + bSubFrameSize, /* bSubFrameSize : Bytes per audio subframe */ \ + bBitResolution, /* bBitResolution : bits per sample */ \ (PP_NARG(__VA_ARGS__)/3), /* bSamFreqType : only one frequency supported */ \ __VA_ARGS__, /* tSamFreq : Audio sampling frequency coded on 3 bytes */ \ 0x09, /* bLength */ \ @@ -905,7 +911,7 @@ struct audio_v2_cs_if_ac_feature_unit_descriptor { uint8_t iFeature; } __PACKED; -#define AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(ch) (6 + ch * 4) +#define AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(ch) (6 + (ch + 1) * 4) struct audio_v2_cs_if_as_general_descriptor { uint8_t bLength; @@ -959,7 +965,7 @@ struct audio_v2_control_range3_param_block { bFirstInterface, \ bInterfaceCount, \ USB_DEVICE_CLASS_AUDIO, \ - AUDIO_SUBCLASS_AUDIOCONTROL, \ + AUDIO_SUBCLASS_UNDEFINED, \ AUDIO_PROTOCOLv20, \ 0x00, \ /* ------------------ AudioControl Interface ------------------ */\ @@ -1049,10 +1055,10 @@ struct audio_v2_control_range3_param_block { 0x10, /* bLength */ \ AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ \ AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ \ - bTerminalLink, /* bTerminalLink : Unit ID of the Output Terminal*/ \ + bTerminalLink, /* bTerminalLink : Unit ID of the Output or Input Terminal*/ \ 0x00, /* bmControls */ \ AUDIO_FORMAT_TYPE_I, /* bFormatType : AUDIO_FORMAT_TYPE_I */ \ - DBVAL(AUDIO_FORMAT_PCM), /* bmFormats PCM */ \ + DBVAL(AUDIO_V2_FORMAT_PCM), /* bmFormats PCM */ \ bNrChannels, /* bNrChannels */ \ DBVAL(bmChannelConfig), /* bmChannelConfig */ \ 0x00, /* iChannelNames */ \ @@ -1063,10 +1069,10 @@ struct audio_v2_control_range3_param_block { bSubslotSize, /* bSubslotSize */ \ bBitResolution, /* bBitResolution */ \ 0x07, /* bLength */ \ - 0x05, /* bDescriptorType */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ bEndpointAddress, /* bEndpointAddress 3 out endpoint for Audio */ \ 0x01, /* bmAttributes */ \ - WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */ \ + WBVAL(wMaxPacketSize), /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */ \ bInterval, /* bInterval */ \ 0x08, /* bLength */ \ AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ \ diff --git a/class/audio/usbd_audio.c b/class/audio/usbd_audio.c index 4baab5a4..aab1a6be 100644 --- a/class/audio/usbd_audio.c +++ b/class/audio/usbd_audio.c @@ -46,36 +46,6 @@ struct audio_entity_info { static usb_slist_t usbd_audio_entity_info_head = USB_SLIST_OBJECT_INIT(usbd_audio_entity_info_head); -#if CONFIG_USBDEV_AUDIO_VERSION >= 0x0200 -const uint8_t default_sampling_freq_table[] = { - AUDIO_SAMPLE_FREQ_NUM(1), - // AUDIO_SAMPLE_FREQ_4B(8000), - // AUDIO_SAMPLE_FREQ_4B(8000), - // AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(16000), - AUDIO_SAMPLE_FREQ_4B(16000), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(32000), - AUDIO_SAMPLE_FREQ_4B(32000), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(44100), - AUDIO_SAMPLE_FREQ_4B(44100), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(48000), - AUDIO_SAMPLE_FREQ_4B(48000), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(88200), - AUDIO_SAMPLE_FREQ_4B(88200), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(96000), - AUDIO_SAMPLE_FREQ_4B(96000), - AUDIO_SAMPLE_FREQ_4B(0x00), - AUDIO_SAMPLE_FREQ_4B(192000), - AUDIO_SAMPLE_FREQ_4B(192000), - AUDIO_SAMPLE_FREQ_4B(0x00), -}; -#endif - #if CONFIG_USBDEV_AUDIO_VERSION < 0x0200 static int audio_class_endpoint_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { @@ -109,6 +79,7 @@ static int audio_class_endpoint_request_handler(struct usb_setup_packet *setup, sampling_freq = 16000; memcpy(*data, &sampling_freq, 4); *len = 4; + USB_LOG_DBG("Get ep:%02x %d Hz\r\n", ep, (int)sampling_freq); break; default: USB_LOG_WRN("Unhandled Audio Class bRequest 0x%02x\r\n", setup->bRequest); @@ -246,6 +217,7 @@ static int audio_class_interface_request_handler(struct usb_setup_packet *setup, *len = 1; } else { mute = (*data)[0]; + current_feature_control->mute_bCUR = mute; USB_LOG_DBG("Set UnitId:%d ch[%d] mute %s\r\n", entity_id, ch, mute_string[mute]); usbd_audio_set_mute(entity_id, ch, mute); } @@ -299,6 +271,7 @@ static int audio_class_interface_request_handler(struct usb_setup_packet *setup, case AUDIO_CS_CONTROL_SAM_FREQ: if (setup->bmRequestType & USB_REQUEST_DIR_MASK) { memcpy(*data, &sampling_freq[ch], sizeof(uint32_t)); + USB_LOG_DBG("Get ClockId:%d ch[%d] %d Hz\r\n", entity_id, ch, (int)sampling_freq[ch]); *len = 4; } else { memcpy(&sampling_freq[ch], *data, setup->wLength); @@ -329,6 +302,7 @@ static int audio_class_interface_request_handler(struct usb_setup_packet *setup, num = (uint16_t)((uint16_t)(sampling_freq_table[1] << 8) | ((uint16_t)sampling_freq_table[0])); *data = sampling_freq_table; *len = (12 * num + 2); + USB_LOG_DBG("Get sampling_freq_table entity_id:%d ch[%d] addr:%x\r\n", entity_id, ch, (uint32_t)sampling_freq_table); } else { } break; @@ -415,7 +389,7 @@ void usbd_audio_add_entity(uint8_t entity_id, uint16_t bDescriptorSubtype) control->volume.subrange[ch].wMax = 100; control->volume.subrange[ch].wRes = 1; control->mute[ch] = 0; - control->volume_bCUR = 50; + control->volume_bCUR = 0; control->mute_bCUR = 0; } #endif @@ -446,12 +420,13 @@ __WEAK void usbd_audio_set_mute(uint8_t entity_id, uint8_t ch, uint8_t enable) __WEAK void usbd_audio_set_sampling_freq(uint8_t entity_id, uint8_t ep_ch, uint32_t sampling_freq) { } + #if CONFIG_USBDEV_AUDIO_VERSION >= 0x0200 __WEAK void usbd_audio_get_sampling_freq_table(uint8_t entity_id, uint8_t **sampling_freq_table) { - *sampling_freq_table = (uint8_t *)default_sampling_freq_table; } #endif + __WEAK void usbd_audio_set_pitch(uint8_t ep, bool enable) { } \ No newline at end of file diff --git a/demo/audio_v1_mic_multichan_template.c b/demo/audio_v1_mic_multichan_template.c index 276ae32e..60d0de51 100644 --- a/demo/audio_v1_mic_multichan_template.c +++ b/demo/audio_v1_mic_multichan_template.c @@ -20,28 +20,28 @@ #define IN_CHANNEL_NUM 1 #if IN_CHANNEL_NUM == 1 -#define INPUT_CTRL 0x03 -#define INPUT_CH_ENABLE 0x0001 -#elif IN_CHANNEL_NUM == 2 #define INPUT_CTRL 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0000 +#elif IN_CHANNEL_NUM == 2 +#define INPUT_CTRL 0x03, 0x03, 0x03 #define INPUT_CH_ENABLE 0x0003 #elif IN_CHANNEL_NUM == 3 -#define INPUT_CTRL 0x03, 0x03, 0x03 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03 #define INPUT_CH_ENABLE 0x0007 #elif IN_CHANNEL_NUM == 4 -#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03 #define INPUT_CH_ENABLE 0x000f #elif IN_CHANNEL_NUM == 5 -#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 #define INPUT_CH_ENABLE 0x001f #elif IN_CHANNEL_NUM == 6 -#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 #define INPUT_CH_ENABLE 0x003F #elif IN_CHANNEL_NUM == 7 -#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 #define INPUT_CH_ENABLE 0x007f #elif IN_CHANNEL_NUM == 8 -#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 #define INPUT_CH_ENABLE 0x00ff #endif @@ -52,13 +52,13 @@ #define USB_AUDIO_CONFIG_DESC_SIZ (unsigned long)(9 + \ AUDIO_AC_DESCRIPTOR_INIT_LEN(1) + \ AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(1, IN_CHANNEL_NUM) + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ AUDIO_AS_DESCRIPTOR_INIT_LEN(1)) #define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(1) + \ AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(1, IN_CHANNEL_NUM) + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC) const uint8_t audio_descriptor[] = { @@ -68,7 +68,7 @@ const uint8_t audio_descriptor[] = { AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, IN_CHANNEL_NUM, INPUT_CH_ENABLE), AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x02, 0x01, 0x01, INPUT_CTRL), AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, 0x02), - AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, AUDIO_IN_EP, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_FREQ)), + AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, 2, 16, AUDIO_IN_EP, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_FREQ)), /////////////////////////////////////// /// string0 descriptor /////////////////////////////////////// diff --git a/demo/audio_v1_mic_speaker_multichan_template.c b/demo/audio_v1_mic_speaker_multichan_template.c index 59c3fa6e..bbbba9f4 100644 --- a/demo/audio_v1_mic_speaker_multichan_template.c +++ b/demo/audio_v1_mic_speaker_multichan_template.c @@ -16,14 +16,19 @@ #define AUDIO_OUT_EP 0x02 /* AUDIO Class Config */ -#define AUDIO_FREQ 16000U +#define AUDIO_SPEAKER_FREQ 16000U +#define AUDIO_SPEAKER_FRAME_SIZE_BYTE 2u +#define AUDIO_SPEAKER_RESOLUTION_BIT 16u +#define AUDIO_MIC_FREQ 16000U +#define AUDIO_MIC_FRAME_SIZE_BYTE 2u +#define AUDIO_MIC_RESOLUTION_BIT 16u #define AUDIO_SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16)) /* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ -#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_FREQ * 2 * 2) / 1000)) +#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_SPEAKER_FREQ * AUDIO_SPEAKER_FRAME_SIZE_BYTE * 2) / 1000)) /* 16bit(2 Bytes) 双声道(Mono:2) */ -#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_FREQ * 2 * 2) / 1000)) +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_MIC_FREQ * AUDIO_MIC_FRAME_SIZE_BYTE * 2) / 1000)) #define USB_AUDIO_CONFIG_DESC_SIZ (unsigned long)(9 + \ AUDIO_AC_DESCRIPTOR_INIT_LEN(2) + \ @@ -49,13 +54,15 @@ const uint8_t audio_descriptor[] = { USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, 0x00, 0x01, 0x02), AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, 0x02, 0x0003), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x02, 0x01, 0x01, 0x03, 0x00), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x02, 0x01, 0x01, 0x03, 0x00, 0x00), AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, 0x02), AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x02, 0x0003), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x05, 0x04, 0x01, 0x03, 0x00), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x05, 0x04, 0x01, 0x03, 0x00, 0x00), AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, 0x05), - AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x04, 0x02, AUDIO_OUT_EP, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_FREQ)), - AUDIO_AS_DESCRIPTOR_INIT(0x02, 0x03, 0x02, AUDIO_IN_EP, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_FREQ)), + AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x04, 0x02, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, AUDIO_OUT_PACKET,\ + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), + AUDIO_AS_DESCRIPTOR_INIT(0x02, 0x03, 0x02, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, AUDIO_IN_PACKET,\ + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), /////////////////////////////////////// /// string0 descriptor /////////////////////////////////////// diff --git a/demo/audio_v2_mic_multichan_template.c b/demo/audio_v2_mic_multichan_template.c index ab8cef22..5a94965e 100644 --- a/demo/audio_v2_mic_multichan_template.c +++ b/demo/audio_v2_mic_multichan_template.c @@ -12,43 +12,43 @@ #define EP_INTERVAL 0x01 #endif -#define AUDIO_IN_EP 0x01 +#define AUDIO_IN_EP 0x81 #define AUDIO_FREQ 48000 #define HALF_WORD_BYTES 2 //2 half word (one channel) #define SAMPLE_BITS 16 //16 bit per channel #define IN_CHANNEL_NUM 2 +#define BMCONTROL (AUDIO_V2_FU_CONTROL_MUTE | AUDIO_V2_FU_CONTROL_VOLUME) #if IN_CHANNEL_NUM == 1 -#define INPUT_CTRL DBVAL(BMCONTROL) -#define INPUT_CH_ENABLE 0x00000001 -#elif IN_CHANNEL_NUM == 2 #define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x00000000 +#elif IN_CHANNEL_NUM == 2 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x00000003 #elif IN_CHANNEL_NUM == 3 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x00000007 #elif IN_CHANNEL_NUM == 4 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x0000000f #elif IN_CHANNEL_NUM == 5 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x0000001f #elif IN_CHANNEL_NUM == 6 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x0000003F #elif IN_CHANNEL_NUM == 7 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x0000007f #elif IN_CHANNEL_NUM == 8 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x000000ff #endif #define AUDIO_IN_PACKET ((uint32_t)((AUDIO_FREQ * HALF_WORD_BYTES * IN_CHANNEL_NUM) / 1000)) -#define BMCONTROL (AUDIO_V2_FU_CONTROL_MUTE | AUDIO_V2_FU_CONTROL_VOLUME) #define USB_AUDIO_CONFIG_DESC_SIZ (9 + \ AUDIO_V2_AC_DESCRIPTOR_INIT_LEN + \ @@ -72,7 +72,7 @@ const uint8_t audio_descriptor[] = { AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_INTERM_MIC, 0x01, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x03, 0x02, INPUT_CTRL), AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x03, 0x01, 0x0000), - AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x04, IN_CHANNEL_NUM, INPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, AUDIO_IN_PACKET, EP_INTERVAL), + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x04, IN_CHANNEL_NUM, INPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, (AUDIO_IN_PACKET + 4), EP_INTERVAL), /////////////////////////////////////// /// string0 descriptor /////////////////////////////////////// @@ -147,6 +147,13 @@ const uint8_t audio_descriptor[] = { 0x00 }; +static const uint8_t mic_default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(1), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00) +}; + volatile bool tx_flag = 0; void usbd_audio_open(uint8_t intf) @@ -160,6 +167,13 @@ void usbd_audio_close(uint8_t intf) tx_flag = 0; } +void usbd_audio_get_sampling_freq_table(uint8_t entity_id, uint8_t **sampling_freq_table) +{ + if (entity_id == 0x01) { + *sampling_freq_table = (uint8_t *)mic_default_sampling_freq_table; + } +} + void usbd_configure_done_callback(void) { /* no out ep, do nothing */ diff --git a/demo/audio_v2_mic_speaker_multichan_template.c b/demo/audio_v2_mic_speaker_multichan_template.c index d92752a6..146135b9 100644 --- a/demo/audio_v2_mic_speaker_multichan_template.c +++ b/demo/audio_v2_mic_speaker_multichan_template.c @@ -22,59 +22,61 @@ #define IN_CHANNEL_NUM 2 #if IN_CHANNEL_NUM == 1 -#define INPUT_CTRL DBVAL(BMCONTROL) -#define INPUT_CH_ENABLE 0x00000001 -#elif IN_CHANNEL_NUM == 2 #define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CH_ENABLE 0x00000000 +#elif IN_CHANNEL_NUM == 2 +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x00000003 #elif IN_CHANNEL_NUM == 3 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x00000007 #elif IN_CHANNEL_NUM == 4 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x0000000f #elif IN_CHANNEL_NUM == 5 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x0000001f #elif IN_CHANNEL_NUM == 6 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x0000003F #elif IN_CHANNEL_NUM == 7 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x0000007f #elif IN_CHANNEL_NUM == 8 -#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x000000ff #endif + #define OUT_CHANNEL_NUM 2 #if OUT_CHANNEL_NUM == 1 -#define OUTPUT_CTRL DBVAL(BMCONTROL) -#define OUTPUT_CH_ENABLE 0x00000001 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x00000000 #elif OUT_CHANNEL_NUM == 2 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x00000003 #elif OUT_CHANNEL_NUM == 3 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x00000007 #elif OUT_CHANNEL_NUM == 4 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x0000000f #elif OUT_CHANNEL_NUM == 5 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x0000001f #elif OUT_CHANNEL_NUM == 6 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x0000003F #elif OUT_CHANNEL_NUM == 7 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x0000007f #elif OUT_CHANNEL_NUM == 8 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x000000ff #endif + /* AudioFreq * DataSize (2 bytes) * NumChannels */ #define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_FREQ * HALF_WORD_BYTES * OUT_CHANNEL_NUM) / 1000)) #define AUDIO_IN_PACKET ((uint32_t)((AUDIO_FREQ * HALF_WORD_BYTES * IN_CHANNEL_NUM) / 1000)) @@ -117,7 +119,7 @@ uint8_t audio_descriptor[] = { AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x07, 0x06, INPUT_CTRL), AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x08, AUDIO_TERMINAL_STREAMING, 0x07, 0x05, 0x0000), AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, AUDIO_OUT_PACKET, EP_INTERVAL), - AUDIO_V2_AS_DESCRIPTOR_INIT(0x02, 0x08, IN_CHANNEL_NUM, INPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, AUDIO_IN_PACKET, EP_INTERVAL), + AUDIO_V2_AS_DESCRIPTOR_INIT(0x02, 0x08, IN_CHANNEL_NUM, INPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, (AUDIO_IN_PACKET + 4), EP_INTERVAL), /////////////////////////////////////// /// string0 descriptor /////////////////////////////////////// @@ -192,7 +194,33 @@ uint8_t audio_descriptor[] = { 0x00 }; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_EP_MPS]; +static const uint8_t speaker_default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(5), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(0x00) +}; + +static const uint8_t mic_default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(1), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00) +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_PACKET]; volatile bool tx_flag = 0; volatile bool rx_flag = 0; @@ -202,7 +230,7 @@ void usbd_audio_open(uint8_t intf) if (intf == 1) { rx_flag = 1; /* setup first out ep read transfer */ - usbd_ep_start_read(AUDIO_OUT_EP, out_buffer, AUDIO_OUT_EP_MPS); + usbd_ep_start_read(AUDIO_OUT_EP, out_buffer, AUDIO_OUT_PACKET); USB_LOG_RAW("OPEN1\r\n"); } else { tx_flag = 1; @@ -220,6 +248,16 @@ void usbd_audio_close(uint8_t intf) } } +void usbd_audio_get_sampling_freq_table(uint8_t entity_id, uint8_t **sampling_freq_table) +{ + if (entity_id == 0x01) { + *sampling_freq_table = (uint8_t *)speaker_default_sampling_freq_table; + } else if (entity_id == 0x05) { + *sampling_freq_table = (uint8_t *)mic_default_sampling_freq_table; + } else { + } +} + void usbd_audio_set_sampling_freq(uint8_t entity_id, uint8_t ep_ch, uint32_t sampling_freq) { uint16_t packet_size = 0; @@ -234,12 +272,6 @@ void usbd_audio_set_sampling_freq(uint8_t entity_id, uint8_t ep_ch, uint32_t sam } } -#ifdef CONFIG_USB_HS -#define AUDIO_OUT_EP_MPS 512 -#else -#define AUDIO_OUT_EP_MPS 64 -#endif - void usbd_configure_done_callback(void) { } diff --git a/demo/audio_v2_speaker_multichan_template.c b/demo/audio_v2_speaker_multichan_template.c index c4b7b481..82c51a36 100644 --- a/demo/audio_v2_speaker_multichan_template.c +++ b/demo/audio_v2_speaker_multichan_template.c @@ -21,28 +21,28 @@ #define OUT_CHANNEL_NUM 2 #if OUT_CHANNEL_NUM == 1 -#define OUTPUT_CTRL DBVAL(BMCONTROL) -#define OUTPUT_CH_ENABLE 0x00000001 +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CH_ENABLE 0x00000000 #elif OUT_CHANNEL_NUM == 2 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x00000003 #elif OUT_CHANNEL_NUM == 3 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x00000007 #elif OUT_CHANNEL_NUM == 4 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x0000000f #elif OUT_CHANNEL_NUM == 5 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x0000001f #elif OUT_CHANNEL_NUM == 6 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x0000003F #elif OUT_CHANNEL_NUM == 7 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x0000007f #elif OUT_CHANNEL_NUM == 8 -#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) +#define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x000000ff #endif @@ -147,7 +147,26 @@ const uint8_t audio_descriptor[] = { 0x00 }; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_EP_MPS]; +static const uint8_t default_sampling_freq_table[] = { + AUDIO_SAMPLE_FREQ_NUM(5), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(0x00), +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_PACKET]; volatile bool rx_flag = 0; @@ -155,7 +174,7 @@ void usbd_audio_open(uint8_t intf) { rx_flag = 1; /* setup first out ep read transfer */ - usbd_ep_start_read(AUDIO_OUT_EP, out_buffer, AUDIO_OUT_EP_MPS); + usbd_ep_start_read(AUDIO_OUT_EP, out_buffer, AUDIO_OUT_PACKET); USB_LOG_RAW("OPEN\r\n"); } void usbd_audio_close(uint8_t intf) @@ -164,11 +183,12 @@ void usbd_audio_close(uint8_t intf) rx_flag = 0; } -#ifdef CONFIG_USB_HS -#define AUDIO_OUT_EP_MPS 512 -#else -#define AUDIO_OUT_EP_MPS 64 -#endif +void usbd_audio_get_sampling_freq_table(uint8_t entity_id, uint8_t **sampling_freq_table) +{ + if (entity_id == 0x01) { + *sampling_freq_table = (uint8_t *)default_sampling_freq_table; + } +} void usbd_configure_done_callback(void) {