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