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 /**   Device Audio Class                                                  */
18 /**                                                                       */
19 /**************************************************************************/
20 /**************************************************************************/
21 
22 
23 /**************************************************************************/
24 /*                                                                        */
25 /*  COMPONENT DEFINITION                                   RELEASE        */
26 /*                                                                        */
27 /*    ux_device_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 /*  01-31-2022     Chaoqiong Xiao           Modified comment(s),          */
53 /*                                            added feedback support,     */
54 /*                                            resulting in version 6.1.10 */
55 /*  04-25-2022     Chaoqiong Xiao           Modified comment(s),          */
56 /*                                            fixed standalone compile,   */
57 /*                                            resulting in version 6.1.11 */
58 /*  07-29-2022     Chaoqiong Xiao           Modified comment(s),          */
59 /*                                            added interrupt support,    */
60 /*                                            resulting in version 6.1.12 */
61 /*  10-31-2022     Yajun Xia                Modified comment(s),          */
62 /*                                            added standalone support,   */
63 /*                                            resulting in version 6.2.0  */
64 /*  03-08-2023     Chaoqiong Xiao           Modified comment(s),          */
65 /*                                            added error checks support, */
66 /*                                            resulting in version 6.2.1  */
67 /*  10-31-2023     Chaoqiong Xiao           Modified comment(s),          */
68 /*                                            added a new mode to manage  */
69 /*                                            endpoint buffer in classes  */
70 /*                                            with zero copy enabled,     */
71 /*                                            resulting in version 6.3.0  */
72 /*                                                                        */
73 /**************************************************************************/
74 
75 #ifndef UX_DEVICE_CLASS_AUDIO_H
76 #define UX_DEVICE_CLASS_AUDIO_H
77 
78 /* Determine if a C++ compiler is being used.  If so, ensure that standard
79    C is used to process the API information.  */
80 
81 #ifdef   __cplusplus
82 
83 /* Yes, C++ compiler is present.  Use standard C.  */
84 extern   "C" {
85 
86 #endif
87 
88 
89 /* Compile option: if defined, audio feedback endpoint is supported.  */
90 /* #define UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT  */
91 
92 /* Compile option: if defined, audio interrupt endpoint is supported.  */
93 /* #define UX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT  */
94 
95 /* Internal option: enable the basic USBX error checking. This define is typically used
96    while debugging application.  */
97 #if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
98 #define UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING
99 #endif
100 
101 
102 /* Works if UX_DEVICE_ENDPOINT_BUFFER_OWNER is 1.
103      If defined, it represents feedback endpoint buffer size.
104      It should be larger than feedback endpoint max packet size in framework.  */
105 #define UX_DEVICE_CLASS_AUDIO_FEEDBACK_BUFFER_SIZE                  8
106 
107 
108 /* Define Audio Class OS related constants.  */
109 #define UX_DEVICE_CLASS_AUDIO_FEEDBACK_THREAD_STACK_SIZE            UX_THREAD_STACK_SIZE
110 #define UX_DEVICE_CLASS_AUDIO_INTERRUPT_THREAD_STACK_SIZE           UX_THREAD_STACK_SIZE
111 
112 /* Define Audio Class function (AF) constants.  */
113 
114 #define UX_DEVICE_CLASS_AUDIO_FUNCTION_CLASS                        1
115 #define UX_DEVICE_CLASS_AUDIO_FUNCTION_SUBCLASS_UNDEFINED           0
116 #define UX_DEVICE_CLASS_AUDIO_FUNCTION_PROTOCOL_UNDEFINED           0
117 #define UX_DEVICE_CLASS_AUDIO_FUNCTION_PROTOCOL_VERSION_02_00       0x20
118 
119 /* Define Audio Class interface constants.  */
120 
121 #define UX_DEVICE_CLASS_AUDIO_CLASS                                 1
122 
123 #define UX_DEVICE_CLASS_AUDIO_SUBCLASS_UNDEFINED                    0
124 #define UX_DEVICE_CLASS_AUDIO_SUBCLASS_CONTROL                      1
125 #define UX_DEVICE_CLASS_AUDIO_SUBCLASS_AUDIOSTREAMING               2
126 #define UX_DEVICE_CLASS_AUDIO_SUBCLASS_MIDISTREAMING                3
127 
128 #define UX_DEVICE_CLASS_AUDIO_PROTOCOL_UNDEFINED                    0
129 #define UX_DEVICE_CLASS_AUTIO_PROTOCOL_VERSION_02_00                0x20
130 
131 
132 /* Define Audio Class-specific (CS) descriptor types.  */
133 
134 #define UX_DEVICE_CLASS_AUDIO_CS_UNDEFINED                          0x20
135 #define UX_DEVICE_CLASS_AUDIO_CS_DEVICE                             0x21
136 #define UX_DEVICE_CLASS_AUDIO_CS_CONFIGURATION                      0x22
137 #define UX_DEVICE_CLASS_AUDIO_CS_STRING                             0x23
138 #define UX_DEVICE_CLASS_AUDIO_CS_INTERFACE                          0x24
139 #define UX_DEVICE_CLASS_AUDIO_CS_ENDPOINT                           0x25
140 
141 
142 /* Define Audio Class specific AC interface descriptor subclasses.  */
143 
144 #define UX_DEVICE_CLASS_AUDIO_AC_UNDEFINED                          0x00
145 #define UX_DEVICE_CLASS_AUDIO_AC_HEADER                             0x01
146 #define UX_DEVICE_CLASS_AUDIO_AC_INPUT_TERMINAL                     0x02
147 #define UX_DEVICE_CLASS_AUDIO_AC_OUTPUT_TERMINAL                    0x03
148 #define UX_DEVICE_CLASS_AUDIO_AC_FEATURE_UNIT                       0x06
149 
150 
151 /* Define Audio Class specific AS interface descriptor subclasses.  */
152 
153 #define UX_DEVICE_CLASS_AUDIO_AS_UNDEFINED                          0x00
154 #define UX_DEVICE_CLASS_AUDIO_AS_GENERAL                            0x01
155 #define UX_DEVICE_CLASS_AUDIO_AS_FORMAT_TYPE                        0x02
156 
157 
158 /* Define Audio Class data endpoint descriptor attributes.  */
159 
160 #define UX_DEVICE_CLASS_AUDIO_EP_TRANSFER_TYPE_MASK                 (0x3u<<0)
161 #define UX_DEVICE_CLASS_AUDIO_EP_TRANSFER_TYPE_ISOCHRONOUS          (0x1u<<0)
162 
163 #define UX_DEVICE_CLASS_AUDIO_EP_SYNCHRONIZATION_TYPE_MASK          (0x3u<<2)
164 #define UX_DEVICE_CLASS_AUDIO_EP_SYNCHRONIZATION_TYPE_ASYNCHRONOUS  (0x1u<<2)
165 #define UX_DEVICE_CLASS_AUDIO_EP_SYNCHRONIZATION_TYPE_ADAPTIVE      (0x2u<<2)
166 #define UX_DEVICE_CLASS_AUDIO_EP_SYNCHRONIZATION_TYPE_SYNCHRONOUS   (0x3u<<2)
167 
168 #define UX_DEVICE_CLASS_AUDIO_EP_USAGE_TYPE_MASK                    (0x3u<<4)
169 #define UX_DEVICE_CLASS_AUDIO_EP_USAGE_TYPE_DATA                    (0x0u<<4)
170 #define UX_DEVICE_CLASS_AUDIO_EP_USAGE_TYPE_FEEDBACK                (0x1u<<4)
171 #define UX_DEVICE_CLASS_AUDIO_EP_USAGE_TYPE_IMPLICIT_FEEDBACK       (0x2u<<4)
172 
173 
174 /* Define Audio Class specific endpoint descriptor subtypes.  */
175 
176 #define UX_DEVICE_CLASS_AUDIO_EP_UNDEFINED                          0x00
177 #define UX_DEVICE_CLASS_AUDIO_EP_GENERAL                            0x01
178 
179 
180 /* Define Audio Class specific request codes.  */
181 
182 #define UX_DEVICE_CLASS_AUDIO_REQUEST_CODE_UNDEFINED                0x00
183 
184 #define UX_DEVICE_CLASS_AUDIO_bmRequestType_GET_INTERFACE           0xA1
185 #define UX_DEVICE_CLASS_AUDIO_bmRequestType_SET_INTERFACE           0x21
186 #define UX_DEVICE_CLASS_AUDIO_bmRequestType_GET_ENDPOINT            0xA2
187 #define UX_DEVICE_CLASS_AUDIO_bmRequestType_SET_ENDPOINT            0x22
188 
189 #define UX_DEVICE_CLASS_AUDIO_REQUEST_REQUEST_TYPE                  0
190 #define UX_DEVICE_CLASS_AUDIO_REQUEST_REQUEST                       1
191 
192 #define UX_DEVICE_CLASS_AUDIO_REQUEST_VALUE_LOW                     2
193 #define UX_DEVICE_CLASS_AUDIO_REQUEST_CHANNEL_NUMBER                2
194 #define UX_DEVICE_CLASS_AUDIO_REQUEST_CN                            2
195 #define UX_DEVICE_CLASS_AUDIO_REQUEST_MIXER_CONTROL_NUMBER          2
196 #define UX_DEVICE_CLASS_AUDIO_REQUEST_MCN                           2
197 
198 #define UX_DEVICE_CLASS_AUDIO_REQUEST_VALUE_HIGH                    3
199 #define UX_DEVICE_CLASS_AUDIO_REQUEST_CONTROL_SELECTOR              3
200 #define UX_DEVICE_CLASS_AUDIO_REQUEST_CS                            3
201 
202 #define UX_DEVICE_CLASS_AUDIO_REQUEST_INDEX_LOW                     4
203 #define UX_DEVICE_CLASS_AUDIO_REQUEST_ENDPOINT                      4
204 #define UX_DEVICE_CLASS_AUDIO_REQUEST_INTERFACE                     4
205 
206 #define UX_DEVICE_CLASS_AUDIO_REQUEST_INDEX_HIGH                    5
207 #define UX_DEVICE_CLASS_AUDIO_REQUEST_ENEITY_ID                     5
208 
209 #define UX_DEVICE_CLASS_AUDIO_REQUEST_LENGTH                        6
210 
211 
212 /* Define Audio Class terminal types.  */
213 
214 #define UX_DEVICE_CLASS_AUDIO_UNDEFINED                             0x0100
215 #define UX_DEVICE_CLASS_AUDIO_USB_STREAMING                         0x0101
216 #define UX_DEVICE_CLASS_AUDIO_USB_VENDOR_SPECIFIC                   0x01FF
217 
218 
219 /* Define Audio Class input terminal types.  */
220 
221 #define UX_DEVICE_CLASS_AUDIO_INPUT                                 0x0200
222 #define UX_DEVICE_CLASS_AUDIO_MICROPHONE                            0x0201
223 #define UX_DEVICE_CLASS_AUDIO_DESKTOP_MICROPHONE                    0x0202
224 #define UX_DEVICE_CLASS_AUDIO_PERSONAL_MICROPHONE                   0x0203
225 #define UX_DEVICE_CLASS_AUDIO_OMNI_DIRECTIONAL_MICROPHONE           0x0204
226 #define UX_DEVICE_CLASS_AUDIO_MICROPHONE_ARRAY                      0x0205
227 #define UX_DEVICE_CLASS_AUDIO_PROCESSING_MICROPHONE_ARRAY           0x0206
228 
229 
230 /* Define Audio Class output terminal types.  */
231 
232 #define UX_DEVICE_CLASS_AUDIO_OUTPUT                                0x0300
233 #define UX_DEVICE_CLASS_AUDIO_SPEAKER                               0x0301
234 #define UX_DEVICE_CLASS_AUDIO_HEADPHONES                            0x0302
235 #define UX_DEVICE_CLASS_AUDIO_HEAD_MOUNTED_DISPLAY                  0x0303
236 #define UX_DEVICE_CLASS_AUDIO_DESKTOP_SPEAKER                       0x0304
237 #define UX_DEVICE_CLASS_AUDIO_ROOM_SPEAKER                          0x0305
238 #define UX_DEVICE_CLASS_AUDIO_COMMUNICATION_SPEAKER                 0x0306
239 #define UX_DEVICE_CLASS_AUDIO_LOW_FREQUENCY_SPEAKER                 0x0307
240 
241 
242 /* Define Audio Class bidirectional terminal types.  */
243 
244 #define UX_DEVICE_CLASS_AUDIO_BIDIRECTIONAL_UNDEFINED               0x0400
245 #define UX_DEVICE_CLASS_AUDIO_HANDSET                               0x0401
246 #define UX_DEVICE_CLASS_AUDIO_HEADSET                               0x0402
247 #define UX_DEVICE_CLASS_AUDIO_SPEAKERPHONE                          0x0403
248 #define UX_DEVICE_CLASS_AUDIO_ECHO_SUPRESS_SPEAKERPHONE             0x0404
249 #define UX_DEVICE_CLASS_AUDIO_ECHO_CANCEL_SPEAKERPHONE              0x0405
250 
251 
252 /* Define Audio Class telephony terminal types.  */
253 
254 #define UX_DEVICE_CLASS_AUDIO_TELEPHONTY_UNDEFINED                  0x0500
255 #define UX_DEVICE_CLASS_AUDIO_PHONE_LINE                            0x0501
256 #define UX_DEVICE_CLASS_AUDIO_TELEPHONE                             0x0502
257 #define UX_DEVICE_CLASS_AUDIO_DOWN_LINE_PHONE                       0x0503
258 
259 
260 /* Define Audio Class external terminal types.  */
261 
262 #define UX_DEVICE_CLASS_AUDIO_EXTERNAL_UNDEFINED                    0x0600
263 #define UX_DEVICE_CLASS_AUDIO_ANALOG_CONNECTOR                      0x0601
264 #define UX_DEVICE_CLASS_AUDIO_DIGITAL_AUDIO_INTERFACE               0x0602
265 #define UX_DEVICE_CLASS_AUDIO_LINE_CONNECTOR                        0x0603
266 #define UX_DEVICE_CLASS_AUDIO_LEGACY_AUDIO_CONNECTOR                0x0604
267 #define UX_DEVICE_CLASS_AUDIO_S_PDIF_INTERFACE                      0x0605
268 #define UX_DEVICE_CLASS_AUDIO_1394_DA_STREAM                        0x0606
269 #define UX_DEVICE_CLASS_AUDIO_1394_DV_STREAM_SOUNDTRACK             0x0607
270 #define UX_DEVICE_CLASS_AUDIO_ADAT_LIGHTPIPE                        0x0608
271 #define UX_DEVICE_CLASS_AUDIO_TDIF                                  0x0609
272 #define UX_DEVICE_CLASS_AUDIO_MADI                                  0x060A
273 
274 
275 /* Define Audio Class embedded function terminal types.  */
276 
277 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_UNDEFINED                    0x0700
278 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_LEVEL_CALIB_NOISE_SRC        0x0701
279 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_EQUALIZATION_NOISE           0x0702
280 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_CD_PLAYER                    0x0703
281 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DAT                          0x0704
282 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DCC                          0x0705
283 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_MINIDISK                     0x0706
284 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_ANALOG_TAPE                  0x0707
285 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_PHONOGRAPH                   0x0708
286 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_VCR_AUDIO                    0x0709
287 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_VIDEO_DISC_AUDIO             0x070A
288 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DVD_AUDIO                    0x070B
289 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_TV_TUNER_AUDIO               0x070C
290 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_SATELLITE_RECEIVER_AUDIO     0x070D
291 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_CABLE_TUNER_AUDIO            0x070E
292 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DSS_AUDIO                    0x070F
293 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_RADIO_RECEIVER               0x0710
294 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_RADIO_TRANSMITTER            0x0711
295 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_MULTI_TRACK_RECORDER         0x0712
296 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_SYNTHESIZER                  0x0713
297 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_PIANO                        0x0714
298 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_GUITAR                       0x0715
299 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DRUMS_RHYTHM                 0x0716
300 #define UX_DEVICE_CLASS_AUDIO_EMBEDDED_OTHER                        0x0717
301 
302 
303 /* Define Audio Class encoding format types.  */
304 
305 #define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_UNDEFINED                 0
306 #define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_I                         1
307 #define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_II                        2
308 #define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_III                       3
309 #define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_IV                        4
310 #define UX_DEVICE_CLASS_AUDIO_EXT_FORMAT_TYPE_I                     0x81
311 #define UX_DEVICE_CLASS_AUDIO_EXT_FORMAT_TYPE_II                    0x82
312 #define UX_DEVICE_CLASS_AUDIO_EXT_FORMAT_TYPE_III                   0x83
313 
314 
315 /* Define channels.  */
316 
317 #define UX_DEVICE_CLASS_AUDIO_MASTER_CHANNEL                        0
318 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_1                             1
319 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_2                             2
320 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_3                             3
321 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_4                             4
322 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_5                             5
323 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_6                             6
324 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_7                             7
325 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_8                             8
326 #define UX_DEVICE_CLASS_AUDIO_CHANNEL_9                             9
327 
328 
329 /* Define IOCTL code.
330      ux_device_class_audio_ioctl(audio, IOCTL_CODE, parameter).
331  */
332 
333 #define UX_DEVICE_CLASS_AUDIO_IOCTL_GET_ARG                         1
334 
335 /* Define Audio Class Task states.  */
336 #define UX_DEVICE_CLASS_AUDIO_INTERRUPT_STOP            (UX_STATE_RESET)
337 #define UX_DEVICE_CLASS_AUDIO_INTERRUPT_START           (UX_STATE_STEP + 1)
338 #define UX_DEVICE_CLASS_AUDIO_INTERRUPT_WAIT            (UX_STATE_STEP + 2)
339 
340 #define UX_DEVICE_CLASS_AUDIO_STREAM_RW_STOP            (UX_STATE_RESET)
341 #define UX_DEVICE_CLASS_AUDIO_STREAM_RW_START           (UX_STATE_STEP + 1)
342 #define UX_DEVICE_CLASS_AUDIO_STREAM_RW_WAIT            (UX_STATE_STEP + 2)
343 
344 #define UX_DEVICE_CLASS_AUDIO_STREAM_FEEDBACK_RW_STOP   (UX_STATE_RESET)
345 #define UX_DEVICE_CLASS_AUDIO_STREAM_FEEDBACK_RW_WAIT   (UX_STATE_STEP + 1)
346 
347 /* Define Audio Class callback structure.  */
348 
349 struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT;
350 struct UX_DEVICE_CLASS_AUDIO_STRUCT;
351 
352 typedef struct UX_DEVICE_CLASS_AUDIO_CALLBACKS_STRUCT
353 {
354 
355     VOID        (*ux_slave_class_audio_instance_activate)(VOID *);
356     VOID        (*ux_slave_class_audio_instance_deactivate)(VOID *);
357     UINT        (*ux_device_class_audio_control_process)(struct UX_DEVICE_CLASS_AUDIO_STRUCT *, UX_SLAVE_TRANSFER *);
358     VOID         *ux_device_class_audio_arg;
359 } UX_DEVICE_CLASS_AUDIO_CALLBACKS;
360 
361 typedef struct UX_DEVICE_CLASS_AUDIO_STREAM_CALLBACKS_STRUCT
362 {
363     VOID        (*ux_device_class_audio_stream_change)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT *, ULONG);
364     VOID        (*ux_device_class_audio_stream_frame_done)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT *, ULONG);
365 } UX_DEVICE_CLASS_AUDIO_STREAM_CALLBACKS;
366 
367 
368 /* Define Audio Class Calling Parameter structure */
369 
370 typedef struct UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER_STRUCT
371 {
372 #if !defined(UX_DEVICE_STANDALONE)
373     ULONG                                         ux_device_class_audio_stream_parameter_thread_stack_size;
374     VOID                                        (*ux_device_class_audio_stream_parameter_thread_entry)(ULONG id);
375 #else
376     UINT                                        (*ux_device_class_audio_stream_parameter_task_function)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT*);
377 #endif
378 
379 #if defined(UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT)
380 #if !defined(UX_DEVICE_STANDALONE)
381     ULONG                                         ux_device_class_audio_stream_parameter_feedback_thread_stack_size;
382     VOID                                        (*ux_device_class_audio_stream_parameter_feedback_thread_entry)(ULONG id);
383 #else
384     UINT                                        (*ux_device_class_audio_stream_parameter_feedback_task_function)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT*);
385 #endif
386 #endif
387     UX_DEVICE_CLASS_AUDIO_STREAM_CALLBACKS        ux_device_class_audio_stream_parameter_callbacks;
388 
389     ULONG                                         ux_device_class_audio_stream_parameter_max_frame_buffer_size;
390     ULONG                                         ux_device_class_audio_stream_parameter_max_frame_buffer_nb;
391 } UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER;
392 
393 typedef struct UX_DEVICE_CLASS_AUDIO_PARAMETER_STRUCT
394 {
395     ULONG                                         ux_device_class_audio_parameter_master_interface;
396     UX_DEVICE_CLASS_AUDIO_CALLBACKS               ux_device_class_audio_parameter_callbacks;
397 
398     ULONG                                         ux_device_class_audio_parameter_streams_nb;
399     UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER       *ux_device_class_audio_parameter_streams;
400 
401 #if defined(UX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT)
402     ULONG                                         ux_device_class_audio_parameter_status_size;
403     ULONG                                         ux_device_class_audio_parameter_status_queue_size;
404 #endif
405 } UX_DEVICE_CLASS_AUDIO_PARAMETER;
406 
407 
408 /* Define Audio Class instance structure.  */
409 
410 typedef struct UX_DEVICE_CLASS_AUDIO_FRAME_STRUCT
411 {
412 
413     ULONG                                   ux_device_class_audio_frame_length;
414     ULONG                                   ux_device_class_audio_frame_pos;
415     UCHAR                                   ux_device_class_audio_frame_data[4];
416 } UX_DEVICE_CLASS_AUDIO_FRAME;
417 
418 typedef struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT
419 {
420 
421     struct UX_DEVICE_CLASS_AUDIO_STRUCT     *ux_device_class_audio_stream_audio;
422     UX_SLAVE_INTERFACE                      *ux_device_class_audio_stream_interface;
423     UX_SLAVE_ENDPOINT                       *ux_device_class_audio_stream_endpoint;
424 
425 #if defined(UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT)
426     UX_SLAVE_ENDPOINT                       *ux_device_class_audio_stream_feedback;
427 
428 #if UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1
429     UCHAR                                   *ux_device_class_audio_stream_feedback_buffer;
430 #endif
431 
432 
433 #if !defined(UX_DEVICE_STANDALONE)
434     UCHAR                                   *ux_device_class_audio_stream_feedback_thread_stack;
435     UX_THREAD                                ux_device_class_audio_stream_feedback_thread;
436 #else
437     UINT                                   (*ux_device_class_audio_stream_feedback_task_function)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT*);
438     UINT                                     ux_device_class_audio_stream_feedback_task_state;
439     UINT                                     ux_device_class_audio_stream_feedback_task_status;
440 #endif
441 #endif
442 
443     UX_DEVICE_CLASS_AUDIO_STREAM_CALLBACKS   ux_device_class_audio_stream_callbacks;
444 
445 #if !defined(UX_DEVICE_STANDALONE)
446     UCHAR                                   *ux_device_class_audio_stream_thread_stack;
447     UX_THREAD                                ux_device_class_audio_stream_thread;
448 #else
449     UINT                                   (*ux_device_class_audio_stream_task_function)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT*);
450     UINT                                     ux_device_class_audio_stream_task_state;
451     UINT                                     ux_device_class_audio_stream_task_status;
452 #endif
453 
454     UCHAR                                   *ux_device_class_audio_stream_buffer;
455     ULONG                                    ux_device_class_audio_stream_buffer_size;
456     ULONG                                    ux_device_class_audio_stream_frame_buffer_size;
457     ULONG                                    ux_device_class_audio_stream_buffer_error_count;
458 
459     UX_DEVICE_CLASS_AUDIO_FRAME             *ux_device_class_audio_stream_transfer_pos;
460     UX_DEVICE_CLASS_AUDIO_FRAME             *ux_device_class_audio_stream_access_pos;
461 } UX_DEVICE_CLASS_AUDIO_STREAM;
462 
463 typedef struct UX_DEVICE_CLASS_AUDIO_STRUCT
464 {
465 
466     UX_SLAVE_CLASS                          *ux_device_class_audio_class;
467     UX_SLAVE_DEVICE                         *ux_device_class_audio_device;
468     UX_SLAVE_INTERFACE                      *ux_device_class_audio_interface;
469 
470     UX_DEVICE_CLASS_AUDIO_CALLBACKS          ux_device_class_audio_callbacks;
471 
472     ULONG                                    ux_device_class_audio_streams_nb;
473     UX_DEVICE_CLASS_AUDIO_STREAM            *ux_device_class_audio_streams;
474 
475 #if defined(UX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT)
476     UX_SLAVE_ENDPOINT                       *ux_device_class_audio_interrupt;
477 
478 #if UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1
479     UCHAR                                   *ux_device_class_audio_interrupt_buffer;
480 #endif
481 
482     ULONG                                   ux_device_class_audio_status_size;       /* in Bytes.  */
483     ULONG                                   ux_device_class_audio_status_queue_bytes;/* in Bytes.  */
484     ULONG                                   ux_device_class_audio_status_queued;     /* in Bytes.  */
485     UCHAR                                   *ux_device_class_audio_status_queue;     /* in Bytes.  */
486     UCHAR                                   *ux_device_class_audio_status_head;
487     UCHAR                                   *ux_device_class_audio_status_tail;
488 
489 #if !defined(UX_DEVICE_STANDALONE)
490     UX_SEMAPHORE                            ux_device_class_audio_status_semaphore;
491     UX_MUTEX                                ux_device_class_audio_status_mutex;
492 #else
493     UINT                                    ux_device_class_audio_interrupt_task_state;
494     UINT                                    ux_device_class_audio_interrupt_task_status;
495 #endif
496 #endif
497 } UX_DEVICE_CLASS_AUDIO;
498 
499 
500 /* Define Audio Class function prototypes.  */
501 
502 UINT    _ux_device_class_audio_initialize(UX_SLAVE_CLASS_COMMAND *command);
503 UINT    _ux_device_class_audio_uninitialize(UX_SLAVE_CLASS_COMMAND *command);
504 UINT    _ux_device_class_audio_activate(UX_SLAVE_CLASS_COMMAND *command);
505 UINT    _ux_device_class_audio_change(UX_SLAVE_CLASS_COMMAND *command);
506 UINT    _ux_device_class_audio_deactivate(UX_SLAVE_CLASS_COMMAND *command);
507 UINT    _ux_device_class_audio_control_request(UX_SLAVE_CLASS_COMMAND *command);
508 
509 UINT    _ux_device_class_audio_entry(UX_SLAVE_CLASS_COMMAND *command);
510 
511 UINT    _ux_device_class_audio_ioctl(UX_DEVICE_CLASS_AUDIO *audio, ULONG ioctl_function,
512                                      VOID *parameter);
513 
514 UINT    _ux_device_class_audio_stream_get(UX_DEVICE_CLASS_AUDIO *audio, ULONG stream_index, UX_DEVICE_CLASS_AUDIO_STREAM **stream);
515 
516 VOID    _ux_device_class_audio_write_thread_entry(ULONG audio_stream);
517 VOID    _ux_device_class_audio_read_thread_entry(ULONG audio_stream);
518 UINT    _ux_device_class_audio_write_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
519 UINT    _ux_device_class_audio_read_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
520 UINT    _ux_device_class_audio_reception_start(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
521 UINT    _ux_device_class_audio_sample_read8(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *sample);
522 UINT    _ux_device_class_audio_sample_read16(UX_DEVICE_CLASS_AUDIO_STREAM *audio, USHORT *sample);
523 UINT    _ux_device_class_audio_sample_read24(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG *sample);
524 UINT    _ux_device_class_audio_sample_read32(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG *sample);
525 
526 UINT    _ux_device_class_audio_read_frame_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR **frame_data, ULONG *frame_length);
527 UINT    _ux_device_class_audio_read_frame_free(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
528 
529 UINT    _ux_device_class_audio_transmission_start(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
530 UINT    _ux_device_class_audio_frame_write(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *frame, ULONG length);
531 
532 UINT    _ux_device_class_audio_write_frame_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR **buffer, ULONG *max_length);
533 UINT    _ux_device_class_audio_write_frame_commit(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG length);
534 
535 VOID    _ux_device_class_audio_feedback_thread_entry(ULONG audio_stream);
536 UINT    _ux_device_class_audio_feedback_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
537 UINT    _ux_device_class_audio_feedback_set(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *encoded_feedback);
538 UINT    _ux_device_class_audio_feedback_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *encoded_feedback);
539 ULONG   _ux_device_class_audio_speed_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
540 
541 VOID    _ux_device_class_audio_interrupt_thread_entry(ULONG audio_inst);
542 UINT    _ux_device_class_audio_interrupt_task_function(UX_DEVICE_CLASS_AUDIO *audio);
543 UINT    _ux_device_class_audio_interrupt_send(UX_DEVICE_CLASS_AUDIO *audio, UCHAR *int_data);
544 
545 UINT    _ux_device_class_audio_tasks_run(VOID *instance);
546 
547 
548 UINT    _uxe_device_class_audio_initialize(UX_SLAVE_CLASS_COMMAND *command);
549 
550 UINT    _uxe_device_class_audio_ioctl(UX_DEVICE_CLASS_AUDIO *audio, ULONG ioctl_function,
551                                      VOID *parameter);
552 
553 UINT    _uxe_device_class_audio_stream_get(UX_DEVICE_CLASS_AUDIO *audio, ULONG stream_index, UX_DEVICE_CLASS_AUDIO_STREAM **stream);
554 
555 VOID    _uxe_device_class_audio_write_thread_entry(ULONG audio_stream);
556 VOID    _uxe_device_class_audio_read_thread_entry(ULONG audio_stream);
557 UINT    _uxe_device_class_audio_write_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
558 UINT    _uxe_device_class_audio_read_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
559 UINT    _uxe_device_class_audio_reception_start(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
560 UINT    _uxe_device_class_audio_sample_read8(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *sample);
561 UINT    _uxe_device_class_audio_sample_read16(UX_DEVICE_CLASS_AUDIO_STREAM *audio, USHORT *sample);
562 UINT    _uxe_device_class_audio_sample_read24(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG *sample);
563 UINT    _uxe_device_class_audio_sample_read32(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG *sample);
564 
565 UINT    _uxe_device_class_audio_read_frame_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR **frame_data, ULONG *frame_length);
566 UINT    _uxe_device_class_audio_read_frame_free(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
567 
568 UINT    _uxe_device_class_audio_transmission_start(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
569 UINT    _uxe_device_class_audio_frame_write(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *frame, ULONG length);
570 
571 UINT    _uxe_device_class_audio_write_frame_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR **buffer, ULONG *max_length);
572 UINT    _uxe_device_class_audio_write_frame_commit(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG length);
573 
574 UINT    _uxe_device_class_audio_feedback_set(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *encoded_feedback);
575 UINT    _uxe_device_class_audio_feedback_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *encoded_feedback);
576 ULONG   _uxe_device_class_audio_speed_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
577 
578 VOID    _uxe_device_class_audio_interrupt_thread_entry(ULONG audio_inst);
579 UINT    _uxe_device_class_audio_interrupt_task_function(UX_DEVICE_CLASS_AUDIO *audio);
580 UINT    _uxe_device_class_audio_interrupt_send(UX_DEVICE_CLASS_AUDIO *audio, UCHAR *int_data);
581 
582 
583 /* Define Device Class Audio API prototypes.  */
584 
585 #if defined(UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
586 
587 #define ux_device_class_audio_entry                   _ux_device_class_audio_entry
588 
589 #define ux_device_class_audio_read_thread_entry       _ux_device_class_audio_read_thread_entry
590 #define ux_device_class_audio_write_thread_entry      _ux_device_class_audio_write_thread_entry
591 
592 #define ux_device_class_audio_read_task_function      _ux_device_class_audio_read_task_function
593 #define ux_device_class_audio_write_task_function     _ux_device_class_audio_write_task_function
594 
595 #define ux_device_class_audio_stream_get              _uxe_device_class_audio_stream_get
596 
597 #define ux_device_class_audio_reception_start         _uxe_device_class_audio_reception_start
598 #define ux_device_class_audio_sample_read8            _uxe_device_class_audio_sample_read8
599 #define ux_device_class_audio_sample_read16           _uxe_device_class_audio_sample_read16
600 #define ux_device_class_audio_sample_read24           _uxe_device_class_audio_sample_read24
601 #define ux_device_class_audio_sample_read32           _uxe_device_class_audio_sample_read32
602 
603 #define ux_device_class_audio_read_frame_get          _uxe_device_class_audio_read_frame_get
604 #define ux_device_class_audio_read_frame_free         _uxe_device_class_audio_read_frame_free
605 
606 #define ux_device_class_audio_transmission_start      _uxe_device_class_audio_transmission_start
607 #define ux_device_class_audio_frame_write             _uxe_device_class_audio_frame_write
608 
609 #define ux_device_class_audio_write_frame_get         _uxe_device_class_audio_write_frame_get
610 #define ux_device_class_audio_write_frame_commit      _uxe_device_class_audio_write_frame_commit
611 
612 #define ux_device_class_audio_ioctl                   _uxe_device_class_audio_ioctl
613 
614 #define ux_device_class_audio_speed_get               _ux_device_class_audio_speed_get
615 #define ux_device_class_audio_feedback_thread_entry   _ux_device_class_audio_feedback_thread_entry
616 #define ux_device_class_audio_feedback_task_function  _ux_device_class_audio_feedback_task_function
617 #define ux_device_class_audio_feedback_get            _uxe_device_class_audio_feedback_get
618 #define ux_device_class_audio_feedback_set            _uxe_device_class_audio_feedback_set
619 
620 #define ux_device_class_audio_interrupt_send          _uxe_device_class_audio_interrupt_send
621 
622 #else
623 
624 #define ux_device_class_audio_entry                   _ux_device_class_audio_entry
625 
626 #define ux_device_class_audio_read_thread_entry       _ux_device_class_audio_read_thread_entry
627 #define ux_device_class_audio_write_thread_entry      _ux_device_class_audio_write_thread_entry
628 
629 #define ux_device_class_audio_read_task_function      _ux_device_class_audio_read_task_function
630 #define ux_device_class_audio_write_task_function     _ux_device_class_audio_write_task_function
631 
632 #define ux_device_class_audio_stream_get              _ux_device_class_audio_stream_get
633 
634 #define ux_device_class_audio_reception_start         _ux_device_class_audio_reception_start
635 #define ux_device_class_audio_sample_read8            _ux_device_class_audio_sample_read8
636 #define ux_device_class_audio_sample_read16           _ux_device_class_audio_sample_read16
637 #define ux_device_class_audio_sample_read24           _ux_device_class_audio_sample_read24
638 #define ux_device_class_audio_sample_read32           _ux_device_class_audio_sample_read32
639 
640 #define ux_device_class_audio_read_frame_get          _ux_device_class_audio_read_frame_get
641 #define ux_device_class_audio_read_frame_free         _ux_device_class_audio_read_frame_free
642 
643 #define ux_device_class_audio_transmission_start      _ux_device_class_audio_transmission_start
644 #define ux_device_class_audio_frame_write             _ux_device_class_audio_frame_write
645 
646 #define ux_device_class_audio_write_frame_get         _ux_device_class_audio_write_frame_get
647 #define ux_device_class_audio_write_frame_commit      _ux_device_class_audio_write_frame_commit
648 
649 #define ux_device_class_audio_ioctl                   _ux_device_class_audio_ioctl
650 
651 #define ux_device_class_audio_speed_get               _ux_device_class_audio_speed_get
652 #define ux_device_class_audio_feedback_thread_entry   _ux_device_class_audio_feedback_thread_entry
653 #define ux_device_class_audio_feedback_task_function  _ux_device_class_audio_feedback_task_function
654 #define ux_device_class_audio_feedback_get            _ux_device_class_audio_feedback_get
655 #define ux_device_class_audio_feedback_set            _ux_device_class_audio_feedback_set
656 
657 #define ux_device_class_audio_interrupt_send          _ux_device_class_audio_interrupt_send
658 
659 #endif
660 
661 /* Determine if a C++ compiler is being used.  If so, complete the standard
662    C conditional started above.  */
663 #ifdef __cplusplus
664 }
665 #endif
666 
667 #endif /* ifndef UX_DEVICE_CLASS_AUDIO_H */
668