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_audio10.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 version 1.0.                                       */
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 /*                                            resulting in version 6.1    */
45 /*  04-02-2021     Chaoqiong Xiao           Modified comment(s),          */
46 /*                                            added volume RES support,   */
47 /*                                            resulting in version 6.1.6  */
48 /*  08-02-2021     Chaoqiong Xiao           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 sampling control,     */
54 /*                                            resulting in version 6.1.12 */
55 /*  03-08-2023     Chaoqiong Xiao           Modified comment(s),          */
56 /*                                            added error checks support, */
57 /*                                            fixed a macro name,         */
58 /*                                            resulting in version 6.2.1  */
59 /*  10-31-2023     Chaoqiong Xiao           Modified comment(s),          */
60 /*                                            optimized USB descriptors,  */
61 /*                                            resulting in version 6.3.0  */
62 /*                                                                        */
63 /**************************************************************************/
64 
65 #ifndef UX_DEVICE_CLASS_AUDIO10_H
66 #define UX_DEVICE_CLASS_AUDIO10_H
67 
68 /* Determine if a C++ compiler is being used.  If so, ensure that standard
69    C is used to process the API information.  */
70 
71 #ifdef   __cplusplus
72 
73 /* Yes, C++ compiler is present.  Use standard C.  */
74 extern   "C" {
75 
76 #endif
77 
78 
79 /* Internal option: enable the basic USBX error checking. This define is typically used
80    while debugging application.  */
81 #if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
82 #define UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING
83 #endif
84 
85 
86 /* Define Audio Class specific AC interface descriptor subclasses.  */
87 
88 #define UX_DEVICE_CLASS_AUDIO10_AC_UNDEFINED                      0x00
89 #define UX_DEVICE_CLASS_AUDIO10_AC_HEADER                         0x01
90 #define UX_DEVICE_CLASS_AUDIO10_AC_INPUT_TERMINAL                 0x02
91 #define UX_DEVICE_CLASS_AUDIO10_AC_OUTPUT_TERMINAL                0x03
92 #define UX_DEVICE_CLASS_AUDIO10_AC_MIXER_UNIT                     0x04
93 #define UX_DEVICE_CLASS_AUDIO10_AC_SELECTOR_UNIT                  0x05
94 #define UX_DEVICE_CLASS_AUDIO10_AC_FEATURE_UNIT                   0x06
95 #define UX_DEVICE_CLASS_AUDIO10_AC_PROCESSING_UNIT                0x07
96 #define UX_DEVICE_CLASS_AUDIO10_AC_EXTENSION_UNIT                 0x08
97 
98 
99 /* Define Audio Class specific AS interface descriptor subclasses.  */
100 
101 #define UX_DEVICE_CLASS_AUDIO10_AS_UNDEFINED                      0x00
102 #define UX_DEVICE_CLASS_AUDIO10_AS_GENERAL                        0x01
103 #define UX_DEVICE_CLASS_AUDIO10_AS_FORMAT_TYPE                    0x02
104 #define UX_DEVICE_CLASS_AUDIO10_AS_FORMAT_SPECIFIC                0x03
105 
106 
107 /* Define Audio Class specific endpoint descriptor subtypes.  */
108 
109 #define UX_DEVICE_CLASS_AUDIO10_EP_UNDEFINED                      0x00
110 #define UX_DEVICE_CLASS_AUDIO10_EP_GENERAL                        0x01
111 
112 
113 /* Define Audio Class specific request codes.  */
114 
115 #define UX_DEVICE_CLASS_AUDIO10_REQUEST_CODE_UNDEFINED            0x00
116 #define UX_DEVICE_CLASS_AUDIO10_SET_CUR                           0x01
117 #define UX_DEVICE_CLASS_AUDIO10_GET_CUR                           0x81
118 #define UX_DEVICE_CLASS_AUDIO10_SET_MIN                           0x02
119 #define UX_DEVICE_CLASS_AUDIO10_GET_MIN                           0x82
120 #define UX_DEVICE_CLASS_AUDIO10_SET_MAX                           0x03
121 #define UX_DEVICE_CLASS_AUDIO10_GET_MAX                           0x83
122 #define UX_DEVICE_CLASS_AUDIO10_SET_RES                           0x04
123 #define UX_DEVICE_CLASS_AUDIO10_GET_RES                           0x84
124 #define UX_DEVICE_CLASS_AUDIO10_SET_MEM                           0x05
125 #define UX_DEVICE_CLASS_AUDIO10_GET_MEM                           0x85
126 #define UX_DEVICE_CLASS_AUDIO10_GET_STAT                          0xFF
127 
128 
129 /* Define Audio Class specific terminal control selectors.  */
130 
131 #define UX_DEVICE_CLASS_AUDIO10_TE_CONTROL_UNDEFINED              0x00
132 #define UX_DEVICE_CLASS_AUDIO10_TE_COPY_PROTECT_CONTROL           0x01
133 
134 
135 /* Define Audio Class specific feature unit control selectors.  */
136 
137 #define UX_DEVICE_CLASS_AUDIO10_FU_CONTROL_UNDEFINED              0x00
138 #define UX_DEVICE_CLASS_AUDIO10_FU_MUTE_CONTROL                   0x01
139 #define UX_DEVICE_CLASS_AUDIO10_FU_VOLUME_CONTROL                 0x02
140 #define UX_DEVICE_CLASS_AUDIO10_FU_BASS_CONTROL                   0x03
141 #define UX_DEVICE_CLASS_AUDIO10_FU_MID_CONTROL                    0x04
142 #define UX_DEVICE_CLASS_AUDIO10_FU_TREBLE_CONTROL                 0x05
143 #define UX_DEVICE_CLASS_AUDIO10_FU_GRAPHIC_EQUALIZER_CONTROL      0x06
144 #define UX_DEVICE_CLASS_AUDIO10_FU_AUTOMATIC_GAIN_CONTROL         0x07
145 #define UX_DEVICE_CLASS_AUDIO10_FU_DELAY_CONTROL                  0x08
146 #define UX_DEVICE_CLASS_AUDIO10_FU_BASS_BOOST_CONTROL             0x09
147 #define UX_DEVICE_CLASS_AUDIO10_FU_LOUNDNESS_CONTROL              0x0A
148 
149 
150 /* Define Audio Class specific endpoint control selectors.  */
151 
152 #define UX_DEVICE_CLASS_AUDIO10_EP_CONTROL_UNDEFINED              0x00
153 #define UX_DEVICE_CLASS_AUDIO10_EP_SAMPLING_FREQ_CONTROL          0x01
154 #define UX_DEVICE_CLASS_AUDIO10_EP_PITCH_CONTROL                  0x02
155 
156 
157 /* Define Audio Class encoding format types.  */
158 
159 #define UX_DEVICE_CLASS_AUDIO10_FORMAT_PCM                        1
160 #define UX_DEVICE_CLASS_AUDIO10_FORMAT_PCM8                       2
161 #define UX_DEVICE_CLASS_AUDIO10_FORMAT_IEEE_FLOAT                 3
162 #define UX_DEVICE_CLASS_AUDIO10_FORMAT_ALAW                       4
163 #define UX_DEVICE_CLASS_AUDIO10_FORMAT_MULAW                      5
164 
165 
166 /* Audio Class Control interface structures.  */
167 
168 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_HEADER1_DESCRIPTOR_STRUCT
169 {
170 
171     UCHAR           bLength;
172     UCHAR           bDescriptorType;
173     UCHAR           bDescriptorSubtype;
174     UCHAR           _align_bcdADC[1];
175     USHORT          bcdADC;
176     USHORT          wTotalLength;
177     UCHAR           bInCollection;
178     UCHAR           baInterfaceNr1;
179     UCHAR           _align_size[2];
180 } UX_DEVICE_CLASS_AUDIO10_AC_HEADER1_DESCRIPTOR;
181 
182 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_HEADER2_DESCRIPTOR_STRUCT
183 {
184 
185     UCHAR           bLength;
186     UCHAR           bDescriptorType;
187     UCHAR           bDescriptorSubtype;
188     UCHAR           _align_bcdADC[1];
189     USHORT          bcdADC;
190     USHORT          wTotalLength;
191     UCHAR           bInCollection;
192     UCHAR           baInterfaceNr1;
193     UCHAR           baInterfaceNr2;
194     UCHAR           _align_size[1];
195 } UX_DEVICE_CLASS_AUDIO10_AC_HEADER2_DESCRIPTOR;
196 
197 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_HEADER3_DESCRIPTOR_STRUCT
198 {
199 
200     UCHAR           bLength;
201     UCHAR           bDescriptorType;
202     UCHAR           bDescriptorSubtype;
203     UCHAR           _align_bcdADC[1];
204     USHORT          bcdADC;
205     USHORT          wTotalLength;
206     UCHAR           bInCollection;
207     UCHAR           baInterfaceNr1;
208     UCHAR           baInterfaceNr2;
209     UCHAR           baInterfaceNr3;
210     UCHAR           _align_size[2];
211 } UX_DEVICE_CLASS_AUDIO10_AC_HEADER3_DESCRIPTOR;
212 
213 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_HEADER6_DESCRIPTOR_STRUCT
214 {
215 
216     UCHAR           bLength;
217     UCHAR           bDescriptorType;
218     UCHAR           bDescriptorSubtype;
219     UCHAR           _align_bcdADC[1];
220     USHORT          bcdADC;
221     USHORT          wTotalLength;
222     UCHAR           bInCollection;
223     UCHAR           baInterfaceNr1;
224     UCHAR           baInterfaceNr2;
225     UCHAR           baInterfaceNr3;
226     UCHAR           baInterfaceNr4;
227     UCHAR           baInterfaceNr5;
228     UCHAR           baInterfaceNr6;
229     UCHAR           _align_size[1];
230 } UX_DEVICE_CLASS_AUDIO10_AC_HEADER6_DESCRIPTOR;
231 
232 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_HEADER7_DESCRIPTOR_STRUCT
233 {
234 
235     UCHAR           bLength;
236     UCHAR           bDescriptorType;
237     UCHAR           bDescriptorSubtype;
238     UCHAR           _align_bcdADC[1];
239     USHORT          bcdADC;
240     USHORT          wTotalLength;
241     UCHAR           bInCollection;
242     UCHAR           baInterfaceNr1;
243     UCHAR           baInterfaceNr2;
244     UCHAR           baInterfaceNr3;
245     UCHAR           baInterfaceNr4;
246     UCHAR           baInterfaceNr5;
247     UCHAR           baInterfaceNr6;
248     UCHAR           baInterfaceNr7;
249 } UX_DEVICE_CLASS_AUDIO10_AC_HEADER7_DESCRIPTOR;
250 
251 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_HEADER8_DESCRIPTOR_STRUCT
252 {
253 
254     UCHAR           bLength;
255     UCHAR           bDescriptorType;
256     UCHAR           bDescriptorSubtype;
257     UCHAR           _align_bcdADC[1];
258     USHORT          bcdADC;
259     USHORT          wTotalLength;
260     UCHAR           bInCollection;
261     UCHAR           baInterfaceNr1;
262     UCHAR           baInterfaceNr2;
263     UCHAR           baInterfaceNr3;
264     UCHAR           baInterfaceNr4;
265     UCHAR           baInterfaceNr5;
266     UCHAR           baInterfaceNr6;
267     UCHAR           baInterfaceNr7;
268     UCHAR           baInterfaceNr8;
269     UCHAR           _align_size[3];
270 } UX_DEVICE_CLASS_AUDIO10_AC_HEADER8_DESCRIPTOR;
271 
272 
273 /* Define Audio Class specific input terminal interface descriptor.  */
274 
275 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_INPUT_TERMINAL_DESCRIPTOR_STRUCT
276 {
277 
278     UCHAR           bLength;
279     UCHAR           bDescriptorType;
280     UCHAR           bDescriptorSubType;
281     UCHAR           bTerminalID;
282     USHORT          wTerminalType;
283     UCHAR           bAssocTerminal;
284     UCHAR           bNrChannels;
285     USHORT          wChannelConfig;
286     UCHAR           iChannelNames;
287     UCHAR           iTerminal;
288 } UX_DEVICE_CLASS_AUDIO10_AC_INPUT_TERMINAL_DESCRIPTOR;
289 
290 
291 /* Define Audio Class specific output terminal interface descriptor.  */
292 
293 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_OUTPUT_TERMINAL_DESCRIPTOR_STRUCT
294 {
295 
296     UCHAR           bLength;
297     UCHAR           bDescriptorType;
298     UCHAR           bDescriptorSubType;
299     UCHAR           bTerminalID;
300     USHORT          wTerminalType;
301     UCHAR           bAssocTerminal;
302     UCHAR           bSourceID;
303     UCHAR           iTerminal;
304     UCHAR          _align_size[3];
305 } UX_DEVICE_CLASS_AUDIO10_AC_OUTPUT_TERMINAL_DESCRIPTOR;
306 
307 
308 /* Define Audio Class specific feature unit descriptor.  */
309 
310 typedef struct UX_DEVICE_CLASS_AUDIO10_AC_FEATURE_UNIT_DESCRIPTOR_STRUCT
311 {
312 
313     UCHAR           bLength;
314     UCHAR           bDescriptorType;
315     UCHAR           bDescriptorSubType;
316     UCHAR           bUnitID;
317     UCHAR           bSourceID;
318     UCHAR           bControlSize;
319     UCHAR           _align_bmaControls[2];
320     ULONG           bmaControls;
321 } UX_DEVICE_CLASS_AUDIO10_AC_FEATURE_UNIT_DESCRIPTOR;
322 
323 
324 /* Define Audio Class streaming interface descriptor.  */
325 
326 typedef struct UX_DEVICE_CLASS_AUDIO10_AS_INTERFACE_DESCRIPTOR_STRUCT
327 {
328 
329     UCHAR           bLength;
330     UCHAR           bDescriptorType;
331     UCHAR           bDescriptorSubtype;
332     UCHAR           bTerminalLink;
333     UCHAR           bDelay;
334     UCHAR           _align_wFormatTag[1];
335     USHORT          wFormatTag;
336 } UX_DEVICE_CLASS_AUDIO10_AS_INTERFACE_DESCRIPTOR;
337 
338 
339 /* Define Audio Class type I format type descriptor.  */
340 
341 typedef struct UX_DEVICE_CLASS_AUDIO10_AS_TYPE_I_FORMAT_TYPE_DESCRIPTOR_STRUCT
342 {
343 
344     UCHAR           bLength;
345     UCHAR           bDescriptorType;
346     UCHAR           bDescriptorSubtype;
347     UCHAR           bFormatType;
348     UCHAR           bNrChannels;
349     UCHAR           bSubframeSize;
350     UCHAR           bBitResolution;
351     UCHAR           bSamFreqType;
352     ULONG           SamplingFrequency;
353 } UX_DEVICE_CLASS_AUDIO10_AS_TYPE_I_FORMAT_TYPE_DESCRIPTOR;
354 
355 #define UX_DEVICE_CLASS_AUDIO_AS_TYPE_I_FORMAT_TYPE_DESCRIPTOR_FORMAT_TYPE    3
356 #define UX_DEVICE_CLASS_AUDIO_AS_TYPE_I_FORMAT_TYPE_DESCRIPTOR_NR_CHANNELS    4
357 #define UX_DEVICE_CLASS_AUDIO_AS_TYPE_I_FORMAT_TYPE_DESCRIPTOR_SUBFRAME_SIZE  5
358 #define UX_DEVICE_CLASS_AUDIO_AS_TYPE_I_FORMAT_TYPE_DESCRIPTOR_BIT_RESOLUTION 6
359 #define UX_DEVICE_CLASS_AUDIO_AS_TYPE_I_FORMAT_TYPE_DESCRIPTOR_SAM_FREQ_TYPE  7
360 #define UX_DEVICE_CLASS_AUDIO_AS_TYPE_I_FORMAT_TYPE_DESCRIPTOR_SAM_FREQ_TABLE 8
361 
362 
363 /* Define Audio Class specific streaming endpoint descriptor.  */
364 
365 typedef struct UX_DEVICE_CLASS_AUDIO10_AS_ENDPOINT_DESCRIPTOR_STRUCT
366 {
367 
368     UCHAR           bLength;
369     UCHAR           bDescriptorType;
370     UCHAR           bDescriptorSubtype;
371     UCHAR           bmAttributes;
372     USHORT          wMaxPacketSize;
373     UCHAR           bInterval;
374     UCHAR           bRefresh;
375     UCHAR           bSynchAddress;
376     UCHAR          _align_size[3];
377 } UX_DEVICE_CLASS_AUDIO10_AS_ENDPOINT_DESCRIPTOR;
378 
379 typedef struct UX_DEVICE_CLASS_AUDIO10_AS_DATA_ENDPOINT_DESCRIPTOR_STRUCT
380 {
381 
382     UCHAR           bLength;
383     UCHAR           bDescriptorType;
384     UCHAR           bDescriptorSubtype;
385     UCHAR           bmAttributes;
386     UCHAR           bLockDelayUnits;
387     UCHAR          _align_wLockDelay[1];
388     USHORT          wLockDelay;
389 } UX_DEVICE_CLASS_AUDIO10_AS_DATA_ENDPOINT_DESCRIPTOR;
390 
391 typedef struct UX_DEVICE_CLASS_AUDIO10_CONTROL_STRUCT
392 {
393     ULONG           ux_device_class_audio10_control_changed;
394 
395     ULONG           ux_device_class_audio10_control_ep_addr;        /* Endpoint address for sampling frequencies control.  */
396     UCHAR           *ux_device_class_audio10_control_sam_freq_types;/* Format Type I Descriptor - bSamFreqType and followings.  */
397     ULONG           ux_device_class_audio10_control_sam_freq;       /* Current sampling frequency.  */
398 
399     ULONG           ux_device_class_audio10_control_fu_id;
400     USHORT          ux_device_class_audio10_control_mute[1];
401     SHORT           ux_device_class_audio10_control_volume_min[1];
402     SHORT           ux_device_class_audio10_control_volume_max[1];
403     USHORT          ux_device_class_audio10_control_volume_res[1];
404     SHORT           ux_device_class_audio10_control_volume[1];
405 } UX_DEVICE_CLASS_AUDIO10_CONTROL;
406 
407 #define UX_DEVICE_CLASS_AUDIO10_CONTROL_MUTE_CHANGED                1u
408 #define UX_DEVICE_CLASS_AUDIO10_CONTROL_VOLUME_CHANGED              2u
409 #define UX_DEVICE_CLASS_AUDIO10_CONTROL_FREQUENCY_CHANGED           4u
410 
411 typedef struct UX_DEVICE_CLASS_AUDIO10_CONTROL_GROUP_STRUCT
412 {
413     ULONG                            ux_device_class_audio10_control_group_controls_nb;
414     UX_DEVICE_CLASS_AUDIO10_CONTROL *ux_device_class_audio10_control_group_controls;
415 } UX_DEVICE_CLASS_AUDIO10_CONTROL_GROUP;
416 
417 UINT _ux_device_class_audio10_control_process(UX_DEVICE_CLASS_AUDIO *audio,
418                                               UX_SLAVE_TRANSFER *transfer_request,
419                                               UX_DEVICE_CLASS_AUDIO10_CONTROL_GROUP *group);
420 
421 UINT _uxe_device_class_audio10_control_process(UX_DEVICE_CLASS_AUDIO *audio,
422                                               UX_SLAVE_TRANSFER *transfer_request,
423                                               UX_DEVICE_CLASS_AUDIO10_CONTROL_GROUP *group);
424 
425 #if defined(UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
426 
427 #define ux_device_class_audio10_control_process _uxe_device_class_audio10_control_process
428 
429 #else
430 
431 #define ux_device_class_audio10_control_process _ux_device_class_audio10_control_process
432 
433 #endif
434 
435 /* Determine if a C++ compiler is being used.  If so, complete the standard
436    C conditional started above.  */
437 #ifdef __cplusplus
438 }
439 #endif
440 
441 #endif /* ifndef UX_DEVICE_CLASS_AUDIO10_H */
442