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