1 /*
2  * Copyright (c) 2015 - 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #ifndef __USB_DEVICE_AUDIO_H__
10 #define __USB_DEVICE_AUDIO_H__
11 
12 /*!
13  * @addtogroup usb_device_audio_drv
14  * @{
15  */
16 
17 /*******************************************************************************
18  * Definitions
19  ******************************************************************************/
20 /*!
21  * @name USB Audio class codes
22  * @{
23  */
24 
25 /*! @brief Audio device class code */
26 #define USB_DEVICE_CONFIG_AUDIO_CLASS_CODE (0x01U)
27 
28 /*! @brief Audio device subclass code */
29 #define USB_DEVICE_AUDIO_STREAM_SUBCLASS  (0x02U)
30 #define USB_DEVICE_AUDIO_CONTROL_SUBCLASS (0x01U)
31 
32 /*! @brief Audio device class-specific descriptor type */
33 #define USB_DESCRIPTOR_TYPE_AUDIO_CS_INTERFACE (0x24U)
34 #define USB_DESCRIPTOR_TYPE_AUDIO_CS_ENDPOINT  (0x25U)
35 
36 /*! @brief Audio device class-specific control interface descriptor subtype */
37 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_HEADER          (0x01U)
38 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_INPUT_TERMINAL  (0x02U)
39 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_OUTPUT_TERMINAL (0x03U)
40 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_MIXER_UNIT      (0x04U)
41 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_SELECTOR_UNIT   (0x05U)
42 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_FEATURE_UNIT    (0x06U)
43 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
44 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_EFFECT_UNIT                (0x07U)
45 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_PROCESSING_UNIT_AUDIO20    (0x08U)
46 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_EXTENSION_UNIT_AUDIO20     (0x09U)
47 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_CLOCK_SOURCE_UNIT          (0x0AU)
48 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_CLOCK_SELECTOR_UNIT        (0x0BU)
49 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_CLOCK_MULTIPLIER_UNIT      (0x0CU)
50 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_SAMPLE_RATE_CONVERTER_UNIT (0x0DU)
51 #else
52 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_PROCESSING_UNIT (0x07U)
53 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_CONTROL_EXTENSION_UNIT  (0x08U)
54 #endif
55 
56 /*! @brief Audio device class-specific control interface effect unit effect type */
57 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
58 #define USB_DESCRIPTOR_AUDIO_CONTROL_EFFECT_UNIT_UNDEFINED_TYPE               (0x00U)
59 #define USB_DESCRIPTOR_AUDIO_CONTROL_EFFECT_UNIT_PARAM_EQ_SECTION_EFFECT_TYPE (0x01U)
60 #define USB_DESCRIPTOR_AUDIO_CONTROL_EFFECT_UNIT_REVERBERATION_EFFECT_TYPE    (0x02U)
61 #define USB_DESCRIPTOR_AUDIO_CONTROL_EFFECT_UNIT_MOD_DELAY_EFFECT_TYPE        (0x03U)
62 #define USB_DESCRIPTOR_AUDIO_CONTROL_EFFECT_UNIT_DYN_RANGE_COMP_EFFECT_TYPE   (0x04U)
63 #endif
64 
65 /*! @brief Audio device class-specific control interface processing unit process type */
66 #define USB_DESCRIPTOR_AUDIO_CONTROL_PROCESSING_UNIT_UPDOWNMIX_PROCESS_TYPE       (0x01U)
67 #define USB_DESCRIPTOR_AUDIO_CONTROL_PROCESSING_UNIT_DOLBY_PROLOGIC_PROCESS_TYPE  (0x02U)
68 #define USB_DESCRIPTOR_AUDIO_CONTROL_PROCESSING_UNIT_STEREO_EXTENDER_PROCESS_TYPE (0x03U)
69 #if (!USB_DEVICE_CONFIG_AUDIO_CLASS_2_0) /* used by usb audio 1.0 */
70 #define USB_DESCRIPTOR_AUDIO_CONTROL_PROCESSING_UNIT_REVERBERATION_PROCESS_TYPE  (0x04U)
71 #define USB_DESCRIPTOR_AUDIO_CONTROL_PROCESSING_UNIT_CHORUS_PROCESS_TYPE         (0x05U)
72 #define USB_DESCRIPTOR_AUDIO_CONTROL_PROCESSING_UNIT_DYN_RANGE_COMP_PROCESS_TYPE (0x06U)
73 #endif
74 
75 /*! @brief Audio device class-specific stream interface descriptor subtype */
76 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_AS_GENERAL  (0x01U)
77 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_FORMAT_TYPE (0x02U)
78 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
79 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_ENCODER (0x03U)
80 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_DECODER (0x04U)
81 #else
82 #define USB_DESCRIPTOR_SUBTYPE_AUDIO_STREAMING_FORMAT_SPECIFIC (0x03U)
83 #endif
84 
85 /*! @brief Audio device Format Type Codes */
86 #define USB_AUDIO_FORMAT_TYPE_UNDEFINED (0x00U)
87 #define USB_AUDIO_FORMAT_TYPE_I         (0x01U)
88 #define USB_AUDIO_FORMAT_TYPE_II        (0x02U)
89 #define USB_AUDIO_FORMAT_TYPE_III       (0x03U)
90 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
91 #define USB_AUDIO_FORMAT_TYPE_IV             (0x04U)
92 #define USB_AUDIO_FORMAT_EXT_FORMAT_TYPE_I   (0x81U)
93 #define USB_AUDIO_FORMAT_EXT_FORMAT_TYPE_II  (0x82U)
94 #define USB_AUDIO_FORMAT_EXT_FORMAT_TYPE_III (0x83U)
95 #endif
96 
97 /*! @brief Audio device class-specific stream interface Encoder/Decoder Type Codes */
98 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
99 #define USB_DESCRIPTOR_AUDIO_STREAM_ENCODER_UNDEFINED     (0x00U)
100 #define USB_DESCRIPTOR_AUDIO_STREAM_ENCODER_OTHER_ENCODER (0x01U)
101 #define USB_DESCRIPTOR_AUDIO_STREAM_ENCODER_MPEG_ENCODER  (0x02U)
102 #define USB_DESCRIPTOR_AUDIO_STREAM_ENCODER_AC3_ENCODER   (0x03U)
103 #define USB_DESCRIPTOR_AUDIO_STREAM_ENCODER_WMA_ENCODER   (0x04U)
104 #define USB_DESCRIPTOR_AUDIO_STREAM_ENCODER_DTS_ENCODER   (0x05U)
105 
106 #define USB_DESCRIPTOR_AUDIO_STREAM_DECODER_UNDEFINED     (0x00U)
107 #define USB_DESCRIPTOR_AUDIO_STREAM_DECODER_OTHER_DECODER (0x01U)
108 #define USB_DESCRIPTOR_AUDIO_STREAM_DECODER_MPEG_DECODER  (0x02U)
109 #define USB_DESCRIPTOR_AUDIO_STREAM_DECODER_AC3_DECODER   (0x03U)
110 #define USB_DESCRIPTOR_AUDIO_STREAM_DECODER_WMA_DECODER   (0x04U)
111 #define USB_DESCRIPTOR_AUDIO_STREAM_DECODER_DTS_DECODER   (0x05U)
112 #endif
113 
114 /*! @brief Commands for USB device AUDIO Class specific request codes */
115 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
116 #define USB_DEVICE_AUDIO_CUR_REQUEST   (0x01U)
117 #define USB_DEVICE_AUDIO_RANGE_REQUEST (0x02U)
118 #define USB_DEVICE_AUDIO_MEM_REQUEST   (0x03U)
119 #else
120 #define USB_DEVICE_AUDIO_SET_CUR_REQUEST (0x01U)
121 #define USB_DEVICE_AUDIO_GET_CUR_REQUEST (0x81U)
122 #define USB_DEVICE_AUDIO_SET_MIN_REQUEST (0x02U)
123 #define USB_DEVICE_AUDIO_GET_MIN_REQUEST (0x82U)
124 #define USB_DEVICE_AUDIO_SET_MAX_REQUEST (0x03U)
125 #define USB_DEVICE_AUDIO_GET_MAX_REQUEST (0x83U)
126 #define USB_DEVICE_AUDIO_SET_RES_REQUEST (0x04U)
127 #define USB_DEVICE_AUDIO_GET_RES_REQUEST (0x84U)
128 #define USB_DEVICE_AUDIO_SET_MEM_REQUEST (0x05U)
129 #define USB_DEVICE_AUDIO_GET_MEM_REQUEST (0x85U)
130 #endif
131 
132 /*! @brief Commands for USB device AUDIO control feature unit control selector */
133 #define USB_DEVICE_AUDIO_FU_MUTE_CONTROL_SELECTOR              (0x01U)
134 #define USB_DEVICE_AUDIO_FU_VOLUME_CONTROL_SELECTOR            (0x02U)
135 #define USB_DEVICE_AUDIO_FU_BASS_CONTROL_SELECTOR              (0x03U)
136 #define USB_DEVICE_AUDIO_FU_MID_CONTROL_SELECTOR               (0x04U)
137 #define USB_DEVICE_AUDIO_FU_TREBLE_CONTROL_SELECTOR            (0x05U)
138 #define USB_DEVICE_AUDIO_FU_GRAPHIC_EQUALIZER_CONTROL_SELECTOR (0x06U)
139 #define USB_DEVICE_AUDIO_FU_AUTOMATIC_GAIN_CONTROL_SELECTOR    (0x07U)
140 #define USB_DEVICE_AUDIO_FU_DELAY_CONTROL_SELECTOR             (0x08U)
141 #define USB_DEVICE_AUDIO_FU_BASS_BOOST_CONTROL_SELECTOR        (0x09U)
142 #define USB_DEVICE_AUDIO_FU_LOUDNESS_CONTROL_SELECTOR          (0x0AU)
143 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
144 #define USB_DEVICE_AUDIO_FU_INPUT_GAIN_CONTROL_SELECTOR     (0x0BU)
145 #define USB_DEVICE_AUDIO_FU_INPUT_GAIN_PAD_CONTROL_SELECTOR (0x0CU)
146 #define USB_DEVICE_AUDIO_FU_PHASE_INVERTER_CONTROL_SELECTOR (0x0DU)
147 #define USB_DEVICE_AUDIO_FU_UNDERFLOW_CONTROL_SELECTOR      (0x0EU)
148 #define USB_DEVICE_AUDIO_FU_OVERFLOW_CONTROL_SELECTOR       (0x0FU)
149 #define USB_DEVICE_AUDIO_FU_LATENCY_CONTROL_SELECTOR        (0x10U)
150 #endif
151 
152 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
153 /*! @brief Commands for USB device AUDIO control Parametric Equalizer Section Effect Unit Control Selectors  */
154 #define USB_DEVICE_AUDIO_EU_PE_ENABLE_CONTROL     (0x01U)
155 #define USB_DEVICE_AUDIO_EU_PE_CENTERFREQ_CONTROL (0x02U)
156 #define USB_DEVICE_AUDIO_EU_PE_QFACTOR_CONTROL    (0x03U)
157 #define USB_DEVICE_AUDIO_EU_PE_GAIN_CONTROL       (0x04U)
158 #define USB_DEVICE_AUDIO_EU_PE_UNDERFLOW_CONTROL  (0x05U)
159 #define USB_DEVICE_AUDIO_EU_PE_OVERFLOW_CONTROL   (0x06U)
160 #define USB_DEVICE_AUDIO_EU_PE_LATENCY_CONTROL    (0x07U)
161 
162 /*! @brief Commands for USB device AUDIO control Reverberation Effect Unit Control Selectors Control Selectors  */
163 #define USB_DEVICE_AUDIO_EU_RV_ENABLE_CONTROL            (0x01U)
164 #define USB_DEVICE_AUDIO_EU_RV_TYPE_CONTROL              (0x02U)
165 #define USB_DEVICE_AUDIO_EU_RV_LEVEL_CONTROL             (0x03U)
166 #define USB_DEVICE_AUDIO_EU_RV_TIME_CONTROL              (0x04U)
167 #define USB_DEVICE_AUDIO_EU_RV_FEEDBACK_CONTROL          (0x05U)
168 #define USB_DEVICE_AUDIO_EU_RV_PREDELAY_CONTROL          (0x06U)
169 #define USB_DEVICE_AUDIO_EU_RV_DENSITY_CONTROL           (0x07U)
170 #define USB_DEVICE_AUDIO_EU_RV_RV_HIFREQ_ROLLOFF_CONTROL (0x08U)
171 #define USB_DEVICE_AUDIO_EU_RV_UNDERFLOW_CONTROL         (0x09U)
172 #define USB_DEVICE_AUDIO_EU_RV_OVERFLOW_CONTROL          (0x0AU)
173 #define USB_DEVICE_AUDIO_EU_RV_LATENCY_CONTROL           (0x0BU)
174 
175 /*! @brief Commands for USB device AUDIO control Modulation Delay Effect Unit Control Selectors  */
176 #define USB_DEVICE_AUDIO_EU_MD_ENABLE_CONTROL    (0x01U)
177 #define USB_DEVICE_AUDIO_EU_MD_BALANCE_CONTROL   (0x02U)
178 #define USB_DEVICE_AUDIO_EU_MD_RATE_CONTROL      (0x03U)
179 #define USB_DEVICE_AUDIO_EU_MD_DEPTH_CONTROL     (0x04U)
180 #define USB_DEVICE_AUDIO_EU_MD_TIME_CONTROL      (0x05U)
181 #define USB_DEVICE_AUDIO_EU_MD_FEEDBACK_CONTROL  (0x06U)
182 #define USB_DEVICE_AUDIO_EU_MD_UNDERFLOW_CONTROL (0x07U)
183 #define USB_DEVICE_AUDIO_EU_MD_OVERFLOW_CONTROL  (0x08U)
184 #define USB_DEVICE_AUDIO_EU_MD_LATENCY_CONTROL   (0x09U)
185 
186 /*! @brief Commands for USB device AUDIO control Dynamic Range Compressor Effect Unit Control Selectors */
187 #define USB_DEVICE_AUDIO_EU_DR_ENABLE_CONTROL           (0x01U)
188 #define USB_DEVICE_AUDIO_EU_DR_COMPRESSION_RATE_CONTROL (0x02U)
189 #define USB_DEVICE_AUDIO_EU_DR_MAXAMPL_CONTROL          (0x03U)
190 #define USB_DEVICE_AUDIO_EU_DR_THRESHOLD_CONTROL        (0x04U)
191 #define USB_DEVICE_AUDIO_EU_DR_ATTACK_TIME_CONTROL      (0x05U)
192 #define USB_DEVICE_AUDIO_EU_DR_RELEASE_TIME_CONTROL     (0x06U)
193 #define USB_DEVICE_AUDIO_EU_DR_UNDERFLOW_CONTROL        (0x07U)
194 #define USB_DEVICE_AUDIO_EU_DR_OVERFLOW_CONTROL         (0x08U)
195 #define USB_DEVICE_AUDIO_EU_DR_LATENCY_CONTROL          (0x09U)
196 #endif
197 
198 /*! @brief Commands for USB device AUDIO control Up/Down-mix Processing Unit Control Selectors */
199 #define USB_DEVICE_AUDIO_PU_UD_ENABLE_CONTROL      (0x01U)
200 #define USB_DEVICE_AUDIO_PU_UD_MODE_SELECT_CONTROL (0x02U)
201 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
202 #define USB_DEVICE_AUDIO_PU_UD_CLUSTER_CONTROL   (0x03U)
203 #define USB_DEVICE_AUDIO_PU_UD_UNDERFLOW_CONTROL (0x04U)
204 #define USB_DEVICE_AUDIO_PU_UD_OVERFLOW_CONTROL  (0x05U)
205 #define USB_DEVICE_AUDIO_PU_UD_LATENCY_CONTROL   (0x06U)
206 #endif
207 
208 /*! @brief Commands for USB device AUDIO control Dolby Prologic Processing Unit Control Selectors */
209 #define USB_DEVICE_AUDIO_PU_DP_ENABLE_CONTROL      (0x01U)
210 #define USB_DEVICE_AUDIO_PU_DP_MODE_SELECT_CONTROL (0x02U)
211 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
212 #define USB_DEVICE_AUDIO_PU_DP_CLUSTER_CONTROL   (0x03U)
213 #define USB_DEVICE_AUDIO_PU_DP_UNDERFLOW_CONTROL (0x04U)
214 #define USB_DEVICE_AUDIO_PU_DP_OVERFLOW_CONTROL  (0x05U)
215 #define USB_DEVICE_AUDIO_PU_DP_LATENCY_CONTROL   (0x06U)
216 #endif
217 
218 /*! @brief Commands for USB device AUDIO control (3D,audio 1.0) Stereo Extender Processing Unit Control Selectors */
219 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
220 #define USB_DEVICE_AUDIO_PU_ST_EXT_ENABLE_CONTROL    (0x01U)
221 #define USB_DEVICE_AUDIO_PU_ST_EXT_WIDTH_CONTROL     (0x02U)
222 #define USB_DEVICE_AUDIO_PU_ST_EXT_UNDERFLOW_CONTROL (0x03U)
223 #define USB_DEVICE_AUDIO_PU_ST_EXT_OVERFLOW_CONTROL  (0x04U)
224 #define USB_DEVICE_AUDIO_PU_ST_EXT_LATENCY_CONTROL   (0x05U)
225 #else
226 #define USB_DEVICE_AUDIO_PU_3D_ENABLE_CONTROL    (0x01U)
227 #define USB_DEVICE_AUDIO_PU_SPACIOUSNESS_CONTROL (0x03U)
228 #endif
229 
230 #if (!USB_DEVICE_CONFIG_AUDIO_CLASS_2_0) /* USB audio 1.0 */
231 /*! @brief Commands for USB device AUDIO control Reverberation Processing Unit Control Selectors */
232 #define USB_DEVICE_AUDIO_PU_RV_ENABLE_CONTROL   (0x01U)
233 #define USB_DEVICE_AUDIO_PU_RV_LEVEL_CONTROL    (0x02U)
234 #define USB_DEVICE_AUDIO_PU_RV_TIME_CONTROL     (0x03U)
235 #define USB_DEVICE_AUDIO_PU_RV_FEEDBACK_CONTROL (0x04U)
236 
237 /*! @brief Commands for USB device AUDIO control Chorus Processing Unit Control Selectors */
238 #define USB_DEVICE_AUDIO_PU_CH_ENABLE_CONTROL (0x01U)
239 #define USB_DEVICE_AUDIO_PU_CH_LEVEL_CONTROL  (0x02U)
240 #define USB_DEVICE_AUDIO_PU_CH_RATE_CONTROL   (0x03U)
241 #define USB_DEVICE_AUDIO_PU_CH_DEPTH_CONTROL  (0x04U)
242 
243 /*! @brief Commands for USB device AUDIO control Dynamic Range Compressor Processing Unit Control Selectors */
244 #define USB_DEVICE_AUDIO_PU_DR_ENABLE_CONTROL           (0x01U)
245 #define USB_DEVICE_AUDIO_PU_DR_COMPRESSION_RATE_CONTROL (0x02U)
246 #define USB_DEVICE_AUDIO_PU_DR_MAXAMPL_CONTROL          (0x03U)
247 #define USB_DEVICE_AUDIO_PU_DR_THRESHOLD_CONTROL        (0x04U)
248 #define USB_DEVICE_AUDIO_PU_DR_ATTACK_TIME              (0x05U)
249 #define USB_DEVICE_AUDIO_PU_DR_RELEASE_TIME             (0x06U)
250 #endif
251 
252 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
253 /*! @brief Commands for USB device AUDIO control clock source control selector */
254 #define USB_DEVICE_AUDIO_CS_CONTROL_UNDEFINED            (0x00U)
255 #define USB_DEVICE_AUDIO_CS_SAM_FREQ_CONTROL_SELECTOR    (0x01U)
256 #define USB_DEVICE_AUDIO_CS_CLOCK_VALID_CONTROL_SELECTOR (0x02U)
257 
258 /*! @brief Commands for USB device AUDIO control clock selector control selector */
259 #define USB_DEVICE_AUDIO_CX_CONTROL_UNDEFINED               (0x00U)
260 #define USB_DEVICE_AUDIO_CX_CLOCK_SELECTOR_CONTROL_SELECTOR (0x01U)
261 
262 /*! @brief Commands for USB device AUDIO control clock multiplier control selector */
263 #define USB_DEVICE_AUDIO_CM_CONTROL_UNDEFINED            (0x00U)
264 #define USB_DEVICE_AUDIO_CM_NUMERATOR_CONTROL_SELECTOR   (0x01U)
265 #define USB_DEVICE_AUDIO_CM_DENOMINATOR_CONTROL_SELECTOR (0x02U)
266 #endif
267 
268 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
269 /*! @brief Commands for USB device AUDIO streaming Interface Control Selectors */
270 #define USB_DEVICE_AUDIO_AS_ACT_ALT_SETTING_CONTROL   (0x01U)
271 #define USB_DEVICE_AUDIO_AS_VAL_ALT_SETTINGS_CONTROL  (0x02U)
272 #define USB_DEVICE_AUDIO_AS_AUDIO_DATA_FORMAT_CONTROL (0x03U)
273 
274 /*! @brief Commands for USB device AUDIO streaming Encoder control selector */
275 #define USB_DEVICE_AUDIO_EN_BIT_RATE_CONTROL      (0x01U)
276 #define USB_DEVICE_AUDIO_EN_QUALITY_CONTROL       (0x02U)
277 #define USB_DEVICE_AUDIO_EN_VBR_CONTROL           (0x03U)
278 #define USB_DEVICE_AUDIO_EN_TYPE_CONTROL          (0x04U)
279 #define USB_DEVICE_AUDIO_EN_UNDERFLOW_CONTROL     (0x05U)
280 #define USB_DEVICE_AUDIO_EN_OVERFLOW_CONTROL      (0x06U)
281 #define USB_DEVICE_AUDIO_EN_ENCODER_ERROR_CONTROL (0x07U)
282 #define USB_DEVICE_AUDIO_EN_PARAM1_CONTROL        (0x08U)
283 #define USB_DEVICE_AUDIO_EN_PARAM2_CONTROL        (0x09U)
284 #define USB_DEVICE_AUDIO_EN_PARAM3_CONTROL        (0x0AU)
285 #define USB_DEVICE_AUDIO_EN_PARAM4_CONTROL        (0x0BU)
286 #define USB_DEVICE_AUDIO_EN_PARAM5_CONTROL        (0x0CU)
287 #define USB_DEVICE_AUDIO_EN_PARAM6_CONTROL        (0x0DU)
288 #define USB_DEVICE_AUDIO_EN_PARAM7_CONTROL        (0x0EU)
289 #define USB_DEVICE_AUDIO_EN_PARAM8_CONTROL        (0x0FU)
290 
291 /*! @brief Commands for USB device AUDIO streaming MPEG Decoder control selector */
292 #define USB_DEVICE_AUDIO_MD_DUAL_CHANNEL_CONTROL  (0x01U)
293 #define USB_DEVICE_AUDIO_MD_SECOND_STEREO_CONTROL (0x02U)
294 #define USB_DEVICE_AUDIO_MD_MULTILINGUAL_CONTROL  (0x03U)
295 #define USB_DEVICE_AUDIO_MD_DYN_RANGE_CONTROL     (0x04U)
296 #define USB_DEVICE_AUDIO_MD_SCALING_CONTROL       (0x05U)
297 #define USB_DEVICE_AUDIO_MD_HILO_SCALING_CONTROL  (0x06U)
298 #define USB_DEVICE_AUDIO_MD_UNDERFLOW_CONTROL     (0x07U)
299 #define USB_DEVICE_AUDIO_MD_OVERFLOW_CONTROL      (0x08U)
300 #define USB_DEVICE_AUDIO_MD_DECODER_ERROR_CONTROL (0x09U)
301 
302 /*! @brief Commands for USB device AUDIO streaming AC-3 Decoder Control Selectors */
303 #define USB_DEVICE_AUDIO_AD_MODE_CONTROL          (0x01U)
304 #define USB_DEVICE_AUDIO_AD_DYN_RANGE_CONTROL     (0x02U)
305 #define USB_DEVICE_AUDIO_AD_SCALING_CONTROL       (0x03U)
306 #define USB_DEVICE_AUDIO_AD_HILO_SCALING_CONTROLL (0x04U)
307 #define USB_DEVICE_AUDIO_AD_UNDERFLOW_CONTROL     (0x05U)
308 #define USB_DEVICE_AUDIO_AD_OVERFLOW_CONTROL      (0x06U)
309 #define USB_DEVICE_AUDIO_AD_DECODER_ERROR_CONTROL (0x07U)
310 
311 /*! @brief Commands for USB device AUDIO streaming WMA Decoder Control Selectors */
312 #define USB_DEVICE_AUDIO_WD_UNDERFLOW_CONTROL     (0x01U)
313 #define USB_DEVICE_AUDIO_WD_OVERFLOW_CONTROL      (0x02U)
314 #define USB_DEVICE_AUDIO_WD_DECODER_ERROR_CONTROL (0x03U)
315 
316 /*! @brief Commands for USB device AUDIO streaming DTS Decoder Control Selectors */
317 #define USB_DEVICE_AUDIO_DD_UNDERFLOW_CONTROL     (0x01U)
318 #define USB_DEVICE_AUDIO_DD_OVERFLOW_CONTROL      (0x02U)
319 #define USB_DEVICE_AUDIO_DD_DECODER_ERROR_CONTROL (0x03U)
320 #endif
321 
322 #if (!USB_DEVICE_CONFIG_AUDIO_CLASS_2_0) /* USB audio 1.0 */
323 /*! @brief Commands for USB device AUDIO streaming MPEG control selector */
324 #define USB_DEVICE_AUDIO_MP_DUAL_CHANNEL_CONTROL  (0x01U)
325 #define USB_DEVICE_AUDIO_MP_SECOND_STEREO_CONTROL (0x02U)
326 #define USB_DEVICE_AUDIO_MP_MULTILINGUAL_CONTROL  (0x03U)
327 #define USB_DEVICE_AUDIO_MP_DYN_RANGE_CONTROL     (0x04U)
328 #define USB_DEVICE_AUDIO_MP_SCALING_CONTROL       (0x05U)
329 #define USB_DEVICE_AUDIO_MP_HILO_SCALING_CONTROL  (0x06U)
330 
331 /*! @brief Commands for USB device AUDIO streaming AC-3 Control Selectors */
332 #define USB_DEVICE_AUDIO_AC_MODE_CONTROL         (0x01U)
333 #define USB_DEVICE_AUDIO_AC_DYN_RANGE_CONTRO     (0x02U)
334 #define USB_DEVICE_AUDIO_AC_SCALING_CONTROL      (0x03U)
335 #define USB_DEVICE_AUDIO_AC_HILO_SCALING_CONTROL (0x04U)
336 #endif
337 
338 /*! @brief Commands for USB device AUDIO streaming endpoint control selector */
339 #define USB_DEVICE_AUDIO_EP_CONTROL_UNDEFINED (0x00U)
340 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
341 #define USB_DEVICE_AUDIO_EP_PITCH_CONTROL_SELECTOR_AUDIO20 (0x01U)
342 #define USB_DEVICE_AUDIO_EP_DATA_OVERRUN_CONTROL_SELECTOR  (0x02U)
343 #define USB_DEVICE_AUDIO_EP_DATA_UNDERRUN_CONTROL_SELECTOR (0x03U)
344 #else
345 #define USB_DEVICE_AUDIO_EP_SAMPLING_FREQ_CONTROL_SELECTOR (0x01U)
346 #define USB_DEVICE_AUDIO_EP_PITCH_CONTROL_SELECTOR         (0x02U)
347 #endif
348 
349 /* Commands for USB device AUDIO terminal control selector */
350 #define USB_DEVICE_AUDIO_TE_CONTROL_UNDEFINED    (0x00U)
351 #define USB_DEVICE_AUDIO_TE_COPY_PROTECT_CONTROL (0x01U)
352 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
353 #define USB_DEVICE_AUDIO_TE_CONNECTOR_CONTROL (0x02U)
354 #define USB_DEVICE_AUDIO_TE_OVERLOAD_CONTROL  (0x03U)
355 #define USB_DEVICE_AUDIO_TE_CLUSTER_CONTROL   (0x04U)
356 #define USB_DEVICE_AUDIO_TE_UNDERFLOW_CONTROL (0x05U)
357 #define USB_DEVICE_AUDIO_TE_OVERFLOW_CONTROL  (0x06U)
358 #define USB_DEVICE_AUDIO_TE_LATENCY_CONTROL   (0x07U)
359 #endif
360 
361 /*! @brief Audio device class-specific FU GET CUR COMMAND  */
362 #define USB_DEVICE_AUDIO_FU_GET_CUR_MUTE_CONTROL              (0x8101U)
363 #define USB_DEVICE_AUDIO_FU_GET_CUR_VOLUME_CONTROL            (0x8102U)
364 #define USB_DEVICE_AUDIO_FU_GET_CUR_BASS_CONTROL              (0x8103U)
365 #define USB_DEVICE_AUDIO_FU_GET_CUR_MID_CONTROL               (0x8104U)
366 #define USB_DEVICE_AUDIO_FU_GET_CUR_TREBLE_CONTROL            (0x8105U)
367 #define USB_DEVICE_AUDIO_FU_GET_CUR_GRAPHIC_EQUALIZER_CONTROL (0x8106U)
368 #define USB_DEVICE_AUDIO_FU_GET_CUR_AUTOMATIC_GAIN_CONTROL    (0x8107U)
369 #define USB_DEVICE_AUDIO_FU_GET_CUR_DELAY_CONTROL             (0x8108U)
370 #define USB_DEVICE_AUDIO_FU_GET_CUR_BASS_BOOST_CONTROL        (0x8109U)
371 #define USB_DEVICE_AUDIO_FU_GET_CUR_LOUDNESS_CONTROL          (0x810AU)
372 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
373 #define USB_DEVICE_AUDIO_FU_GET_CUR_UNDERFLOW_CONTROL (0x810EU)
374 #define USB_DEVICE_AUDIO_FU_GET_CUR_OVERFLOW_CONTROL  (0x810FU)
375 #endif
376 
377 /*! @brief Audio device class-specific FU GET MIN COMMAND  */
378 #define USB_DEVICE_AUDIO_FU_GET_MIN_VOLUME_CONTROL            (0x8202U)
379 #define USB_DEVICE_AUDIO_FU_GET_MIN_BASS_CONTROL              (0x8203U)
380 #define USB_DEVICE_AUDIO_FU_GET_MIN_MID_CONTROL               (0x8204U)
381 #define USB_DEVICE_AUDIO_FU_GET_MIN_TREBLE_CONTROL            (0x8205U)
382 #define USB_DEVICE_AUDIO_FU_GET_MIN_GRAPHIC_EQUALIZER_CONTROL (0x8206U)
383 #define USB_DEVICE_AUDIO_FU_GET_MIN_DELAY_CONTROL             (0x8208U)
384 
385 /*! @brief Audio device class-specific FU GET MAX COMMAND  */
386 #define USB_DEVICE_AUDIO_FU_GET_MAX_VOLUME_CONTROL            (0x8302U)
387 #define USB_DEVICE_AUDIO_FU_GET_MAX_BASS_CONTROL              (0x8303U)
388 #define USB_DEVICE_AUDIO_FU_GET_MAX_MID_CONTROL               (0x8304U)
389 #define USB_DEVICE_AUDIO_FU_GET_MAX_TREBLE_CONTROL            (0x8305U)
390 #define USB_DEVICE_AUDIO_FU_GET_MAX_GRAPHIC_EQUALIZER_CONTROL (0x8306U)
391 #define USB_DEVICE_AUDIO_FU_GET_MAX_DELAY_CONTROL             (0x8308U)
392 
393 /*! @brief Audio device class-specific FU GET RES COMMAND  */
394 #define USB_DEVICE_AUDIO_FU_GET_RES_VOLUME_CONTROL            (0x8402U)
395 #define USB_DEVICE_AUDIO_FU_GET_RES_BASS_CONTROL              (0x8403U)
396 #define USB_DEVICE_AUDIO_FU_GET_RES_MID_CONTROL               (0x8404U)
397 #define USB_DEVICE_AUDIO_FU_GET_RES_TREBLE_CONTROL            (0x8405U)
398 #define USB_DEVICE_AUDIO_FU_GET_RES_GRAPHIC_EQUALIZER_CONTROL (0x8406U)
399 #define USB_DEVICE_AUDIO_FU_GET_RES_DELAY_CONTROL             (0x8408U)
400 
401 /*! @brief Audio device class-specific FU SET CUR COMMAND  */
402 #define USB_DEVICE_AUDIO_FU_SET_CUR_MUTE_CONTROL              (0x0101U)
403 #define USB_DEVICE_AUDIO_FU_SET_CUR_VOLUME_CONTROL            (0x0102U)
404 #define USB_DEVICE_AUDIO_FU_SET_CUR_BASS_CONTROL              (0x0103U)
405 #define USB_DEVICE_AUDIO_FU_SET_CUR_MID_CONTROL               (0x0104U)
406 #define USB_DEVICE_AUDIO_FU_SET_CUR_TREBLE_CONTROL            (0x0105U)
407 #define USB_DEVICE_AUDIO_FU_SET_CUR_GRAPHIC_EQUALIZER_CONTROL (0x0106U)
408 #define USB_DEVICE_AUDIO_FU_SET_CUR_AUTOMATIC_GAIN_CONTROL    (0x0107U)
409 #define USB_DEVICE_AUDIO_FU_SET_CUR_DELAY_CONTROL             (0x0108U)
410 #define USB_DEVICE_AUDIO_FU_SET_CUR_BASS_BOOST_CONTROL        (0x0109U)
411 #define USB_DEVICE_AUDIO_FU_SET_CUR_LOUDNESS_CONTROL          (0x010AU)
412 
413 /*! @brief Audio device class-specific FU SET MIN COMMAND  */
414 #define USB_DEVICE_AUDIO_FU_SET_MIN_VOLUME_CONTROL            (0x0202U)
415 #define USB_DEVICE_AUDIO_FU_SET_MIN_BASS_CONTROL              (0x0203U)
416 #define USB_DEVICE_AUDIO_FU_SET_MIN_MID_CONTROL               (0x0204U)
417 #define USB_DEVICE_AUDIO_FU_SET_MIN_TREBLE_CONTROL            (0x0205U)
418 #define USB_DEVICE_AUDIO_FU_SET_MIN_GRAPHIC_EQUALIZER_CONTROL (0x0206U)
419 #define USB_DEVICE_AUDIO_FU_SET_MIN_DELAY_CONTROL             (0x0208U)
420 
421 /*! @brief Audio device class-specific FU SET MAX COMMAND  */
422 #define USB_DEVICE_AUDIO_FU_SET_MAX_VOLUME_CONTROL            (0x0302U)
423 #define USB_DEVICE_AUDIO_FU_SET_MAX_BASS_CONTROL              (0x0303U)
424 #define USB_DEVICE_AUDIO_FU_SET_MAX_MID_CONTROL               (0x0304U)
425 #define USB_DEVICE_AUDIO_FU_SET_MAX_TREBLE_CONTROL            (0x0305U)
426 #define USB_DEVICE_AUDIO_FU_SET_MAX_GRAPHIC_EQUALIZER_CONTROL (0x0306U)
427 #define USB_DEVICE_AUDIO_FU_SET_MAX_DELAY_CONTROL             (0x0308U)
428 
429 /*! @brief Audio device class-specific FU SET RES COMMAND  */
430 #define USB_DEVICE_AUDIO_FU_SET_RES_VOLUME_CONTROL            (0x0402U)
431 #define USB_DEVICE_AUDIO_FU_SET_RES_BASS_CONTROL              (0x0403U)
432 #define USB_DEVICE_AUDIO_FU_SET_RES_MID_CONTROL               (0x0404U)
433 #define USB_DEVICE_AUDIO_FU_SET_RES_TREBLE_CONTROL            (0x0405U)
434 #define USB_DEVICE_AUDIO_FU_SET_RES_GRAPHIC_EQUALIZER_CONTROL (0x0406U)
435 #define USB_DEVICE_AUDIO_FU_SET_RES_DELAY_CONTROL             (0x0408U)
436 
437 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0) /* Audio 2.0 FU : the following application command value is started from ox20 \
438                                          */
439 /*! @brief Audio device class-specific ENDP SET CUR COMMAND  */
440 #define USB_DEVICE_AUDIO_EP_SET_CUR_PITCH_CONTROL_AUDIO20 (0x0122U)
441 /*! @brief Audio device class-specific ENDP GET CUR COMMAND  */
442 #define USB_DEVICE_AUDIO_EP_GET_CUR_DATA_OVERRUN_CONTROL  (0x8121U)
443 #define USB_DEVICE_AUDIO_EP_GET_CUR_DATA_UNDERRUN_CONTROL (0x8122U)
444 #else
445 /*! @brief Audio device class-specific ENDP SET CUR COMMAND  */
446 #define USB_DEVICE_AUDIO_EP_SET_CUR_PITCH_CONTROL         (0x0120U)
447 #define USB_DEVICE_AUDIO_EP_SET_CUR_SAMPLING_FREQ_CONTROL (0x0121U)
448 
449 /*! @brief Audio device class-specific ENDP SET MIN COMMAND  */
450 #define USB_DEVICE_AUDIO_EP_SET_MIN_SAMPLING_FREQ_CONTROL (0x0220U)
451 
452 /*! @brief Audio device class-specific ENDP SET MAX COMMAND  */
453 #define USB_DEVICE_AUDIO_EP_SET_MAX_SAMPLING_FREQ_CONTROL (0x0320U)
454 
455 /*! @brief Audio device class-specific ENDP SET RES COMMAND  */
456 #define USB_DEVICE_AUDIO_EP_SET_RES_SAMPLING_FREQ_CONTROL (0x0420U)
457 
458 /*! @brief Audio device class-specific ENDP GET CUR COMMAND  */
459 #define USB_DEVICE_AUDIO_EP_GET_CUR_SAMPLING_FREQ_CONTROL (0x8120U)
460 
461 /*! @brief Audio device class-specific ENDP GET MIN COMMAND  */
462 #define USB_DEVICE_AUDIO_EP_GET_MIN_SAMPLING_FREQ_CONTROL (0x8220U)
463 
464 /*! @brief Audio device class-specific ENDP GET MAX COMMAND  */
465 #define USB_DEVICE_AUDIO_EP_GET_MAX_SAMPLING_FREQ_CONTROL (0x8320U)
466 
467 /*! @brief Audio device class-specific ENDP GET RES COMMAND  */
468 #define USB_DEVICE_AUDIO_EP_GET_RES_SAMPLING_FREQ_CONTROL (0x8420U)
469 #endif
470 
471 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0) /* CS: the following application command value is started from ox30 */
472 /*! @brief Audio device class-specific CS SET CUR COMMAND  */
473 #define USB_DEVICE_AUDIO_CS_SET_CUR_SAMPLING_FREQ_CONTROL (0x0130U)
474 #define USB_DEVICE_AUDIO_CS_SET_CUR_CLOCK_VALID_CONTROL   (0x0131U)
475 
476 /*! @brief Audio device class-specific CS GET CUR COMMAND  */
477 #define USB_DEVICE_AUDIO_CS_GET_CUR_SAMPLING_FREQ_CONTROL (0x8130U)
478 #define USB_DEVICE_AUDIO_CS_GET_CUR_CLOCK_VALID_CONTROL   (0x8131U)
479 
480 /*! @brief Audio device class-specific CS GET RANGE COMMAND  */
481 #define USB_DEVICE_AUDIO_CS_GET_RANGE_SAMPLING_FREQ_CONTROL (0x8630U)
482 #endif
483 
484 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0) /* Audio 2.0 FU : the following application command value is started from ox40 \
485                                          */
486 /*! @brief Audio device class-specific GET RANGE COMMAND  */
487 #define USB_DEVICE_AUDIO_FU_GET_RANGE_VOLUME_CONTROL (0x8640U)
488 #endif
489 
490 /* Terminal : the following application command value is started from ox50 */
491 /*! @brief Audio device class-specific TE GET CUR COMMAND  */
492 #define USB_DEVICE_AUDIO_TE_GET_CUR_COPY_PROTECT_CONTROL (0x8150U)
493 /*! @brief Audio device class-specific TE SET CUR COMMAND  */
494 #define USB_DEVICE_AUDIO_TE_SET_CUR_COPY_PROTECT_CONTROL (0x0150U)
495 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
496 #define USB_DEVICE_AUDIO_TE_GET_CUR_CONNECTOR_CONTROL (0x8151U)
497 #define USB_DEVICE_AUDIO_TE_GET_CUR_OVERLOAD_CONTROL  (0x8152U)
498 #endif
499 /*! @}*/
500 
501 /*!
502  * @name USB Audio class setup request types
503  * @{
504  */
505 /*! @brief Audio device class setup request set type */
506 #define USB_DEVICE_AUDIO_SET_REQUEST_INTERFACE (0x21U)
507 #define USB_DEVICE_AUDIO_SET_REQUEST_ENDPOINT  (0x22U)
508 
509 /*! @brief Audio device class setup request get type */
510 #define USB_DEVICE_AUDIO_GET_REQUEST_INTERFACE (0xA1U)
511 #define USB_DEVICE_AUDIO_GET_REQUEST_ENDPOINT  (0xA2U)
512 /*! @}*/
513 
514 /*! @brief Available common EVENT types in audio class callback */
515 typedef enum
516 {
517     kUSB_DeviceAudioEventStreamSendResponse = 0x01U, /*!< Send data completed or cancelled etc in stream pipe */
518     kUSB_DeviceAudioEventStreamRecvResponse,         /*!< Data received or cancelled etc in stream pipe */
519     kUSB_DeviceAudioEventControlSendResponse,        /*!< Send data completed or cancelled etc in audio control pipe */
520 } usb_device_audio_event_t;
521 
522 /*!
523  * @brief The audio device class-specific information.
524  * The structure is used to pass the audio entity information filled by application.
525  * Such as
526  *     entity id (unit or terminal ID),
527  *     entity type (unit or terminal type),
528  *     and terminal type if the entity is a terminal.
529  */
530 typedef struct _usb_device_audio_entity_struct
531 {
532     uint8_t entityId;
533     uint8_t entityType;
534     uint16_t terminalType;
535 } usb_device_audio_entity_struct_t;
536 
537 /*!
538  * @brief The audio device class-specific information list.
539  * The structure is used to pass the audio entity informations filled by the application.
540  * The type of each entity is usb_device_audio_entity_struct_t.
541  * The structure pointer is kept in the usb_device_interface_struct_t::classSpecific,
542  * such as, if there are three entities (an out terminal, camera terminal, and processing unit),
543  * the value of the count field is 3 and the entity field saves the every entity information.
544  */
545 typedef struct _usb_device_audio_entities_struct
546 {
547     usb_device_audio_entity_struct_t *entity;
548     uint8_t count;
549 } usb_device_audio_entities_struct_t;
550 
551 /*! @brief The audio device class status structure */
552 typedef struct _usb_device_audio_struct
553 {
554     usb_device_handle handle;                              /*!< The device handle */
555     usb_device_class_config_struct_t *configStruct;        /*!< The configuration of the class. */
556     usb_device_interface_struct_t *controlInterfaceHandle; /*!< Current control interface handle */
557     usb_device_interface_struct_t *streamInterfaceHandle;  /*!< Current stream interface handle */
558     uint8_t configuration;                                 /*!< Current configuration */
559     uint8_t controlInterfaceNumber;                        /*!< The control interface number of the class */
560     uint8_t controlAlternate;                              /*!< Current alternate setting of the control interface */
561     uint8_t streamInterfaceNumber;                         /*!< The stream interface number of the class */
562     uint8_t streamAlternate;                               /*!< Current alternate setting of the stream interface */
563     uint8_t streamInPipeBusy;                              /*!< Stream IN pipe busy flag */
564     uint8_t streamOutPipeBusy;                             /*!< Stream OUT pipe busy flag */
565 } usb_device_audio_struct_t;
566 
567 #if (USB_DEVICE_CONFIG_AUDIO_CLASS_2_0)
568 STRUCT_PACKED
569 struct _usb_device_control_range_layout3_struct
570 {
571     uint16_t wNumSubRanges;
572     uint32_t wMIN;
573     uint32_t wMAX;
574     uint32_t wRES;
575 } STRUCT_UNPACKED;
576 typedef struct _usb_device_control_range_layout3_struct usb_device_control_range_layout3_struct_t;
577 STRUCT_PACKED
578 struct _usb_device_control_range_layout2_struct
579 {
580     uint16_t wNumSubRanges;
581     uint16_t wMIN;
582     uint16_t wMAX;
583     uint16_t wRES;
584 } STRUCT_UNPACKED;
585 typedef struct _usb_device_control_range_layout2_struct usb_device_control_range_layout2_struct_t;
586 #endif
587 
588 /*******************************************************************************
589  * API
590  ******************************************************************************/
591 
592 /*!
593  * @name USB Audio Class Driver
594  * @{
595  */
596 /*!
597  * @brief Initializes the USB audio class.
598  *
599  * This function obtains a USB device handle according to the controller ID, initializes the audio class
600  * with the class configuration parameters, and creates the mutex for each pipe.
601  *
602  * @param controllerId The ID of the controller. The value can be chosen from the kUSB_ControllerKhci0,
603  *  kUSB_ControllerKhci1, kUSB_ControllerEhci0, or kUSB_ControllerEhci1.
604  * @param config The user configuration structure of type usb_device_class_config_struct_t. The user
605  *  populates the members of this structure and passes the pointer of this structure
606  *  into this function.
607  * @param handle  An out parameter. The class handle of the audio class.
608  * @return A USB error code or kStatus_USB_Success.
609  * @retval kStatus_USB_Success The audio class is initialized successfully.
610  * @retval kStatus_USB_Busy No audio device handle available for allocation.
611  * @retval kStatus_USB_InvalidHandle The audio device handle allocation failure.
612  * @retval kStatus_USB_InvalidParameter The USB device handle allocation failure.
613  */
614 extern usb_status_t USB_DeviceAudioInit(uint8_t controllerId,
615                                         usb_device_class_config_struct_t *config,
616                                         class_handle_t *handle);
617 
618 /*!
619  * @brief Deinitializes the USB audio class.
620  *
621  * This function destroys the mutex for each pipe, deinitializes each endpoint of the audio class, and frees
622  * the audio class handle.
623  *
624  * @param handle The class handle of the audio class.
625  * @return A USB error code or kStatus_USB_Success.
626  * @retval kStatus_USB_Success The audio class is deinitialized successfully.
627  * @retval kStatus_USB_Error The endpoint deinitialization failure.
628  * @retval kStatus_USB_InvalidHandle The audio device handle or the audio class handle is invalid.
629  * @retval kStatus_USB_InvalidParameter The endpoint number of the audio class handle is invalid.
630  */
631 extern usb_status_t USB_DeviceAudioDeinit(class_handle_t handle);
632 
633 /*!
634  * @brief Handles the USB audio class event.
635  *
636  * This function responds to various events including the common device events and the class-specific events.
637  * For class-specific events, it calls the class callback defined in the application to deal with the class-specific
638  * event.
639  *
640  * @param handle The class handle of the audio class.
641  * @param event The event type.
642  * @param param The class handle of the audio class.
643  * @return A USB error code or kStatus_USB_Success.
644  * @retval kStatus_USB_Success The audio class is deinitialized successfully.
645  * @retval kStatus_USB_Error The configure structure of the audio class handle is invalid.
646  * @retval kStatus_USB_InvalidHandle The audio device handle or the audio class handle is invalid.
647  * @retval kStatus_USB_InvalidParameter The endpoint number of the audio class handle is invalid.
648  * @retval Others The error code returned by class callback in application.
649  */
650 extern usb_status_t USB_DeviceAudioEvent(void *handle, uint32_t event, void *param);
651 
652 /*!
653  * @brief Primes the endpoint to send a packet to the host.
654  *
655  * This function checks whether the endpoint is sending packet, then it primes the endpoint
656  * with the buffer address and the buffer length if the pipe is not busy. Otherwise, it ignores this transfer by
657  * returning an error code.
658  *
659  * @param handle The class handle of the audio class.
660  * @param ep The endpoint number of the transfer.
661  * @param buffer The pointer to the buffer to be transferred.
662  * @param length The length of the buffer to be transferred.
663  * @return A USB error code or kStatus_USB_Success.
664  * @retval kStatus_USB_Success Prime to send packet successfully.
665  * @retval kStatus_USB_Busy The endpoint is busy in transferring.
666  * @retval kStatus_USB_InvalidHandle The audio device handle or the audio class handle is invalid.
667  * @retval kStatus_USB_ControllerNotFound The controller interface is invalid.
668  *
669  * @note The function can only be called in the same context.
670  */
671 extern usb_status_t USB_DeviceAudioSend(class_handle_t handle, uint8_t ep, uint8_t *buffer, uint32_t length);
672 
673 /*!
674  * @brief Primes the endpoint to receive a packet from the host.
675  *
676  * This function checks whether the endpoint is receiving packet, then it primes the endpoint
677  * with the buffer address and the buffer length if the pipe is not busy. Otherwise, it ignores this transfer by
678  * returning an error code.
679  *
680  * @param handle The class handle of the audio class.
681  * @param ep The endpoint number of the transfer.
682  * @param buffer The pointer to the buffer to be transferred.
683  * @param length The length of the buffer to be transferred.
684  * @return A USB error code or kStatus_USB_Success.
685  * @retval kStatus_USB_Success Prime to receive packet successfully.
686  * @retval kStatus_USB_Busy The endpoint is busy in transferring.
687  * @retval kStatus_USB_InvalidHandle The audio device handle or the audio class handle is invalid.
688  * @retval kStatus_USB_ControllerNotFound The controller interface is invalid.
689  *
690  * @note The function can only be called in the same context.
691  */
692 extern usb_status_t USB_DeviceAudioRecv(class_handle_t handle, uint8_t ep, uint8_t *buffer, uint32_t length);
693 
694 /*! @}*/
695 
696 /*! @}*/
697 
698 #endif /* __USB_DEVICE_AUDIO_H__ */
699