54#if (CFG_TUD_ENABLED && CFG_TUD_AUDIO)
70#ifndef TUD_AUDIO_PREFER_RING_BUFFER
71 #if CFG_TUSB_MCU == OPT_MCU_LPC43XX || CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_MIMXRT1XXX || \
72 defined(TUP_USBIP_DWC2)
73 #define TUD_AUDIO_PREFER_RING_BUFFER 0
75 #define TUD_AUDIO_PREFER_RING_BUFFER 1
84#if (defined(TUP_USBIP_DWC2) && !TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3)) || \
85 defined(TUP_USBIP_FSDEV) || \
86 CFG_TUSB_MCU == OPT_MCU_RX63X || \
87 CFG_TUSB_MCU == OPT_MCU_RX65X || \
88 CFG_TUSB_MCU == OPT_MCU_RX72N || \
89 CFG_TUSB_MCU == OPT_MCU_LPC18XX || \
90 CFG_TUSB_MCU == OPT_MCU_LPC43XX || \
91 CFG_TUSB_MCU == OPT_MCU_MIMXRT1XXX || \
92 CFG_TUSB_MCU == OPT_MCU_MSP432E4
93 #if TUD_AUDIO_PREFER_RING_BUFFER
94 #define USE_LINEAR_BUFFER 0
96 #define USE_LINEAR_BUFFER 1
99 #define USE_LINEAR_BUFFER 1
106#error Maximum number of audio functions restricted to three!
110#if USE_LINEAR_BUFFER || CFG_TUD_AUDIO_ENABLE_ENCODING
111#define IN_SW_BUF_MEM_SECTION
113#define IN_SW_BUF_MEM_SECTION CFG_TUD_MEM_SECTION
115#if USE_LINEAR_BUFFER || CFG_TUD_AUDIO_ENABLE_DECODING
116#define OUT_SW_BUF_MEM_SECTION
118#define OUT_SW_BUF_MEM_SECTION CFG_TUD_MEM_SECTION
122#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_AUDIO_ENABLE_ENCODING
123 #if CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ > 0
124 tu_static IN_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
audio_ep_in_sw_buf_1[CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ];
130 #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ > 0
131 tu_static IN_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
audio_ep_in_sw_buf_2[CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ];
137 #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ > 0
138 tu_static IN_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
audio_ep_in_sw_buf_3[CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ];
148#if CFG_TUD_AUDIO_ENABLE_EP_IN && (USE_LINEAR_BUFFER || CFG_TUD_AUDIO_ENABLE_ENCODING)
149 #if CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX > 0
150 tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
lin_buf_in_1[CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX];
153 #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX > 0
154 tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
lin_buf_in_2[CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX];
157 #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX > 0
158 tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
lin_buf_in_3[CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX];
163#if CFG_TUD_AUDIO_ENABLE_EP_OUT && !CFG_TUD_AUDIO_ENABLE_DECODING
164 #if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ > 0
165 tu_static OUT_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
audio_ep_out_sw_buf_1[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ];
171 #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ > 0
172 tu_static OUT_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
audio_ep_out_sw_buf_2[CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ];
178 #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ > 0
179 tu_static OUT_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
audio_ep_out_sw_buf_3[CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ];
189#if CFG_TUD_AUDIO_ENABLE_EP_OUT && (USE_LINEAR_BUFFER || CFG_TUD_AUDIO_ENABLE_DECODING)
190 #if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX > 0
191 tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
lin_buf_out_1[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX];
194 #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX > 0
195 tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
lin_buf_out_2[CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX];
198 #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX > 0
199 tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
lin_buf_out_3[CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX];
204tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
ctrl_buf_1[CFG_TUD_AUDIO_FUNC_1_CTRL_BUF_SZ];
207tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
ctrl_buf_2[CFG_TUD_AUDIO_FUNC_2_CTRL_BUF_SZ];
211tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t
ctrl_buf_3[CFG_TUD_AUDIO_FUNC_3_CTRL_BUF_SZ];
217#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_N_AS_INT > 0
221#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_N_AS_INT > 0
226#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_ENCODING
227 #if CFG_TUD_AUDIO_FUNC_1_TX_SUPP_SW_FIFO_SZ > 0
228 tu_static CFG_TUSB_MEM_ALIGN uint8_t
tx_supp_ff_buf_1[CFG_TUD_AUDIO_FUNC_1_N_TX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_1_TX_SUPP_SW_FIFO_SZ];
235 #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_TX_SUPP_SW_FIFO_SZ > 0
236 tu_static CFG_TUSB_MEM_ALIGN uint8_t
tx_supp_ff_buf_2[CFG_TUD_AUDIO_FUNC_2_N_TX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_2_TX_SUPP_SW_FIFO_SZ];
243 #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_TX_SUPP_SW_FIFO_SZ > 0
244 tu_static CFG_TUSB_MEM_ALIGN uint8_t
tx_supp_ff_buf_3[CFG_TUD_AUDIO_FUNC_3_N_TX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_3_TX_SUPP_SW_FIFO_SZ];
252#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING
253 #if CFG_TUD_AUDIO_FUNC_1_RX_SUPP_SW_FIFO_SZ > 0
254 tu_static CFG_TUSB_MEM_ALIGN uint8_t
rx_supp_ff_buf_1[CFG_TUD_AUDIO_FUNC_1_N_RX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_1_RX_SUPP_SW_FIFO_SZ];
261 #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_RX_SUPP_SW_FIFO_SZ > 0
262 tu_static CFG_TUSB_MEM_ALIGN uint8_t
rx_supp_ff_buf_2[CFG_TUD_AUDIO_FUNC_2_N_RX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_2_RX_SUPP_SW_FIFO_SZ];
269 #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_RX_SUPP_SW_FIFO_SZ > 0
270 tu_static CFG_TUSB_MEM_ALIGN uint8_t
rx_supp_ff_buf_3[CFG_TUD_AUDIO_FUNC_3_N_RX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_3_RX_SUPP_SW_FIFO_SZ];
283#if CFG_TUD_AUDIO_ENABLE_EP_IN
289#if CFG_TUD_AUDIO_ENABLE_EP_OUT
294#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
300#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP
308#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
331 uint16_t rate_const[2];
340#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING
344#if CFG_TUD_AUDIO_ENABLE_TYPE_I_DECODING
351#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
353 uint16_t packet_sz_tx[3];
359#if CFG_TUD_AUDIO_ENABLE_EP_IN && (CFG_TUD_AUDIO_ENABLE_ENCODING || CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL)
364#if CFG_TUD_AUDIO_ENABLE_TYPE_I_ENCODING
380#if CFG_TUD_AUDIO_ENABLE_EP_OUT && !CFG_TUD_AUDIO_ENABLE_DECODING
384#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_AUDIO_ENABLE_ENCODING
389#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP
390 CFG_TUSB_MEM_ALIGN uint8_t ep_int_buf[6];
394#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING
398#if CFG_TUD_AUDIO_ENABLE_TYPE_I_DECODING
403#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_ENCODING
407#if CFG_TUD_AUDIO_ENABLE_TYPE_I_ENCODING
413#if CFG_TUD_AUDIO_ENABLE_EP_OUT && (USE_LINEAR_BUFFER || CFG_TUD_AUDIO_ENABLE_DECODING)
415#define USE_LINEAR_BUFFER_RX 1
418#if CFG_TUD_AUDIO_ENABLE_EP_IN && (USE_LINEAR_BUFFER || CFG_TUD_AUDIO_ENABLE_ENCODING)
420#define USE_LINEAR_BUFFER_TX 1
425#ifndef USE_LINEAR_BUFFER_TX
426#define USE_LINEAR_BUFFER_TX 0
429#ifndef USE_LINEAR_BUFFER_RX
430#define USE_LINEAR_BUFFER_RX 0
433#define ITF_MEM_RESET_SIZE offsetof(audiod_function_t, ctrl_buf)
439#if CFG_TUD_AUDIO_ENABLE_EP_IN
444 (void) cur_alt_setting;
450 (void) n_bytes_copied;
453 (void) cur_alt_setting;
458#if CFG_TUD_AUDIO_ENABLE_EP_OUT
461 (void) n_bytes_received;
464 (void) cur_alt_setting;
470 (void) n_bytes_received;
473 (void) cur_alt_setting;
478#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
491 return CFG_TUD_AUDIO_ENABLE_FEEDBACK_FORMAT_CORRECTION;
498 (void) interval_shift;
501#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP
526 TU_LOG2(
" No EP set request callback available!\r\n");
535 TU_LOG2(
" No interface set request callback available!\r\n");
544 TU_LOG2(
" No entity set request callback available!\r\n");
552 TU_LOG2(
" No EP get request callback available!\r\n");
560 TU_LOG2(
" No interface get request callback available!\r\n");
568 TU_LOG2(
" No entity get request callback available!\r\n");
577#if CFG_TUD_AUDIO_ENABLE_EP_OUT
581#if CFG_TUD_AUDIO_ENABLE_DECODING && CFG_TUD_AUDIO_ENABLE_EP_OUT
585#if CFG_TUD_AUDIO_ENABLE_EP_IN
589#if CFG_TUD_AUDIO_ENABLE_ENCODING && CFG_TUD_AUDIO_ENABLE_EP_IN
603#if (CFG_TUD_AUDIO_ENABLE_EP_IN && (CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL || CFG_TUD_AUDIO_ENABLE_ENCODING)) || (CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING)
608 return ((uint8_t
const*)
desc)[2];
612#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
614static uint16_t
audiod_tx_packet_size(
const uint16_t* norminal_size, uint16_t data_count, uint16_t fifo_depth, uint16_t max_size);
617#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
624 TU_VERIFY(func_id < CFG_TUD_AUDIO);
634#if CFG_TUD_AUDIO_ENABLE_EP_OUT && !CFG_TUD_AUDIO_ENABLE_DECODING
638 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL);
644 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL);
650 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL);
662#if CFG_TUD_AUDIO_ENABLE_DECODING && CFG_TUD_AUDIO_ENABLE_EP_OUT
666 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL && ff_idx <
_audiod_fct[func_id].n_rx_supp_ff);
672 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL && ff_idx <
_audiod_fct[func_id].n_rx_supp_ff);
678 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL && ff_idx <
_audiod_fct[func_id].n_rx_supp_ff);
692#if CFG_TUD_AUDIO_ENABLE_EP_OUT
697 uint8_t
const *dummy2;
698 uint8_t idx_audio_fct = 0;
706#if CFG_TUD_AUDIO_ENABLE_DECODING
712 TU_LOG2(
" Desired CFG_TUD_AUDIO_FORMAT encoding not implemented!\r\n");
726 TU_LOG2(
" Desired CFG_TUD_AUDIO_FORMAT_TYPE_I_RX encoding not implemented!\r\n");
734 TU_LOG2(
" Desired CFG_TUD_AUDIO_FORMAT_TYPE_RX not implemented!\r\n");
744#if USE_LINEAR_BUFFER_RX
755#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
773#if CFG_TUD_AUDIO_ENABLE_DECODING && CFG_TUD_AUDIO_ENABLE_EP_OUT
781 uint16_t * dst16 = dst;
782 uint16_t * src16 = src;
783 const uint16_t * dst_end16 = dst_end;
784 uint32_t * dst32 = dst;
785 uint32_t * src32 = src;
786 const uint32_t * dst_end32 = dst_end;
788 if (nBytesPerSample == 1)
790 while(dst16 < dst_end16)
793 src16 += n_ff_used - 1;
797 else if (nBytesPerSample == 2)
799 while(dst32 < dst_end32)
802 src32 += n_ff_used - 1;
806 else if (nBytesPerSample == 3)
808 while(dst16 < dst_end16)
813 src16 += 3 * (n_ff_used - 1);
819 while(dst32 < dst_end32)
823 src32 += 2 * (n_ff_used - 1);
835 uint16_t
const nBytesPerFFToRead = n_bytes_received / n_ff_used;
844 for (cnt_ff = 0; cnt_ff < n_ff_used; cnt_ff++)
848 if (
info.len_lin != 0)
852 dst_end =
info.ptr_lin +
info.len_lin;
857 if (
info.len_wrap != 0)
859 dst_end =
info.ptr_wrap +
info.len_wrap;
869#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
884#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_AUDIO_ENABLE_ENCODING
899 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL);
905 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL);
917#if CFG_TUD_AUDIO_ENABLE_ENCODING && CFG_TUD_AUDIO_ENABLE_EP_IN
921 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL);
929 n_bytes_copied = n_bytes_copied*audio->
tx_supp_ff[0].item_size;
931 return n_bytes_copied;
936 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL && ff_idx <
_audiod_fct[func_id].n_tx_supp_ff);
942 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL && ff_idx <
_audiod_fct[func_id].n_tx_supp_ff);
955#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP
959 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL);
985#if CFG_TUD_AUDIO_ENABLE_EP_IN
989 uint8_t
const *dummy2;
1002 uint16_t n_bytes_tx;
1005#if CFG_TUD_AUDIO_ENABLE_ENCODING && CFG_TUD_AUDIO_ENABLE_EP_IN
1010 TU_LOG2(
" Desired CFG_TUD_AUDIO_FORMAT encoding not implemented!\r\n");
1026 TU_LOG2(
" Desired CFG_TUD_AUDIO_FORMAT_TYPE_I_TX encoding not implemented!\r\n");
1035 TU_LOG2(
" Desired CFG_TUD_AUDIO_FORMAT_TYPE_TX not implemented!\r\n");
1045#if CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
1051#if USE_LINEAR_BUFFER_TX
1069#if CFG_TUD_AUDIO_ENABLE_ENCODING && CFG_TUD_AUDIO_ENABLE_EP_IN
1091 uint16_t * dst16 = dst;
1092 uint16_t * src16 = src;
1093 const uint16_t * src_end16 = src_end;
1094 uint32_t * dst32 = dst;
1095 uint32_t * src32 = src;
1096 const uint32_t * src_end32 = src_end;
1098 if (nBytesPerSample == 1)
1100 while(src16 < src_end16)
1102 *dst16++ = *src16++;
1103 dst16 += n_ff_used - 1;
1107 else if (nBytesPerSample == 2)
1109 while(src32 < src_end32)
1111 *dst32++ = *src32++;
1112 dst32 += n_ff_used - 1;
1116 else if (nBytesPerSample == 3)
1118 while(src16 < src_end16)
1120 *dst16++ = *src16++;
1121 *dst16++ = *src16++;
1122 *dst16++ = *src16++;
1123 dst16 += 3 * (n_ff_used - 1);
1129 while(src32 < src_end32)
1131 *dst32++ = *src32++;
1132 *dst32++ = *src32++;
1133 dst32 += 2 * (n_ff_used - 1);
1152 for (cnt_ff = 1; cnt_ff < n_ff_used; cnt_ff++)
1155 if (count < nBytesPerFFToSend)
1157 nBytesPerFFToSend = count;
1161#if CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
1162 const uint16_t norm_packet_sz_tx[3] = {audio->
packet_sz_tx[0] / n_ff_used,
1168 if (nBytesPerFFToSend == 0)
return 0;
1171 if (nBytesPerFFToSend == 0)
return 0;
1173 nBytesPerFFToSend =
tu_min16(nBytesPerFFToSend, audio->
ep_in_sz / n_ff_used);
1176 nBytesPerFFToSend = (nBytesPerFFToSend / nSlotSize) * nSlotSize;
1185 for (cnt_ff = 0; cnt_ff < n_ff_used; cnt_ff++)
1191 if (
info.len_lin != 0)
1194 src_end = (uint8_t *)
info.ptr_lin +
info.len_lin;
1201 if (
info.len_wrap != 0)
1203 src_end = (uint8_t *)
info.ptr_wrap +
info.len_wrap;
1211 return nBytesPerFFToSend * n_ff_used;
1217#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
1222 if (apply_correction)
1260 for(uint8_t i=0; i<CFG_TUD_AUDIO; i++)
1269 audio->
ctrl_buf_sz = CFG_TUD_AUDIO_FUNC_1_CTRL_BUF_SZ;
1271#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_CTRL_BUF_SZ > 0
1274 audio->
ctrl_buf_sz = CFG_TUD_AUDIO_FUNC_2_CTRL_BUF_SZ;
1277#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_CTRL_BUF_SZ > 0
1280 audio->
ctrl_buf_sz = CFG_TUD_AUDIO_FUNC_3_CTRL_BUF_SZ;
1288#if CFG_TUD_AUDIO_FUNC_1_N_AS_INT > 0
1293#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_N_AS_INT > 0
1298#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_N_AS_INT > 0
1306#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_AUDIO_ENABLE_ENCODING
1310#if CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ > 0
1318#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ > 0
1326#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ > 0
1338#if USE_LINEAR_BUFFER_TX
1341#if CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX > 0
1346#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX > 0
1351#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX > 0
1360#if CFG_TUD_AUDIO_ENABLE_EP_OUT && !CFG_TUD_AUDIO_ENABLE_DECODING
1364#if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ > 0
1372#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ > 0
1380#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ > 0
1392#if USE_LINEAR_BUFFER_RX
1395#if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX > 0
1400#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX > 0
1405#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX > 0
1414#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_ENCODING
1418#if CFG_TUD_AUDIO_FUNC_1_TX_SUPP_SW_FIFO_SZ > 0
1421 audio->
n_tx_supp_ff = CFG_TUD_AUDIO_FUNC_1_N_TX_SUPP_SW_FIFO;
1423 for (uint8_t cnt = 0; cnt < CFG_TUD_AUDIO_FUNC_1_N_TX_SUPP_SW_FIFO; cnt++)
1434#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_TX_SUPP_SW_FIFO_SZ > 0
1437 audio->
n_tx_supp_ff = CFG_TUD_AUDIO_FUNC_2_N_TX_SUPP_SW_FIFO;
1439 for (uint8_t cnt = 0; cnt < CFG_TUD_AUDIO_FUNC_2_N_TX_SUPP_SW_FIFO; cnt++)
1450#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_TX_SUPP_SW_FIFO_SZ > 0
1453 audio->
n_tx_supp_ff = CFG_TUD_AUDIO_FUNC_3_N_TX_SUPP_SW_FIFO;
1455 for (uint8_t cnt = 0; cnt < CFG_TUD_AUDIO_FUNC_3_N_TX_SUPP_SW_FIFO; cnt++)
1469#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_TYPE_I_ENCODING
1472#if CFG_TUD_AUDIO_FUNC_1_TX_SUPP_SW_FIFO_SZ > 0
1477#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_TX_SUPP_SW_FIFO_SZ > 0
1482#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_TX_SUPP_SW_FIFO_SZ > 0
1491#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING
1495#if CFG_TUD_AUDIO_FUNC_1_RX_SUPP_SW_FIFO_SZ > 0
1498 audio->
n_rx_supp_ff = CFG_TUD_AUDIO_FUNC_1_N_RX_SUPP_SW_FIFO;
1500 for (uint8_t cnt = 0; cnt < CFG_TUD_AUDIO_FUNC_1_N_RX_SUPP_SW_FIFO; cnt++)
1511#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_RX_SUPP_SW_FIFO_SZ > 0
1514 audio->
n_rx_supp_ff = CFG_TUD_AUDIO_FUNC_2_N_RX_SUPP_SW_FIFO;
1516 for (uint8_t cnt = 0; cnt < CFG_TUD_AUDIO_FUNC_2_N_RX_SUPP_SW_FIFO; cnt++)
1527#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_RX_SUPP_SW_FIFO_SZ > 0
1530 audio->
n_rx_supp_ff = CFG_TUD_AUDIO_FUNC_3_N_RX_SUPP_SW_FIFO;
1532 for (uint8_t cnt = 0; cnt < CFG_TUD_AUDIO_FUNC_3_N_RX_SUPP_SW_FIFO; cnt++)
1546#if CFG_TUD_AUDIO_ENABLE_TYPE_I_DECODING
1549#if CFG_TUD_AUDIO_FUNC_1_RX_SUPP_SW_FIFO_SZ > 0
1554#if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_RX_SUPP_SW_FIFO_SZ > 0
1559#if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_RX_SUPP_SW_FIFO_SZ > 0
1577 for(uint8_t i=0; i<CFG_TUD_AUDIO; i++)
1580 tu_memclr(audio, ITF_MEM_RESET_SIZE);
1582#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_AUDIO_ENABLE_ENCODING
1586#if CFG_TUD_AUDIO_ENABLE_EP_OUT && !CFG_TUD_AUDIO_ENABLE_DECODING
1590#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_ENCODING
1591 for (uint8_t cnt = 0; cnt < audio->
n_tx_supp_ff; cnt++)
1597#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING
1598 for (uint8_t cnt = 0; cnt < audio->
n_rx_supp_ff; cnt++)
1620 TU_ASSERT(CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP);
1628 for (i = 0; i < CFG_TUD_AUDIO; i++)
1641#if CFG_TUD_AUDIO > 1
1646#if CFG_TUD_AUDIO > 2
1653#ifdef TUP_DCD_EDPT_ISO_ALLOC
1655 #if CFG_TUD_AUDIO_ENABLE_EP_IN
1657 uint16_t ep_in_size = 0;
1660 #if CFG_TUD_AUDIO_ENABLE_EP_OUT
1662 uint16_t ep_out_size = 0;
1665 #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
1671 while (p_desc_end - p_desc > 0)
1678 #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
1690 #if CFG_TUD_AUDIO_ENABLE_EP_IN
1696 #if CFG_TUD_AUDIO_ENABLE_EP_OUT
1709 #if CFG_TUD_AUDIO_ENABLE_EP_IN
1716 #if CFG_TUD_AUDIO_ENABLE_EP_OUT
1723 #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
1732#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
1737 while (p_desc_end - p_desc > 0)
1765#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP
1770 while (p_desc_end - p_desc > 0)
1796 TU_ASSERT( i < CFG_TUD_AUDIO );
1809 uint8_t func_id, idxItf;
1810 uint8_t
const *dummy;
1816 TU_LOG2(
" Get itf: %u - current alt: %u\r\n", itf,
_audiod_fct[func_id].alt_setting[idxItf]);
1839 TU_LOG2(
" Set itf: %u - alt: %u\r\n", itf, alt);
1842 uint8_t func_id, idxItf;
1843 uint8_t
const *p_desc;
1849#if CFG_TUD_AUDIO_ENABLE_EP_IN
1853 #ifndef TUP_DCD_EDPT_ISO_ALLOC
1858 #if !CFG_TUD_AUDIO_ENABLE_ENCODING
1861 for (uint8_t cnt = 0; cnt < audio->
n_tx_supp_ff; cnt++)
1872 #if CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
1880#if CFG_TUD_AUDIO_ENABLE_EP_OUT
1884 #ifndef TUP_DCD_EDPT_ISO_ALLOC
1889 #if !CFG_TUD_AUDIO_ENABLE_DECODING
1892 for (uint8_t cnt = 0; cnt < audio->
n_rx_supp_ff; cnt++)
1904 #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
1905 #ifndef TUP_DCD_EDPT_ISO_ALLOC
1919 uint8_t
const *p_desc_end = audio->
p_desc + audio->
desc_length - TUD_AUDIO_DESC_IAD_LEN;
1923 while (p_desc_end - p_desc > 0)
1928#if (CFG_TUD_AUDIO_ENABLE_EP_IN && (CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL || CFG_TUD_AUDIO_ENABLE_ENCODING)) || (CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING)
1929 uint8_t
const * p_desc_parse_for_params = p_desc;
1934 while (foundEPs < nEps && (p_desc_end - p_desc > 0))
1939#ifdef TUP_DCD_EDPT_ISO_ALLOC
1949#if CFG_TUD_AUDIO_ENABLE_EP_IN
1953 audio->
ep_in = ep_addr;
1958 #if CFG_TUD_AUDIO_ENABLE_ENCODING || CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
1962 #if CFG_TUD_AUDIO_ENABLE_ENCODING && CFG_TUD_AUDIO_ENABLE_TYPE_I_ENCODING
1965 for (uint8_t cnt = 0; cnt < audio->
n_tx_supp_ff; cnt++)
1980#if CFG_TUD_AUDIO_ENABLE_EP_OUT
1989 #if CFG_TUD_AUDIO_ENABLE_DECODING
1993 #if CFG_TUD_AUDIO_ENABLE_TYPE_I_DECODING
1995 for (uint8_t cnt = 0; cnt < audio->
n_rx_supp_ff; cnt++)
2005 #if USE_LINEAR_BUFFER_RX
2012 #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
2015 audio->
ep_fb = ep_addr;
2026 TU_VERIFY(foundEPs == nEps);
2031#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
2033 if(audio->
ep_fb != 0)
2059 uint16_t fifo_lvl_thr;
2060#if CFG_TUD_AUDIO_ENABLE_DECODING
2068 uint32_t nominal = ((fb_param.
sample_freq / 100) << 16) / (frame_div / 100);
2094#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
2096 bool enable_sof =
false;
2097 for(uint8_t i=0; i < CFG_TUD_AUDIO; i++)
2111#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
2133 uint8_t itf = TU_U16_LOW(p_request->
wIndex);
2134 uint8_t entityID = TU_U16_HIGH(p_request->
wIndex);
2141#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
2142 uint8_t ctrlSel = TU_U16_HIGH(p_request->
wValue);
2164 uint8_t ep = TU_U16_LOW(p_request->
wIndex);
2174 default: TU_BREAKPOINT();
return false;
2201 default: TU_BREAKPOINT();
return false;
2208 uint8_t itf = TU_U16_LOW(p_request->
wIndex);
2216 uint8_t entityID = TU_U16_HIGH(p_request->
wIndex);
2246 uint8_t ep = TU_U16_LOW(p_request->
wIndex);
2260 default: TU_LOG2(
" Unsupported recipient: %d\r\n", p_request->
bmRequestType_bit.recipient); TU_BREAKPOINT();
return false;
2290 (void) xferred_bytes;
2293 for (uint8_t func_id = 0; func_id < CFG_TUD_AUDIO; func_id++)
2297#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP
2300 if (audio->
ep_int == ep_addr)
2315#if CFG_TUD_AUDIO_ENABLE_EP_IN
2336#if CFG_TUD_AUDIO_ENABLE_EP_OUT
2339 if (audio->
ep_out == ep_addr)
2346#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
2348 if (audio->
ep_fb == ep_addr)
2366#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
2378 if ( (((1UL << k) * sample_freq / mclk_freq) + 1) > n_frame )
2380 TU_LOG1(
" UAC2 feedback interval too small\r\n"); TU_BREAKPOINT();
return false;
2406 lvl = (uint32_t)(((uint64_t)lvl * 63 + ((uint32_t)lvl_new << 16)) >> 6);
2409 uint32_t
const ff_lvl = lvl >> 16;
2424 if ( feedback < audio->feedback.min_value ) feedback = audio->
feedback.
min_value;
2464 if ( feedback < audio->feedback.min_value ) feedback = audio->
feedback.
min_value;
2473 TU_VERIFY(func_id < CFG_TUD_AUDIO &&
_audiod_fct[func_id].p_desc != NULL);
2492#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP
2500 for(uint8_t i=0; i < CFG_TUD_AUDIO; i++)
2504 if (audio->
ep_fb != 0)
2509 if ( 0 == (frame_count & (interval-1)) )
2525 uint8_t itf = TU_U16_LOW(p_request->
wIndex);
2532 uint8_t entityID = TU_U16_HIGH(p_request->
wIndex);
2550 uint8_t ep = TU_U16_LOW(p_request->
wIndex);
2558 default: TU_LOG2(
" Unsupported recipient: %d\r\n", p_request->
bmRequestType_bit.recipient); TU_BREAKPOINT();
return false;
2567#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
2571 uint8_t entityID = TU_U16_HIGH(p_request->
wIndex);
2572 uint8_t ctrlSel = TU_U16_HIGH(p_request->
wValue);
2592 uint8_t
const *p_desc_end = audio->
p_desc + audio->
desc_length - TUD_AUDIO_DESC_IAD_LEN;
2600 while (p_desc_end - p_desc > 0)
2608 *pp_desc_int = p_desc;
2627 for (i = 0; i < CFG_TUD_AUDIO; i++)
2643 for (i = 0; i < CFG_TUD_AUDIO; i++)
2654 while (p_desc_end - p_desc > 0)
2656 if (p_desc[3] == entityID)
2671 for (i = 0; i < CFG_TUD_AUDIO; i++)
2679 while (p_desc_end - p_desc > 0)
2696 for (i = 0; i < CFG_TUD_AUDIO; i++)
2708 while (p_desc_end - p_desc > 0)
2722#if (CFG_TUD_AUDIO_ENABLE_EP_IN && (CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL || CFG_TUD_AUDIO_ENABLE_ENCODING)) || (CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING)
2728#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_EP_OUT
2731#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_AUDIO_ENABLE_EP_OUT
2734#if !CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_EP_OUT
2740 while (p_desc_end - p_desc > 0)
2748#if CFG_TUD_AUDIO_ENABLE_EP_IN
2754#if CFG_TUD_AUDIO_ENABLE_TYPE_I_ENCODING
2760#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING
2765#if CFG_TUD_AUDIO_ENABLE_TYPE_I_DECODING
2773#if CFG_TUD_AUDIO_ENABLE_TYPE_I_ENCODING || CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL || CFG_TUD_AUDIO_ENABLE_TYPE_I_DECODING
2776#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_EP_OUT
2779#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_AUDIO_ENABLE_EP_OUT
2782#if !CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_ENABLE_EP_OUT
2786#if CFG_TUD_AUDIO_ENABLE_EP_IN
2793#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_DECODING
2809#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
2829 TU_ASSERT(packet_sz_tx_max <= audio->ep_in_sz);
2832 if (sample_reminder)
2850static uint16_t
audiod_tx_packet_size(
const uint16_t* norminal_size, uint16_t data_count, uint16_t fifo_depth, uint16_t max_depth)
2853 if(norminal_size[1] && norminal_size[1] <= fifo_depth * 4)
2856 static int ctrl_blackout = 0;
2857 uint16_t packet_size;
2858 uint16_t slot_size = norminal_size[2] - norminal_size[1];
2859 if (data_count < norminal_size[0])
2864 if (data_count < fifo_depth / 2 - slot_size && !ctrl_blackout)
2866 packet_size = norminal_size[0];
2869 if (data_count > fifo_depth / 2 + slot_size && !ctrl_blackout)
2871 packet_size = norminal_size[2];
2872 if(norminal_size[0] == norminal_size[1])
2883 packet_size = norminal_size[1];
2890 return tu_min16(packet_size, max_depth);
2893 return tu_min16(data_count, max_depth);
2902 for (uint8_t cnt=0; cnt < CFG_TUD_AUDIO; cnt++)
static uint8_t tu_desc_subtype(void const *desc)
tu_static osal_mutex_def_t ep_in_ff_mutex_wr_2
static bool audiod_get_AS_interface_index_global(uint8_t itf, uint8_t *func_id, uint8_t *idxItf, uint8_t const **pp_desc_int)
tu_static CFG_TUSB_MEM_ALIGN uint8_t tx_supp_ff_buf_2[CFG_TUD_AUDIO_FUNC_2_N_TX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_2_TX_SUPP_SW_FIFO_SZ]
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t ctrl_buf_3[CFG_TUD_AUDIO_FUNC_3_CTRL_BUF_SZ]
tu_static osal_mutex_def_t rx_supp_ff_mutex_rd_3[CFG_TUD_AUDIO_FUNC_3_N_RX_SUPP_SW_FIFO]
static uint8_t audiod_get_audio_fct_idx(audiod_function_t *audio)
static bool audiod_control_request(uint8_t rhport, tusb_control_request_t const *p_request)
static bool audiod_control_complete(uint8_t rhport, tusb_control_request_t const *p_request)
static bool audiod_tx_done_cb(uint8_t rhport, audiod_function_t *audio)
static uint16_t audiod_encode_type_I_pcm(uint8_t rhport, audiod_function_t *audio)
tu_static tu_fifo_t tx_supp_ff_3[CFG_TUD_AUDIO_FUNC_3_N_TX_SUPP_SW_FIFO]
static bool audiod_rx_done_cb(uint8_t rhport, audiod_function_t *audio, uint16_t n_bytes_received)
static void audiod_fb_fifo_count_update(audiod_function_t *audio, uint16_t lvl_new)
tu_static uint8_t alt_setting_3[CFG_TUD_AUDIO_FUNC_3_N_AS_INT]
tu_static osal_mutex_def_t ep_in_ff_mutex_wr_3
tu_static CFG_TUSB_MEM_ALIGN uint8_t tx_supp_ff_buf_1[CFG_TUD_AUDIO_FUNC_1_N_TX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_1_TX_SUPP_SW_FIFO_SZ]
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t lin_buf_in_1[CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX]
tu_static CFG_TUSB_MEM_ALIGN uint8_t rx_supp_ff_buf_2[CFG_TUD_AUDIO_FUNC_2_N_RX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_2_RX_SUPP_SW_FIFO_SZ]
tu_static IN_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t audio_ep_in_sw_buf_2[CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ]
tu_static osal_mutex_def_t tx_supp_ff_mutex_wr_3[CFG_TUD_AUDIO_FUNC_3_N_TX_SUPP_SW_FIFO]
static bool audiod_verify_itf_exists(uint8_t itf, uint8_t *func_id)
static bool audiod_calc_tx_packet_sz(audiod_function_t *audio)
tu_static OUT_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t audio_ep_out_sw_buf_3[CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ]
tu_static OUT_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t audio_ep_out_sw_buf_1[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ]
tu_static tu_fifo_t rx_supp_ff_2[CFG_TUD_AUDIO_FUNC_2_N_RX_SUPP_SW_FIFO]
tu_static CFG_TUSB_MEM_ALIGN uint8_t rx_supp_ff_buf_3[CFG_TUD_AUDIO_FUNC_3_N_RX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_3_RX_SUPP_SW_FIFO_SZ]
static bool audiod_verify_ep_exists(uint8_t ep, uint8_t *func_id)
static bool audiod_fb_send(audiod_function_t *audio)
tu_static IN_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t audio_ep_in_sw_buf_3[CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ]
static bool audiod_set_interface(uint8_t rhport, tusb_control_request_t const *p_request)
tu_static CFG_TUSB_MEM_ALIGN uint8_t tx_supp_ff_buf_3[CFG_TUD_AUDIO_FUNC_3_N_TX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_3_TX_SUPP_SW_FIFO_SZ]
tu_static tu_fifo_t rx_supp_ff_1[CFG_TUD_AUDIO_FUNC_1_N_RX_SUPP_SW_FIFO]
tu_static osal_mutex_def_t ep_in_ff_mutex_wr_1
tu_static uint8_t alt_setting_1[CFG_TUD_AUDIO_FUNC_1_N_AS_INT]
tu_static tu_fifo_t tx_supp_ff_2[CFG_TUD_AUDIO_FUNC_2_N_TX_SUPP_SW_FIFO]
tu_static osal_mutex_def_t rx_supp_ff_mutex_rd_1[CFG_TUD_AUDIO_FUNC_1_N_RX_SUPP_SW_FIFO]
tu_static CFG_TUD_MEM_SECTION audiod_function_t _audiod_fct[CFG_TUD_AUDIO]
tu_static osal_mutex_def_t ep_out_ff_mutex_rd_1
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t lin_buf_in_2[CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX]
static bool audiod_get_interface(uint8_t rhport, tusb_control_request_t const *p_request)
static bool audiod_get_AS_interface_index(uint8_t itf, audiod_function_t *audio, uint8_t *idxItf, uint8_t const **pp_desc_int)
tu_static tu_fifo_t tx_supp_ff_1[CFG_TUD_AUDIO_FUNC_1_N_TX_SUPP_SW_FIFO]
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t ctrl_buf_2[CFG_TUD_AUDIO_FUNC_2_CTRL_BUF_SZ]
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t lin_buf_in_3[CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX]
tu_static tu_fifo_t rx_supp_ff_3[CFG_TUD_AUDIO_FUNC_3_N_RX_SUPP_SW_FIFO]
tu_static CFG_TUSB_MEM_ALIGN uint8_t rx_supp_ff_buf_1[CFG_TUD_AUDIO_FUNC_1_N_RX_SUPP_SW_FIFO][CFG_TUD_AUDIO_FUNC_1_RX_SUPP_SW_FIFO_SZ]
tu_static OUT_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t audio_ep_out_sw_buf_2[CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ]
tu_static uint8_t alt_setting_2[CFG_TUD_AUDIO_FUNC_2_N_AS_INT]
static uint16_t audiod_tx_packet_size(const uint16_t *norminal_size, uint16_t data_count, uint16_t fifo_depth, uint16_t max_size)
static void * audiod_interleaved_copy_bytes_fast_encode(uint16_t const nBytesPerSample, void *src, const void *src_end, void *dst, uint8_t const n_ff_used)
static void * audiod_interleaved_copy_bytes_fast_decode(uint16_t const nBytesPerSample, void *dst, const void *dst_end, void *src, uint8_t const n_ff_used)
tu_static osal_mutex_def_t tx_supp_ff_mutex_wr_1[CFG_TUD_AUDIO_FUNC_1_N_TX_SUPP_SW_FIFO]
tu_static IN_SW_BUF_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t audio_ep_in_sw_buf_1[CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ]
static bool audiod_verify_entity_exists(uint8_t itf, uint8_t entityID, uint8_t *func_id)
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t ctrl_buf_1[CFG_TUD_AUDIO_FUNC_1_CTRL_BUF_SZ]
tu_static osal_mutex_def_t tx_supp_ff_mutex_wr_2[CFG_TUD_AUDIO_FUNC_2_N_TX_SUPP_SW_FIFO]
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t lin_buf_out_1[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX]
tu_static osal_mutex_def_t rx_supp_ff_mutex_rd_2[CFG_TUD_AUDIO_FUNC_2_N_RX_SUPP_SW_FIFO]
static void audiod_parse_for_AS_params(audiod_function_t *audio, uint8_t const *p_desc, uint8_t const *p_desc_end, uint8_t const as_itf)
tu_static osal_mutex_def_t ep_out_ff_mutex_rd_3
static bool audiod_decode_type_I_pcm(uint8_t rhport, audiod_function_t *audio, uint16_t n_bytes_received)
static bool audiod_set_fb_params_freq(audiod_function_t *audio, uint32_t sample_freq, uint32_t mclk_freq)
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t lin_buf_out_3[CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX]
tu_static osal_mutex_def_t ep_out_ff_mutex_rd_2
tu_static CFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN uint8_t lin_buf_out_2[CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX]
static usb_descriptor_buffers_t desc
uint16_t audiod_open(uint8_t rhport, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
TU_ATTR_FAST_FUNC void audiod_sof_isr(uint8_t rhport, uint32_t frame_count)
TU_ATTR_WEAK void tud_audio_int_done_cb(uint8_t rhport)
bool tud_audio_buffer_and_schedule_control_xfer(uint8_t rhport, tusb_control_request_t const *p_request, void *data, uint16_t len)
bool audiod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request)
bool tud_audio_int_n_write(uint8_t func_id, const audio_interrupt_data_t *data)
TU_ATTR_WEAK bool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request)
TU_ATTR_WEAK bool tud_audio_rx_done_post_read_cb(uint8_t rhport, uint16_t n_bytes_received, uint8_t func_id, uint8_t ep_out, uint8_t cur_alt_setting)
bool audiod_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
TU_ATTR_WEAK bool tud_audio_tx_done_pre_load_cb(uint8_t rhport, uint8_t func_id, uint8_t ep_in, uint8_t cur_alt_setting)
TU_ATTR_WEAK bool tud_audio_tx_done_post_load_cb(uint8_t rhport, uint16_t n_bytes_copied, uint8_t func_id, uint8_t ep_in, uint8_t cur_alt_setting)
TU_ATTR_WEAK void tud_audio_fb_done_cb(uint8_t func_id)
TU_ATTR_WEAK bool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request)
tu_fifo_t * tud_audio_n_get_ep_out_ff(uint8_t func_id)
uint16_t tud_audio_n_available_support_ff(uint8_t func_id, uint8_t ff_idx)
uint16_t tud_audio_n_read(uint8_t func_id, void *buffer, uint16_t bufsize)
bool tud_audio_n_fb_set(uint8_t func_id, uint32_t feedback)
tu_fifo_t * tud_audio_n_get_rx_support_ff(uint8_t func_id, uint8_t ff_idx)
tu_fifo_t * tud_audio_n_get_ep_in_ff(uint8_t func_id)
bool tud_audio_n_clear_ep_in_ff(uint8_t func_id)
TU_ATTR_WEAK TU_ATTR_FAST_FUNC void tud_audio_feedback_interval_isr(uint8_t func_id, uint32_t frame_number, uint8_t interval_shift)
uint16_t tud_audio_n_write(uint8_t func_id, const void *data, uint16_t len)
Write data to EP in buffer.
void audiod_reset(uint8_t rhport)
uint16_t tud_audio_n_write_support_ff(uint8_t func_id, uint8_t ff_idx, const void *data, uint16_t len)
TU_ATTR_WEAK bool tud_audio_rx_done_pre_read_cb(uint8_t rhport, uint16_t n_bytes_received, uint8_t func_id, uint8_t ep_out, uint8_t cur_alt_setting)
TU_ATTR_WEAK void tud_audio_feedback_params_cb(uint8_t func_id, uint8_t alt_itf, audio_feedback_params_t *feedback_param)
uint32_t tud_audio_feedback_update(uint8_t func_id, uint32_t cycles)
tu_fifo_t * tud_audio_n_get_tx_support_ff(uint8_t func_id, uint8_t ff_idx)
TU_ATTR_WEAK bool tud_audio_feedback_format_correction_cb(uint8_t func_id)
TU_ATTR_WEAK bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request)
TU_ATTR_WEAK bool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff)
bool tud_audio_n_clear_tx_support_ff(uint8_t func_id, uint8_t ff_idx)
bool tud_audio_n_clear_ep_out_ff(uint8_t func_id)
bool tud_audio_n_clear_rx_support_ff(uint8_t func_id, uint8_t ff_idx)
uint16_t tud_audio_n_flush_tx_support_ff(uint8_t func_id)
uint16_t tud_audio_n_available(uint8_t func_id)
TU_ATTR_WEAK bool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request)
TU_ATTR_WEAK bool tud_audio_set_itf_close_EP_cb(uint8_t rhport, tusb_control_request_t const *p_request)
uint16_t tud_audio_n_read_support_ff(uint8_t func_id, uint8_t ff_idx, void *buffer, uint16_t bufsize)
bool tud_audio_n_mounted(uint8_t func_id)
TU_ATTR_WEAK bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff)
TU_ATTR_WEAK bool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff)
@ AUDIO_FEEDBACK_METHOD_FIFO_COUNT
@ AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED
@ AUDIO_FEEDBACK_METHOD_DISABLED
@ AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2
@ AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT
audio_data_format_type_I_t
audio_format_type_t
Rest is yet to be implemented.
@ AUDIO_CS_AS_INTERFACE_FORMAT_TYPE
@ AUDIO_CS_AS_INTERFACE_AS_GENERAL
@ AUDIO_CS_AC_INTERFACE_OUTPUT_TERMINAL
@ AUDIO_DATA_FORMAT_TYPE_I_PCM
@ AUDIO_SUBCLASS_CONTROL
Audio Control.
@ AUDIO_TERM_TYPE_USB_STREAMING
@ AUDIO_INT_PROTOCOL_CODE_V2
Version 2.0.
@ AUDIO_FORMAT_TYPE_UNDEFINED
StaticSemaphore_t osal_mutex_def_t
static TU_ATTR_ALWAYS_INLINE osal_mutex_t osal_mutex_create(osal_mutex_def_t *mdef)
AUDIO Channel Cluster Descriptor (4.1)
struct TU_ATTR_PACKED::@16::TU_ATTR_PACKED bmRequestType_bit
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
uint8_t bInterfaceClass
Class code (assigned by the USB-IF).
uint8_t bInterfaceSubClass
Subclass code (assigned by the USB-IF). These codes are qualified by the value of the bInterfaceCla...
uint8_t bRequest
Request type audio_cs_req_t.
uint8_t bNumEndpoints
Number of endpoints used by this interface (excluding endpoint zero). If this value is zero,...
uint8_t bInterfaceProtocol
Protocol code (assigned by the USB). These codes are qualified by the value of the bInterfaceClass ...
uint8_t bAlternateSetting
Value used to select this alternate setting for the interface identified in the prior field.
struct audio_feedback_params_t::@1::@3 frequency
uint8_t n_channels_per_ff_rx
struct audiod_function_t::@4 feedback
uint16_t tx_supp_ff_sz_max
audio_format_type_t format_type_tx
uint8_t n_bytes_per_sample_tx
audio_data_format_type_I_t format_type_I_rx
CFG_TUSB_MEM_ALIGN uint32_t send_buf
uint16_t rx_supp_ff_sz_max
struct audiod_function_t::@4::@6::@8 fifo_count
audio_format_type_t format_type_rx
uint8_t n_bytes_per_sample_rx
uint8_t ep_in_as_intf_num
struct audiod_function_t::@4::@6::@7 fixed
uint8_t n_channels_per_ff_tx
union audiod_function_t::@4::@6 compute
uint8_t ep_out_as_intf_num
audio_data_format_type_I_t format_type_I_tx
static TU_ATTR_ALWAYS_INLINE uint8_t tu_u16_low(uint16_t ui16)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
static bool tu_is_power_of_two(uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_unaligned_read32(const void *mem)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_unaligned_read16(const void *mem)
static TU_ATTR_ALWAYS_INLINE int tu_memcpy_s(void *dest, size_t destsz, const void *src, size_t count)
static uint8_t tu_log2(uint32_t value)
uint16_t tu_fifo_count(tu_fifo_t *f)
Get number of items in FIFO.
void tu_fifo_get_write_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info)
Get linear write info.
bool tu_fifo_config(tu_fifo_t *f, void *buffer, uint16_t depth, uint16_t item_size, bool overwritable)
uint16_t tu_fifo_write_n(tu_fifo_t *f, const void *data, uint16_t n)
This function will write n elements into the array index specified by the write pointer and increment...
void tu_fifo_advance_write_pointer(tu_fifo_t *f, uint16_t n)
Advance write pointer - intended to be used in combination with DMA. It is possible to fill the FIFO ...
uint16_t tu_fifo_read_n(tu_fifo_t *f, void *buffer, uint16_t n)
This function will read n elements from the array index specified by the read pointer and increment t...
void tu_fifo_advance_read_pointer(tu_fifo_t *f, uint16_t n)
Advance read pointer - intended to be used in combination with DMA. It is possible to read from the F...
void tu_fifo_get_read_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info)
Get read info.
bool tu_fifo_clear(tu_fifo_t *f)
Clear the fifo read and write pointers.
static TU_ATTR_ALWAYS_INLINE uint16_t tu_fifo_depth(tu_fifo_t *f)
static TU_ATTR_ALWAYS_INLINE void tu_fifo_config_mutex(tu_fifo_t *f, osal_mutex_t wr_mutex, osal_mutex_t rd_mutex)
@ TUSB_REQ_RCPT_INTERFACE
static TU_ATTR_ALWAYS_INLINE uint16_t tu_edpt_packet_size(tusb_desc_endpoint_t const *desc_ep)
TU_ATTR_PACKED_END TU_ATTR_BIT_FIELD_ORDER_END static TU_ATTR_ALWAYS_INLINE tusb_dir_t tu_edpt_dir(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_desc_type(void const *desc)
static TU_ATTR_ALWAYS_INLINE uint8_t const * tu_desc_next(void const *desc)
void usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr)
tusb_speed_t tud_speed_get(void)
bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
bool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep)
bool usbd_edpt_claim(uint8_t rhport, uint8_t ep_addr)
bool usbd_edpt_busy(uint8_t rhport, uint8_t ep_addr)
bool usbd_edpt_release(uint8_t rhport, uint8_t ep_addr)
bool usbd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes)
void usbd_sof_enable(uint8_t rhport, sof_consumer_t consumer, bool en)
bool usbd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep)
bool usbd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size)
bool tud_control_xfer(uint8_t rhport, tusb_control_request_t const *request, void *buffer, uint16_t len)
bool tud_control_status(uint8_t rhport, tusb_control_request_t const *request)
CFG_TUH_MEM_ALIGN tusb_control_request_t request