1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 
12 /**************************************************************************/
13 /**************************************************************************/
14 /**                                                                       */
15 /** USBX Component                                                        */
16 /**                                                                       */
17 /**   Audio Class                                                         */
18 /**                                                                       */
19 /**************************************************************************/
20 /**************************************************************************/
21 
22 
23 /**************************************************************************/
24 /*                                                                        */
25 /*  COMPONENT DEFINITION                                   RELEASE        */
26 /*                                                                        */
27 /*    ux_host_class_audio.h                               PORTABLE C      */
28 /*                                                           6.3.0        */
29 /*  AUTHOR                                                                */
30 /*                                                                        */
31 /*    Chaoqiong Xiao, Microsoft Corporation                               */
32 /*                                                                        */
33 /*  DESCRIPTION                                                           */
34 /*                                                                        */
35 /*    This file contains all the header and extern functions used by the  */
36 /*    USBX audio class.                                                   */
37 /*                                                                        */
38 /*  RELEASE HISTORY                                                       */
39 /*                                                                        */
40 /*    DATE              NAME                      DESCRIPTION             */
41 /*                                                                        */
42 /*  05-19-2020     Chaoqiong Xiao           Initial Version 6.0           */
43 /*  09-30-2020     Chaoqiong Xiao           Modified comment(s),          */
44 /*                                            used UX prefix to refer to  */
45 /*                                            TX symbols instead of using */
46 /*                                            them directly,              */
47 /*                                            resulting in version 6.1    */
48 /*  08-02-2021     Wen Wang                 Modified comment(s),          */
49 /*                                            added extern "C" keyword    */
50 /*                                            for compatibility with C++, */
51 /*                                            resulting in version 6.1.8  */
52 /*  07-29-2022     Chaoqiong Xiao           Modified comment(s),          */
53 /*                                            added interrupt support,    */
54 /*                                            used interface protocol,    */
55 /*                                            protect reentry with mutex, */
56 /*                                            added feedback support,     */
57 /*                                            added Audio 2.0 support,    */
58 /*                                            resulting in version 6.1.12 */
59 /*  10-31-2023     Chaoqiong Xiao           Modified comment(s),          */
60 /*                                            improved AC AS management,  */
61 /*                                            optimized USB descriptors,  */
62 /*                                            resulting in version 6.3.0  */
63 /*                                                                        */
64 /**************************************************************************/
65 
66 #ifndef UX_HOST_CLASS_AUDIO_H
67 #define UX_HOST_CLASS_AUDIO_H
68 
69 /* Determine if a C++ compiler is being used.  If so, ensure that standard
70    C is used to process the API information.  */
71 
72 #ifdef   __cplusplus
73 
74 /* Yes, C++ compiler is present.  Use standard C.  */
75 extern   "C" {
76 
77 #endif
78 
79 /* Defined, it enables UAC 2.0 support.  */
80 /* #define UX_HOST_CLASS_AUDIO_2_SUPPORT  */
81 
82 /* Defined, it enables feedback endpoint support.  */
83 /* #define UX_HOST_CLASS_AUDIO_FEEDBACK_SUPPORT  */
84 
85 /* Defined, it enables optional interrupt endpoint support.  */
86 /* #define UX_HOST_CLASS_AUDIO_INTERRUPT_SUPPORT  */
87 
88 /* Defined, it disables control_get/value_get/value_set and related code (to optimize code size).  */
89 /* #define UX_HOST_CLASS_AUDIO_DISABLE_CONTROLS  */
90 
91 /* Internal option: enable the basic USBX error checking. This define is typically used
92    while debugging application.  */
93 #if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_HOST_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
94 #define UX_HOST_CLASS_AUDIO_ENABLE_ERROR_CHECKING
95 #endif
96 
97 
98 #include "ux_class_audio10.h"
99 #if defined(UX_HOST_CLASS_AUDIO_2_SUPPORT)
100 #include "ux_class_audio20.h"
101 #endif
102 
103 /* Define Audio Class main constants.  */
104 
105 #define UX_HOST_CLASS_AUDIO_CLASS_TRANSFER_TIMEOUT          30
106 
107 #define UX_HOST_CLASS_AUDIO_CLASS                           1
108 #define UX_HOST_CLASS_AUDIO_SUBCLASS_UNDEFINED              0
109 #define UX_HOST_CLASS_AUDIO_SUBCLASS_CONTROL                1
110 #define UX_HOST_CLASS_AUDIO_SUBCLASS_STREAMING              2
111 #define UX_HOST_CLASS_AUDIO_SUBCLASS_MIDI_STREAMING         3
112 #define UX_HOST_CLASS_AUDIO_PROTOCOL_UNDEFINED              0
113 #define UX_HOST_CLASS_AUDIO_PROTOCOL_IP_VERSION_01_00       0x00
114 #define UX_HOST_CLASS_AUDIO_PROTOCOL_IP_VERSION_02_00       0x20
115 #define UX_HOST_CLASS_AUDIO_PROTOCOL_IP_VERSION_03_00       0x30
116 #define UX_HOST_CLASS_AUDIO_PROTOCOL_AF_VERSION_01_00       UX_HOST_CLASS_AUDIO_PROTOCOL_IP_VERSION_01_00
117 #define UX_HOST_CLASS_AUDIO_PROTOCOL_AF_VERSION_02_00       UX_HOST_CLASS_AUDIO_PROTOCOL_IP_VERSION_02_00
118 #define UX_HOST_CLASS_AUDIO_PROTOCOL_AF_VERSION_03_00       UX_HOST_CLASS_AUDIO_PROTOCOL_IP_VERSION_03_00
119 
120 #define UX_HOST_CLASS_AUDIO_FUNCTION                            UX_HOST_CLASS_AUDIO_CLASS
121 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_UNDEFINED         0x00
122 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_FULL_ADC_3_0      0x01
123 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_GENERIC_I_O       0x20
124 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_HEADPHONE         0x21
125 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_SPEAKER           0x22
126 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_MICROPHONE        0x23
127 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_HEADSET           0x24
128 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_HEADSET_ADAPTER   0x25
129 #define UX_HOST_CLASS_AUDIO_FUNCTION_SUBCLASS_SPEAKERPHONE      0x26
130 
131 /* Define Audio Class main descriptor types.  */
132 
133 #define UX_HOST_CLASS_AUDIO_CS_UNDEFINED                    0x20
134 #define UX_HOST_CLASS_AUDIO_CS_DEVICE                       0x21
135 #define UX_HOST_CLASS_AUDIO_CS_CONFIGURATION                0x22
136 #define UX_HOST_CLASS_AUDIO_CS_STRING                       0x23
137 #define UX_HOST_CLASS_AUDIO_CS_INTERFACE                    0x24
138 #define UX_HOST_CLASS_AUDIO_CS_ENDPOINT                     0x25
139 
140 
141 /* Define Audio Class specific AC interface descriptor subclasses.  */
142 
143 #define UX_HOST_CLASS_AUDIO_CS_AC_UNDEFINED                 0x00
144 #define UX_HOST_CLASS_AUDIO_CS_HEADER                       0x01
145 #define UX_HOST_CLASS_AUDIO_CS_INPUT_TERMINAL               0x02
146 #define UX_HOST_CLASS_AUDIO_CS_OUTPUT_TERMINAL              0x03
147 #define UX_HOST_CLASS_AUDIO_CS_MIXER_UNIT                   0x04
148 #define UX_HOST_CLASS_AUDIO_CS_SELECTOR_UNIT                0x05
149 #define UX_HOST_CLASS_AUDIO_CS_FEATURE_UNIT                 0x06
150 #define UX_HOST_CLASS_AUDIO_CS_PROCESSING_UNIT              0x07
151 #define UX_HOST_CLASS_AUDIO_CS_EXTENSION_UNIT               0x08
152 
153 
154 /* Define Audio Class specific AS interface descriptor subclasses.  */
155 
156 #define UX_HOST_CLASS_AUDIO_CS_AS_UNDEFINED                 0x00
157 #define UX_HOST_CLASS_AUDIO_CS_AS_GENERAL                   0x01
158 #define UX_HOST_CLASS_AUDIO_CS_FORMAT_TYPE                  0x02
159 #define UX_HOST_CLASS_AUDIO_CS_FORMAT_SPECIFIC              0x03
160 
161 
162 /* Define Audio Class specific processing unit process types.  */
163 
164 #define UX_HOST_CLASS_AUDIO_PROCESS_UNDEFINED               0x00
165 #define UX_HOST_CLASS_AUDIO_UP_DOWN_MIX_PROCESS             0x01
166 #define UX_HOST_CLASS_AUDIO_DOLBY_PROLOGIC_PROCESS          0x02
167 #define UX_HOST_CLASS_AUDIO_3D_STEREO_EXTENDED_PROCESS      0x03
168 #define UX_HOST_CLASS_AUDIO_REVERBERATION_PROCESS           0x04
169 #define UX_HOST_CLASS_AUDIO_CHORUS_PROCESS                  0x05
170 #define UX_HOST_CLASS_AUDIO_DYN_RANGE_COMP_PROCESS          0x06
171 
172 
173 /* Define Audio Class specific endpoint descriptor subtypes.  */
174 
175 #define UX_HOST_CLASS_AUDIO_DESCRIPTOR_UNDEFINED            0x00
176 #define UX_HOST_CLASS_AUDIO_EP_GENERAL                      0x01
177 
178 
179 /* Define Audio Class specific request codes.  */
180 
181 #define UX_HOST_CLASS_AUDIO_REQUEST_CODE_UNDEFINED          0x00
182 #define UX_HOST_CLASS_AUDIO_SET_CUR                         0x01
183 #define UX_HOST_CLASS_AUDIO_GET_CUR                         0x81
184 #define UX_HOST_CLASS_AUDIO_SET_MIN                         0x02
185 #define UX_HOST_CLASS_AUDIO_GET_MIN                         0x82
186 #define UX_HOST_CLASS_AUDIO_SET_MAX                         0x03
187 #define UX_HOST_CLASS_AUDIO_GET_MAX                         0x83
188 #define UX_HOST_CLASS_AUDIO_SET_RES                         0x04
189 #define UX_HOST_CLASS_AUDIO_GET_RES                         0x84
190 #define UX_HOST_CLASS_AUDIO_SET_MEM                         0x05
191 #define UX_HOST_CLASS_AUDIO_GET_MEM                         0x85
192 #define UX_HOST_CLASS_AUDIO_GET_STAT                        0xFF
193 
194 
195 /* Define Audio Class specific terminal control selectors.  */
196 
197 #define UX_HOST_CLASS_AUDIO_TE_CONTROL_UNDEFINED            0x00
198 #define UX_HOST_CLASS_AUDIO_COPY_PROTECT_CONTROL            0x01
199 
200 
201 /* Define Audio Class specific feature unit control selectors.  */
202 
203 #define UX_HOST_CLASS_AUDIO_FU_CONTROL_UNDEFINED            0x00
204 #define UX_HOST_CLASS_AUDIO_MUTE_CONTROL                    0x01
205 #define UX_HOST_CLASS_AUDIO_VOLUME_CONTROL                  0x02
206 #define UX_HOST_CLASS_AUDIO_BASS_CONTROL                    0x03
207 #define UX_HOST_CLASS_AUDIO_MID_CONTROL                     0x04
208 #define UX_HOST_CLASS_AUDIO_TREBLE_CONTROL                  0x05
209 #define UX_HOST_CLASS_AUDIO_GRAPHIC_EQUALIZER_CONTROL       0x06
210 #define UX_HOST_CLASS_AUDIO_AUTOMATIC_GAIN_CONTROL          0x07
211 #define UX_HOST_CLASS_AUDIO_DELAY_CONTROL                   0x08
212 #define UX_HOST_CLASS_AUDIO_BASS_BOOST_CONTROL              0x09
213 #define UX_HOST_CLASS_AUDIO_LOUNDNESS_CONTROL               0x0A
214 
215 
216 /* Define Audio Class input terminal types.  */
217 
218 #define UX_HOST_CLASS_AUDIO_INPUT                           0x0200
219 #define UX_HOST_CLASS_AUDIO_MICROPHONE                      0x0201
220 #define UX_HOST_CLASS_AUDIO_DESKTOP_MICROPHONE              0x0202
221 #define UX_HOST_CLASS_AUDIO_PERSONAL_MICROPHONE             0x0203
222 #define UX_HOST_CLASS_AUDIO_OMNI_DIRECTIONAL_MICROPHONE     0x0204
223 #define UX_HOST_CLASS_AUDIO_MICROPHONE_ARRAY                0x0205
224 #define UX_HOST_CLASS_AUDIO_PROCESSING_MICROPHONE_ARRAY     0x0206
225 
226 
227 /* Define Audio Class output terminal types.  */
228 
229 #define UX_HOST_CLASS_AUDIO_OUTPUT                          0x0300
230 #define UX_HOST_CLASS_AUDIO_SPEAKER                         0x0301
231 #define UX_HOST_CLASS_AUDIO_HEADPHONES                      0x0302
232 #define UX_HOST_CLASS_AUDIO_HEAD_MOUNTED_DISPLAY            0x0303
233 #define UX_HOST_CLASS_AUDIO_DESKTOP_SPEAKER                 0x0304
234 #define UX_HOST_CLASS_AUDIO_ROOM_SPEAKER                    0x0305
235 #define UX_HOST_CLASS_AUDIO_COMMUNICATION_SPEAKER           0x0306
236 #define UX_HOST_CLASS_AUDIO_LOW_FREQUENCY_SPEAKER           0x0307
237 
238 
239 /* Define Audio Class bidirectional terminal types.  */
240 
241 #define UX_HOST_CLASS_AUDIO_BIDIRECTIONAL_UNDEFINED         0x0400
242 #define UX_HOST_CLASS_AUDIO_HANDSET                         0x0401
243 #define UX_HOST_CLASS_AUDIO_HEADSET                         0x0402
244 #define UX_HOST_CLASS_AUDIO_SPEAKERPHONE                    0x0403
245 #define UX_HOST_CLASS_AUDIO_ECHO_SUPRESS_SPEAKERPHONE       0x0404
246 #define UX_HOST_CLASS_AUDIO_ECHO_CANCEL_SPEAKERPHONE        0x0405
247 
248 
249 /* Define Audio Class telephony terminal types.  */
250 
251 #define UX_HOST_CLASS_AUDIO_TELEPHONTY_UNDEFINED            0x0500
252 #define UX_HOST_CLASS_AUDIO_PHONE_LINE                      0x0501
253 #define UX_HOST_CLASS_AUDIO_TELEPHONE                       0x0502
254 #define UX_HOST_CLASS_AUDIO_DOWN_LINE_PHONE                 0x0503
255 
256 /* Define Audio Class external terminal types.  */
257 
258 /* Define Audio Class encoding format types.  */
259 
260 /* Audio 1.0 Format Type Codes.  */
261 #define UX_HOST_CLASS_AUDIO_FORMAT_TYPE_UNDEFINED                   0
262 #define UX_HOST_CLASS_AUDIO_FORMAT_TYPE_I                           1
263 #define UX_HOST_CLASS_AUDIO_FORMAT_TYPE_II                          2
264 #define UX_HOST_CLASS_AUDIO_FORMAT_TYPE_III                         3
265 
266 /* Audio 1.0 CS AS Interface Descriptor Type I wFormatTag.  */
267 #define UX_HOST_CLASS_AUDIO_FORMAT_PCM                              1
268 #define UX_HOST_CLASS_AUDIO_FORMAT_PCM8                             2
269 #define UX_HOST_CLASS_AUDIO_FORMAT_IEEE_FLOAT                       3
270 #define UX_HOST_CLASS_AUDIO_FORMAT_ALAW                             4
271 #define UX_HOST_CLASS_AUDIO_FORMAT_MULAW                            5
272 /* Audio 1.0 CS AS Interface Descriptor Type II wFormatTag.  */
273 #define UX_HOST_CLASS_AUDIO_FORMAT_TYPE_II_UNDEFINED                0x1000
274 #define UX_HOST_CLASS_AUDIO_FORMAT_MPEG                             0x1001
275 #define UX_HOST_CLASS_AUDIO_FORMAT_AC_3                             0x1002
276 /* Audio 1.0 CS AS Interface Descriptor Type III wFormatTag.  */
277 #define UX_HOST_CLASS_AUDIO_FORMAT_TYPE_III_UNDEFINED               0x2000
278 #define UX_HOST_CLASS_AUDIO_FORMAT_IEC1937_AC_3                     0x2001
279 #define UX_HOST_CLASS_AUDIO_FORMAT_IEC1937_MPEG_1_LAYER_1           0x2002
280 #define UX_HOST_CLASS_AUDIO_FORMAT_IEC1937_MPEG_1_L2_3_MPEG_2_NOEXT 0x2003
281 #define UX_HOST_CLASS_AUDIO_FORMAT_IEC1937_MPEG_2_EXT               0x2004
282 #define UX_HOST_CLASS_AUDIO_FORMAT_IEC1937_MPEG_2_LAYER_1_LS        0x2005
283 #define UX_HOST_CLASS_AUDIO_FORMAT_IEC1937_MPEG_2_LAYER_2_3_LS      0x2006
284 
285 /* Audio 1.0 descriptor structs.  */
286 
287 #define UX_HOST_CLASS_AUDIO_INTERFACE_DESCRIPTOR_ENTRIES            8
288 #define UX_HOST_CLASS_AUDIO_INTERFACE_DESCRIPTOR_LENGTH             8
289 
290 #define UX_HOST_CLASS_AUDIO_INPUT_TERMINAL_DESCRIPTOR_ENTRIES       10
291 #define UX_HOST_CLASS_AUDIO_INPUT_TERMINAL_DESCRIPTOR_LENGTH        12
292 
293 #define UX_HOST_CLASS_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR_ENTRIES      8
294 #define UX_HOST_CLASS_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR_LENGTH       9
295 
296 #define UX_HOST_CLASS_AUDIO_FEATURE_UNIT_DESCRIPTOR_ENTRIES         7
297 #define UX_HOST_CLASS_AUDIO_FEATURE_UNIT_DESCRIPTOR_LENGTH          7
298 
299 #define UX_HOST_CLASS_AUDIO_STREAMING_INTERFACE_DESCRIPTOR_ENTRIES  6
300 #define UX_HOST_CLASS_AUDIO_STREAMING_INTERFACE_DESCRIPTOR_LENGTH   6
301 
302 #define UX_HOST_CLASS_AUDIO_STREAMING_ENDPOINT_DESCRIPTOR_ENTRIES   6
303 #define UX_HOST_CLASS_AUDIO_STREAMING_ENDPOINT_DESCRIPTOR_LENGTH    6
304 
305 
306 /* Define Audio Class specific interface descriptor.  */
307 
308 #define UX_HOST_CLASS_AUDIO_MAX_CHANNEL                         8
309 #define UX_HOST_CLASS_AUDIO_NAME_LENGTH                         64
310 
311 typedef struct UX_HOST_CLASS_AUDIO_INTERFACE_DESCRIPTOR_STRUCT
312 {
313 
314     UCHAR           bLength;
315     UCHAR           bDescriptorType;
316     UCHAR           bDescriptorSubType;
317     UCHAR           bFormatType;
318     UCHAR           bNrChannels;
319     UCHAR           bSubframeSize;
320     UCHAR           bBitResolution;
321     UCHAR           bSamFreqType;
322 } UX_HOST_CLASS_AUDIO_INTERFACE_DESCRIPTOR;
323 
324 
325 /* Define Audio Class specific input terminal interface descriptor.  */
326 
327 typedef struct UX_HOST_CLASS_AUDIO_INPUT_TERMINAL_DESCRIPTOR_STRUCT
328 {
329 
330     UCHAR           bLength;
331     UCHAR           bDescriptorType;
332     UCHAR           bDescriptorSubType;
333     UCHAR           bTerminalID;
334     USHORT          wTerminalType;
335     UCHAR           bAssocTerminal;
336     UCHAR           bNrChannels;
337     USHORT          wChannelConfig;
338     UCHAR           iChannelNames;
339     UCHAR           iTerminal;
340 } UX_HOST_CLASS_AUDIO_INPUT_TERMINAL_DESCRIPTOR;
341 
342 
343 /* Define Audio Class specific output terminal interface descriptor.  */
344 
345 typedef struct UX_HOST_CLASS_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR_STRUCT
346 {
347 
348     UCHAR           bLength;
349     UCHAR           bDescriptorType;
350     UCHAR           bDescriptorSubType;
351     UCHAR           bTerminalID;
352     USHORT          wTerminalType;
353     UCHAR           bAssocTerminal;
354     UCHAR           bSourceID;
355     UCHAR           iTerminal;
356     UCHAR           _align_size[3];
357 } UX_HOST_CLASS_AUDIO_OUTPUT_TERMINAL_DESCRIPTOR;
358 
359 
360 /* Define Audio Class specific feature unit descriptor.  */
361 
362 typedef struct UX_HOST_CLASS_AUDIO_FEATURE_UNIT_DESCRIPTOR_STRUCT
363 {
364 
365     UCHAR           bLength;
366     UCHAR           bDescriptorType;
367     UCHAR           bDescriptorSubType;
368     UCHAR           bUnitID;
369     UCHAR           bSourceID;
370     UCHAR           bControlSize;
371     UCHAR           bmaControls;
372     UCHAR           _align_size[1];
373 } UX_HOST_CLASS_AUDIO_FEATURE_UNIT_DESCRIPTOR;
374 
375 
376 /* Define Audio Class streaming interface descriptor.  */
377 
378 typedef struct UX_HOST_CLASS_AUDIO_STREAMING_INTERFACE_DESCRIPTOR_STRUCT
379 {
380 
381     UCHAR           bLength;
382     UCHAR           bDescriptorType;
383     UCHAR           bDescriptorSubtype;
384     UCHAR           bTerminalLink;
385     UCHAR           bDelay;
386     UCHAR           _align_wFormatTag[1];
387     USHORT          wFormatTag;
388 } UX_HOST_CLASS_AUDIO_STREAMING_INTERFACE_DESCRIPTOR;
389 
390 
391 /* Define Audio Class specific streaming endpoint descriptor.  */
392 
393 typedef struct UX_HOST_CLASS_AUDIO_STREAMING_ENDPOINT_DESCRIPTOR_STRUCT
394 {
395 
396     UCHAR           bLength;
397     UCHAR           bDescriptorType;
398     UCHAR           bDescriptorSubtype;
399     UCHAR           bmAttributes;
400     UCHAR           bLockDelayUnits;
401     UCHAR           _align_wLockDelay[1];
402     USHORT          wLockDelay;
403 } UX_HOST_CLASS_AUDIO_STREAMING_ENDPOINT_DESCRIPTOR;
404 
405 
406 /* Define Audio Class audio control (AC) instance structure.  */
407 typedef struct UX_HOST_CLASS_AUDIO_AC_STRUCT
408 {
409 
410     /* Common fields for _AUDIO and _AUDIO_AC,
411      * check pointed interface subclass (_ux_host_class_audio_subclass_get()) to
412      * see remaining fields after interface pointer.  */
413     struct UX_HOST_CLASS_AUDIO_STRUCT
414                     *ux_host_class_audio_next_instance;
415     UX_HOST_CLASS   *ux_host_class_audio_class;
416     UX_INTERFACE    *ux_host_class_audio_interface;
417 
418     UX_DEVICE       *ux_host_class_audio_device;
419     UCHAR *         ux_host_class_audio_configuration_descriptor;
420     ULONG           ux_host_class_audio_configuration_descriptor_length;
421 
422     /* Fields for _AUDIO_CONTROL_BLOCK (control instance).  */
423     UX_ENDPOINT     *ux_host_class_audio_interrupt_endpoint;
424     VOID            (*ux_host_class_audio_interrupt_callback)(struct UX_HOST_CLASS_AUDIO_AC_STRUCT*ac, UCHAR*msg, ULONG len, VOID*arg);
425     VOID            *ux_host_class_audio_interrupt_callback_arg;
426     UINT            ux_host_class_audio_interrupt_started;
427 
428     UINT            ux_host_class_audio_as_count;
429     struct UX_HOST_CLASS_AUDIO_STRUCT
430                     *ux_host_class_audio_as[2]; /* By default allocate 2, actual length depends on _audio_as_count.  */
431 } UX_HOST_CLASS_AUDIO_AC;
432 
433 /* Define Audio Class instance structure.  */
434 
435 typedef struct UX_HOST_CLASS_AUDIO_STRUCT
436 {
437 
438     /* Common fields for _AUDIO and _AUDIO_AC,
439      * check pointed interface subclass (_ux_host_class_audio_subclass_get()) to
440      * see remaining fields after interface pointer.  */
441     struct UX_HOST_CLASS_AUDIO_STRUCT
442                     *ux_host_class_audio_next_instance;
443     UX_HOST_CLASS   *ux_host_class_audio_class;
444     UX_INTERFACE    *ux_host_class_audio_streaming_interface;
445 
446     UX_DEVICE       *ux_host_class_audio_device;
447     UCHAR *         ux_host_class_audio_configuration_descriptor;
448     ULONG           ux_host_class_audio_configuration_descriptor_length;
449 
450     /* Fields for _AUDIO (streaming instance).  */
451     ULONG           ux_host_class_audio_control_interface_number;
452     UCHAR           *ux_host_class_audio_sampling_descriptor;   /* UAC1.0: FormatTypeI Descriptor, UAC2.0: Clock Source Descriptor.  */
453     UX_ENDPOINT     *ux_host_class_audio_isochronous_endpoint;
454 #if defined(UX_HOST_CLASS_AUDIO_FEEDBACK_SUPPORT)
455     UX_ENDPOINT     *ux_host_class_audio_feedback_endpoint;
456     UCHAR           ux_host_class_audio_feedback_buffer[4];     /* USB 2.0: feedback fits into 3(FS) or 4(HS).  */
457 #endif
458 #if defined(UX_HOST_CLASS_AUDIO_INTERRUPT_SUPPORT)
459     UX_HOST_CLASS_AUDIO_AC
460                     *ux_host_class_audio_ac;
461     ULONG           ux_host_class_audio_ac_as;
462 #endif
463     struct UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST_STRUCT
464                     *ux_host_class_audio_head_transfer_request;
465     struct UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST_STRUCT
466                     *ux_host_class_audio_tail_transfer_request;
467     UINT            ux_host_class_audio_state;
468     ULONG           ux_host_class_audio_terminal_link;
469     ULONG           ux_host_class_audio_type;
470     ULONG           ux_host_class_audio_packet_size;
471     ULONG           ux_host_class_audio_packet_freq;
472     ULONG           ux_host_class_audio_packet_fraction;
473 #if !defined(UX_HOST_CLASS_AUDIO_DISABLE_CONTROLS)
474     ULONG           ux_host_class_audio_feature_unit_id;
475     UINT            ux_host_class_audio_channels;
476     ULONG           ux_host_class_audio_channel_control[UX_HOST_CLASS_AUDIO_MAX_CHANNEL];
477 #endif
478     UX_MUTEX        ux_host_class_audio_mutex;
479 } UX_HOST_CLASS_AUDIO;
480 
481 #define _ux_host_class_audio_interface_get(a)           (((UX_HOST_CLASS_AUDIO*)(a))->ux_host_class_audio_streaming_interface->ux_interface_descriptor.bInterfaceNumber)
482 #define _ux_host_class_audio_protocol_get(a)            (((UX_HOST_CLASS_AUDIO*)(a))->ux_host_class_audio_streaming_interface->ux_interface_descriptor.bInterfaceProtocol)
483 #define _ux_host_class_audio_subclass_get(a)            (((UX_HOST_CLASS_AUDIO*)(a))->ux_host_class_audio_streaming_interface->ux_interface_descriptor.bInterfaceSubClass)
484 
485 #define _ux_host_class_audio_speed_get(a)               ((a)->ux_host_class_audio_device->ux_device_speed)
486 #define _ux_host_class_audio_type_get(a)                ((a)->ux_host_class_audio_type)
487 #if defined(UX_HOST_CLASS_AUDIO_FEEDBACK_SUPPORT)
488 #define _ux_host_class_audio_feedback_supported(a)      ((a)->ux_host_class_audio_feedback_endpoint)
489 #else
490 #define _ux_host_class_audio_feedback_supported(a)      (UX_FALSE)
491 #endif
492 #define _ux_host_class_audio_control_interface_get(a)   ((a)->ux_host_class_audio_control_interface_number)
493 #define _ux_host_class_audio_terminal_link_get(a)       ((a)->ux_host_class_audio_terminal_link)
494 #define _ux_host_class_audio_packet_size_get(a)         ((a)->ux_host_class_audio_packet_size)
495 #define _ux_host_class_audio_packet_freq_get(a)         ((a)->ux_host_class_audio_packet_freq)
496 #define _ux_host_class_audio_packet_fraction_get(a)     ((a)->ux_host_class_audio_packet_fraction)
497 #define _ux_host_class_audio_max_packet_size_get(a)     ((a)->ux_host_class_audio_isochronous_endpoint->ux_endpoint_transfer_request.ux_transfer_request_packet_length)
498 
499 
500 /* Define Audio Class isochronous USB transfer request structure.  */
501 
502 typedef struct UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST_STRUCT
503 {
504 
505     ULONG           ux_host_class_audio_transfer_request_status;
506     UCHAR           *ux_host_class_audio_transfer_request_data_pointer;
507     ULONG           ux_host_class_audio_transfer_request_requested_length;
508     ULONG           ux_host_class_audio_transfer_request_packet_size;    /* Actual packet size to use.  */
509     ULONG           ux_host_class_audio_transfer_request_actual_length;
510     VOID            (*ux_host_class_audio_transfer_request_completion_function) (struct UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST_STRUCT *);
511     UX_SEMAPHORE    ux_host_class_audio_transfer_request_semaphore;
512     VOID            *ux_host_class_audio_transfer_request_class_instance;
513     UINT            ux_host_class_audio_transfer_request_completion_code;
514     struct UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST_STRUCT
515                     *ux_host_class_audio_transfer_request_next_audio_transfer_request;
516     UX_TRANSFER     ux_host_class_audio_transfer_request;
517 } UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST;
518 
519 
520 /* Define Audio Class channel/value control structures.  */
521 
522 typedef struct UX_HOST_CLASS_AUDIO_CONTROL_STRUCT
523 {
524 
525     ULONG           ux_host_class_audio_control;
526     ULONG           ux_host_class_audio_control_channel;
527     ULONG           ux_host_class_audio_control_min;
528     ULONG           ux_host_class_audio_control_max;
529     ULONG           ux_host_class_audio_control_res;
530     ULONG           ux_host_class_audio_control_cur;
531 
532     ULONG           ux_host_class_audio_control_entity; /* Entity ID.  */
533     ULONG           ux_host_class_audio_control_size;   /* Size of value in 1,2 or 4 bytes.  */
534 } UX_HOST_CLASS_AUDIO_CONTROL;
535 
536 
537 typedef struct UX_HOST_CLASS_AUDIO_CHANNEL_STRUCT
538 {
539 
540     ULONG           ux_host_class_audio_channel_control;
541     ULONG           ux_host_class_audio_channel;
542 } UX_HOST_CLASS_AUDIO_CHANNEL;
543 
544 
545 /* Define Audio Class sampling selection structure.  */
546 
547 typedef struct UX_HOST_CLASS_AUDIO_SAMPLING_STRUCT
548 {
549 
550     ULONG           ux_host_class_audio_sampling_channels;
551     ULONG           ux_host_class_audio_sampling_frequency;
552     ULONG           ux_host_class_audio_sampling_resolution;
553 } UX_HOST_CLASS_AUDIO_SAMPLING;
554 
555 
556 /* Define Audio Class sampling characteristics structure.  */
557 
558 typedef struct UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS_STRUCT
559 {
560 
561     ULONG           ux_host_class_audio_sampling_characteristics_channels;
562     ULONG           ux_host_class_audio_sampling_characteristics_frequency_low;
563     ULONG           ux_host_class_audio_sampling_characteristics_frequency_high;
564     ULONG           ux_host_class_audio_sampling_characteristics_resolution;
565 
566     /* UAC 1.0, must be 1s.  UAC 2.0, from actual audio schematic.  */
567     ULONG           ux_host_class_audio_sampling_characteristics_clock_mul;
568     ULONG           ux_host_class_audio_sampling_characteristics_clock_div;
569 
570     /* UAC 1.0, format type I descriptor for futher operations.  */
571     /* UAC 2.0, clock source descriptor (CSD) for futher operations.  */
572     UCHAR           *ux_host_class_audio_sampling_characteristics_descriptor;
573 } UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS;
574 
575 
576 /* Define Audio Class function prototypes.  */
577 
578 UINT    _ux_host_class_audio_activate(UX_HOST_CLASS_COMMAND *command);
579 UINT    _ux_host_class_audio_alternate_setting_locate(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_SAMPLING *audio_sampling, UINT *alternate_setting);
580 UINT    _ux_host_class_audio_configure(UX_HOST_CLASS_AUDIO *audio);
581 UINT    _ux_host_class_audio_control_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
582 UINT    _ux_host_class_audio_control_value_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
583 UINT    _ux_host_class_audio_control_value_set(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
584 UINT    _ux_host_class_audio_deactivate(UX_HOST_CLASS_COMMAND *command);
585 UINT    _ux_host_class_audio_descriptor_get(UX_HOST_CLASS_AUDIO *audio);
586 UINT    _ux_host_class_audio_device_controls_list_get(UX_HOST_CLASS_AUDIO *audio);
587 UINT    _ux_host_class_audio_device_type_get(UX_HOST_CLASS_AUDIO *audio);
588 UINT    _ux_host_class_audio_endpoints_get(UX_HOST_CLASS_AUDIO *audio);
589 UINT    _ux_host_class_audio_entry(UX_HOST_CLASS_COMMAND *command);
590 UINT    _ux_host_class_audio_read(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST *audio_transfer_request);
591 UINT    _ux_host_class_audio_streaming_sampling_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS *audio_sampling);
592 UINT    _ux_host_class_audio_streaming_sampling_set(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_SAMPLING *audio_sampling);
593 UINT    _ux_host_class_audio_streaming_terminal_get(UX_HOST_CLASS_AUDIO *audio);
594 UINT    _ux_host_class_audio_transfer_request(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST *audio_transfer_request);
595 VOID    _ux_host_class_audio_transfer_request_completed(UX_TRANSFER *transfer_request);
596 UINT    _ux_host_class_audio_write(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST *audio_transfer_request);
597 
598 UINT    _ux_host_class_audio_control_request(UX_HOST_CLASS_AUDIO *audio,
599                         UINT streaming_control,
600                         UINT request_type, UINT request,
601                         UINT request_value,
602                         UINT spec_id,
603                         UCHAR *parameter, ULONG parameter_size, ULONG *actual_size);
604 
605 UINT    _ux_host_class_audio_descriptors_parse(UX_HOST_CLASS_AUDIO *audio,
606                         UINT(*parse_function)(VOID  *arg,
607                                             UCHAR *packed_interface_descriptor,
608                                             UCHAR *packed_endpoint_descriptor,
609                                             UCHAR *packed_audio_descriptor),
610                         VOID* arg);
611 
612 UINT    _ux_host_class_audio_raw_sampling_parse(UX_HOST_CLASS_AUDIO *audio,
613                         UINT(*parse_function)(VOID  *arg,
614                                               UCHAR *packed_interface_descriptor,
615                                               UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS *sam_attr),
616                         VOID* arg);
617 
618 UINT    _ux_host_class_audio_stop(UX_HOST_CLASS_AUDIO *audio);
619 
620 VOID    _ux_host_class_audio_feedback_transfer_completed(UX_TRANSFER *transfer_request);
621 
622 UINT    _ux_host_class_audio_feedback_get(UX_HOST_CLASS_AUDIO *audio, UCHAR *feedback);
623 UINT    _ux_host_class_audio_feedback_set(UX_HOST_CLASS_AUDIO *audio, UCHAR *feedback);
624 
625 UINT    _ux_host_class_audio_entity_control_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
626 UINT    _ux_host_class_audio_entity_control_value_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
627 UINT    _ux_host_class_audio_entity_control_value_set(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
628 
629 UINT    _ux_host_class_audio_interrupt_start(UX_HOST_CLASS_AUDIO_AC *audio,
630                         VOID(*callback_function)(UX_HOST_CLASS_AUDIO_AC *audio,
631                                                  UCHAR *message, ULONG length,
632                                                  VOID *arg),
633                         VOID *arg);
634 VOID    _ux_host_class_audio_interrupt_notification(UX_TRANSFER *transfer_request);
635 
636 UINT    _uxe_host_class_audio_control_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
637 UINT    _uxe_host_class_audio_control_value_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
638 UINT    _uxe_host_class_audio_control_value_set(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
639 UINT    _uxe_host_class_audio_read(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST *audio_transfer_request);
640 UINT    _uxe_host_class_audio_streaming_sampling_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS *audio_sampling);
641 UINT    _uxe_host_class_audio_streaming_sampling_set(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_SAMPLING *audio_sampling);
642 UINT    _uxe_host_class_audio_write(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_TRANSFER_REQUEST *audio_transfer_request);
643 UINT    _uxe_host_class_audio_control_request(UX_HOST_CLASS_AUDIO *audio,
644                         UINT streaming_control,
645                         UINT request_type, UINT request,
646                         UINT request_value,
647                         UINT spec_id,
648                         UCHAR *parameter, ULONG parameter_size, ULONG *actual_size);
649 UINT    _uxe_host_class_audio_descriptors_parse(UX_HOST_CLASS_AUDIO *audio,
650                         UINT(*parse_function)(VOID  *arg,
651                                             UCHAR *packed_interface_descriptor,
652                                             UCHAR *packed_endpoint_descriptor,
653                                             UCHAR *packed_audio_descriptor),
654                         VOID* arg);
655 UINT    _uxe_host_class_audio_raw_sampling_parse(UX_HOST_CLASS_AUDIO *audio,
656                         UINT(*parse_function)(VOID  *arg,
657                                               UCHAR *packed_interface_descriptor,
658                                               UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS *sam_attr),
659                         VOID* arg);
660 UINT    _uxe_host_class_audio_stop(UX_HOST_CLASS_AUDIO *audio);
661 UINT    _uxe_host_class_audio_feedback_get(UX_HOST_CLASS_AUDIO *audio, UCHAR *feedback);
662 UINT    _uxe_host_class_audio_feedback_set(UX_HOST_CLASS_AUDIO *audio, UCHAR *feedback);
663 UINT    _uxe_host_class_audio_entity_control_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
664 UINT    _uxe_host_class_audio_entity_control_value_get(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
665 UINT    _uxe_host_class_audio_entity_control_value_set(UX_HOST_CLASS_AUDIO *audio, UX_HOST_CLASS_AUDIO_CONTROL *audio_control);
666 UINT    _uxe_host_class_audio_interrupt_start(UX_HOST_CLASS_AUDIO_AC *audio,
667                         VOID(*callback_function)(UX_HOST_CLASS_AUDIO_AC *audio,
668                                                  UCHAR *message, ULONG length,
669                                                  VOID *arg),
670                         VOID *arg);
671 
672 
673 /* Define Audio Class API prototypes.  */
674 
675 #if defined(UX_HOST_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
676 
677 #define ux_host_class_audio_entry                       _ux_host_class_audio_entry
678 
679 #define ux_host_class_audio_control_get                 _uxe_host_class_audio_control_get
680 #define ux_host_class_audio_control_value_get           _uxe_host_class_audio_control_value_get
681 #define ux_host_class_audio_control_value_set           _uxe_host_class_audio_control_value_set
682 #define ux_host_class_audio_read                        _uxe_host_class_audio_read
683 #define ux_host_class_audio_streaming_sampling_get      _uxe_host_class_audio_streaming_sampling_get
684 #define ux_host_class_audio_streaming_sampling_set      _uxe_host_class_audio_streaming_sampling_set
685 #define ux_host_class_audio_write                       _uxe_host_class_audio_write
686 
687 #define ux_host_class_audio_type_get                    _ux_host_class_audio_type_get
688 #define ux_host_class_audio_speed_get                   _ux_host_class_audio_speed_get
689 #define ux_host_class_audio_protocol_get                _ux_host_class_audio_protocol_get
690 #define ux_host_class_audio_subclass_get                _ux_host_class_audio_subclass_get
691 #define ux_host_class_audio_feedback_supported          _ux_host_class_audio_feedback_supported
692 
693 #define ux_host_class_audio_interface_get               _ux_host_class_audio_interface_get
694 #define ux_host_class_audio_control_interface_get       _ux_host_class_audio_control_interface_get
695 #define ux_host_class_audio_terminal_link_get           _ux_host_class_audio_terminal_link_get
696 
697 #define ux_host_class_audio_max_packet_size_get         _ux_host_class_audio_max_packet_size_get
698 #define ux_host_class_audio_packet_size_get             _ux_host_class_audio_packet_size_get
699 #define ux_host_class_audio_packet_freq_get             _ux_host_class_audio_packet_freq_get
700 #define ux_host_class_audio_packet_fraction_get         _ux_host_class_audio_packet_fraction_get
701 
702 #define ux_host_class_audio_feedback_get                _uxe_host_class_audio_feedback_get
703 #define ux_host_class_audio_feedback_set                _uxe_host_class_audio_feedback_set
704 
705 #define ux_host_class_audio_control_request             _uxe_host_class_audio_control_request
706 
707 #define ux_host_class_audio_descriptors_parse           _uxe_host_class_audio_descriptors_parse
708 
709 #define ux_host_class_audio_entity_control_get          _uxe_host_class_audio_entity_control_get
710 #define ux_host_class_audio_entity_control_value_get    _uxe_host_class_audio_entity_control_value_get
711 #define ux_host_class_audio_entity_control_value_set    _uxe_host_class_audio_entity_control_value_set
712 
713 #define ux_host_class_audio_raw_sampling_parse          _uxe_host_class_audio_raw_sampling_parse
714 #define ux_host_class_audio_raw_sampling_start          _uxe_host_class_audio_streaming_sampling_set
715 
716 #define ux_host_class_audio_stop                        _uxe_host_class_audio_stop
717 
718 #define ux_host_class_audio_interrupt_start             _uxe_host_class_audio_interrupt_start
719 
720 
721 #else
722 
723 #define ux_host_class_audio_entry                       _ux_host_class_audio_entry
724 #define ux_host_class_audio_control_get                 _ux_host_class_audio_control_get
725 #define ux_host_class_audio_control_value_get           _ux_host_class_audio_control_value_get
726 #define ux_host_class_audio_control_value_set           _ux_host_class_audio_control_value_set
727 #define ux_host_class_audio_read                        _ux_host_class_audio_read
728 #define ux_host_class_audio_streaming_sampling_get      _ux_host_class_audio_streaming_sampling_get
729 #define ux_host_class_audio_streaming_sampling_set      _ux_host_class_audio_streaming_sampling_set
730 #define ux_host_class_audio_streaming_terminal_get      _ux_host_class_audio_streaming_terminal_get
731 #define ux_host_class_audio_write                       _ux_host_class_audio_write
732 
733 #define ux_host_class_audio_type_get                    _ux_host_class_audio_type_get
734 #define ux_host_class_audio_speed_get                   _ux_host_class_audio_speed_get
735 #define ux_host_class_audio_protocol_get                _ux_host_class_audio_protocol_get
736 #define ux_host_class_audio_subclass_get                _ux_host_class_audio_subclass_get
737 #define ux_host_class_audio_feedback_supported          _ux_host_class_audio_feedback_supported
738 
739 #define ux_host_class_audio_interface_get               _ux_host_class_audio_interface_get
740 #define ux_host_class_audio_control_interface_get       _ux_host_class_audio_control_interface_get
741 #define ux_host_class_audio_terminal_link_get           _ux_host_class_audio_terminal_link_get
742 
743 #define ux_host_class_audio_max_packet_size_get         _ux_host_class_audio_max_packet_size_get
744 #define ux_host_class_audio_packet_size_get             _ux_host_class_audio_packet_size_get
745 #define ux_host_class_audio_packet_freq_get             _ux_host_class_audio_packet_freq_get
746 #define ux_host_class_audio_packet_fraction_get         _ux_host_class_audio_packet_fraction_get
747 
748 #define ux_host_class_audio_feedback_get                _ux_host_class_audio_feedback_get
749 #define ux_host_class_audio_feedback_set                _ux_host_class_audio_feedback_set
750 
751 #define ux_host_class_audio_control_request             _ux_host_class_audio_control_request
752 
753 #define ux_host_class_audio_descriptors_parse           _ux_host_class_audio_descriptors_parse
754 
755 #define ux_host_class_audio_entity_control_get          _ux_host_class_audio_entity_control_get
756 #define ux_host_class_audio_entity_control_value_get    _ux_host_class_audio_entity_control_value_get
757 #define ux_host_class_audio_entity_control_value_set    _ux_host_class_audio_entity_control_value_set
758 
759 #define ux_host_class_audio_raw_sampling_parse          _ux_host_class_audio_raw_sampling_parse
760 #define ux_host_class_audio_raw_sampling_start          _ux_host_class_audio_streaming_sampling_set
761 
762 #define ux_host_class_audio_stop                        _ux_host_class_audio_stop
763 
764 #define ux_host_class_audio_interrupt_start             _ux_host_class_audio_interrupt_start
765 
766 #endif
767 
768 
769 /* Determine if a C++ compiler is being used.  If so, complete the standard
770    C conditional started above.  */
771 #ifdef __cplusplus
772 }
773 #endif
774 
775 #endif
776 
777 
778