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