usbx/common/usbx_device_classes/inc/ux_device_class_audio.h
Bo Chen (from Dev Box) a6087c2efa Update copyright.
2024-01-29 14:21:32 +08:00

668 lines
35 KiB
C

/***************************************************************************
* Copyright (c) 2024 Microsoft Corporation
*
* This program and the accompanying materials are made available under the
* terms of the MIT License which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** USBX Component */
/** */
/** Device Audio Class */
/** */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/* */
/* COMPONENT DEFINITION RELEASE */
/* */
/* ux_device_class_audio.h PORTABLE C */
/* 6.3.0 */
/* AUTHOR */
/* */
/* Chaoqiong Xiao, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This file contains all the header and extern functions used by the */
/* USBX audio class. */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 05-19-2020 Chaoqiong Xiao Initial Version 6.0 */
/* 09-30-2020 Chaoqiong Xiao Modified comment(s), */
/* used UX prefix to refer to */
/* TX symbols instead of using */
/* them directly, */
/* resulting in version 6.1 */
/* 08-02-2021 Wen Wang Modified comment(s), */
/* added extern "C" keyword */
/* for compatibility with C++, */
/* resulting in version 6.1.8 */
/* 01-31-2022 Chaoqiong Xiao Modified comment(s), */
/* added feedback support, */
/* resulting in version 6.1.10 */
/* 04-25-2022 Chaoqiong Xiao Modified comment(s), */
/* fixed standalone compile, */
/* resulting in version 6.1.11 */
/* 07-29-2022 Chaoqiong Xiao Modified comment(s), */
/* added interrupt support, */
/* resulting in version 6.1.12 */
/* 10-31-2022 Yajun Xia Modified comment(s), */
/* added standalone support, */
/* resulting in version 6.2.0 */
/* 03-08-2023 Chaoqiong Xiao Modified comment(s), */
/* added error checks support, */
/* resulting in version 6.2.1 */
/* 10-31-2023 Chaoqiong Xiao Modified comment(s), */
/* added a new mode to manage */
/* endpoint buffer in classes */
/* with zero copy enabled, */
/* resulting in version 6.3.0 */
/* */
/**************************************************************************/
#ifndef UX_DEVICE_CLASS_AUDIO_H
#define UX_DEVICE_CLASS_AUDIO_H
/* Determine if a C++ compiler is being used. If so, ensure that standard
C is used to process the API information. */
#ifdef __cplusplus
/* Yes, C++ compiler is present. Use standard C. */
extern "C" {
#endif
/* Compile option: if defined, audio feedback endpoint is supported. */
/* #define UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT */
/* Compile option: if defined, audio interrupt endpoint is supported. */
/* #define UX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT */
/* Internal option: enable the basic USBX error checking. This define is typically used
while debugging application. */
#if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
#define UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING
#endif
/* Works if UX_DEVICE_ENDPOINT_BUFFER_OWNER is 1.
If defined, it represents feedback endpoint buffer size.
It should be larger than feedback endpoint max packet size in framework. */
#define UX_DEVICE_CLASS_AUDIO_FEEDBACK_BUFFER_SIZE 8
/* Define Audio Class OS related constants. */
#define UX_DEVICE_CLASS_AUDIO_FEEDBACK_THREAD_STACK_SIZE UX_THREAD_STACK_SIZE
#define UX_DEVICE_CLASS_AUDIO_INTERRUPT_THREAD_STACK_SIZE UX_THREAD_STACK_SIZE
/* Define Audio Class function (AF) constants. */
#define UX_DEVICE_CLASS_AUDIO_FUNCTION_CLASS 1
#define UX_DEVICE_CLASS_AUDIO_FUNCTION_SUBCLASS_UNDEFINED 0
#define UX_DEVICE_CLASS_AUDIO_FUNCTION_PROTOCOL_UNDEFINED 0
#define UX_DEVICE_CLASS_AUDIO_FUNCTION_PROTOCOL_VERSION_02_00 0x20
/* Define Audio Class interface constants. */
#define UX_DEVICE_CLASS_AUDIO_CLASS 1
#define UX_DEVICE_CLASS_AUDIO_SUBCLASS_UNDEFINED 0
#define UX_DEVICE_CLASS_AUDIO_SUBCLASS_CONTROL 1
#define UX_DEVICE_CLASS_AUDIO_SUBCLASS_AUDIOSTREAMING 2
#define UX_DEVICE_CLASS_AUDIO_SUBCLASS_MIDISTREAMING 3
#define UX_DEVICE_CLASS_AUDIO_PROTOCOL_UNDEFINED 0
#define UX_DEVICE_CLASS_AUTIO_PROTOCOL_VERSION_02_00 0x20
/* Define Audio Class-specific (CS) descriptor types. */
#define UX_DEVICE_CLASS_AUDIO_CS_UNDEFINED 0x20
#define UX_DEVICE_CLASS_AUDIO_CS_DEVICE 0x21
#define UX_DEVICE_CLASS_AUDIO_CS_CONFIGURATION 0x22
#define UX_DEVICE_CLASS_AUDIO_CS_STRING 0x23
#define UX_DEVICE_CLASS_AUDIO_CS_INTERFACE 0x24
#define UX_DEVICE_CLASS_AUDIO_CS_ENDPOINT 0x25
/* Define Audio Class specific AC interface descriptor subclasses. */
#define UX_DEVICE_CLASS_AUDIO_AC_UNDEFINED 0x00
#define UX_DEVICE_CLASS_AUDIO_AC_HEADER 0x01
#define UX_DEVICE_CLASS_AUDIO_AC_INPUT_TERMINAL 0x02
#define UX_DEVICE_CLASS_AUDIO_AC_OUTPUT_TERMINAL 0x03
#define UX_DEVICE_CLASS_AUDIO_AC_FEATURE_UNIT 0x06
/* Define Audio Class specific AS interface descriptor subclasses. */
#define UX_DEVICE_CLASS_AUDIO_AS_UNDEFINED 0x00
#define UX_DEVICE_CLASS_AUDIO_AS_GENERAL 0x01
#define UX_DEVICE_CLASS_AUDIO_AS_FORMAT_TYPE 0x02
/* Define Audio Class data endpoint descriptor attributes. */
#define UX_DEVICE_CLASS_AUDIO_EP_TRANSFER_TYPE_MASK (0x3u<<0)
#define UX_DEVICE_CLASS_AUDIO_EP_TRANSFER_TYPE_ISOCHRONOUS (0x1u<<0)
#define UX_DEVICE_CLASS_AUDIO_EP_SYNCHRONIZATION_TYPE_MASK (0x3u<<2)
#define UX_DEVICE_CLASS_AUDIO_EP_SYNCHRONIZATION_TYPE_ASYNCHRONOUS (0x1u<<2)
#define UX_DEVICE_CLASS_AUDIO_EP_SYNCHRONIZATION_TYPE_ADAPTIVE (0x2u<<2)
#define UX_DEVICE_CLASS_AUDIO_EP_SYNCHRONIZATION_TYPE_SYNCHRONOUS (0x3u<<2)
#define UX_DEVICE_CLASS_AUDIO_EP_USAGE_TYPE_MASK (0x3u<<4)
#define UX_DEVICE_CLASS_AUDIO_EP_USAGE_TYPE_DATA (0x0u<<4)
#define UX_DEVICE_CLASS_AUDIO_EP_USAGE_TYPE_FEEDBACK (0x1u<<4)
#define UX_DEVICE_CLASS_AUDIO_EP_USAGE_TYPE_IMPLICIT_FEEDBACK (0x2u<<4)
/* Define Audio Class specific endpoint descriptor subtypes. */
#define UX_DEVICE_CLASS_AUDIO_EP_UNDEFINED 0x00
#define UX_DEVICE_CLASS_AUDIO_EP_GENERAL 0x01
/* Define Audio Class specific request codes. */
#define UX_DEVICE_CLASS_AUDIO_REQUEST_CODE_UNDEFINED 0x00
#define UX_DEVICE_CLASS_AUDIO_bmRequestType_GET_INTERFACE 0xA1
#define UX_DEVICE_CLASS_AUDIO_bmRequestType_SET_INTERFACE 0x21
#define UX_DEVICE_CLASS_AUDIO_bmRequestType_GET_ENDPOINT 0xA2
#define UX_DEVICE_CLASS_AUDIO_bmRequestType_SET_ENDPOINT 0x22
#define UX_DEVICE_CLASS_AUDIO_REQUEST_REQUEST_TYPE 0
#define UX_DEVICE_CLASS_AUDIO_REQUEST_REQUEST 1
#define UX_DEVICE_CLASS_AUDIO_REQUEST_VALUE_LOW 2
#define UX_DEVICE_CLASS_AUDIO_REQUEST_CHANNEL_NUMBER 2
#define UX_DEVICE_CLASS_AUDIO_REQUEST_CN 2
#define UX_DEVICE_CLASS_AUDIO_REQUEST_MIXER_CONTROL_NUMBER 2
#define UX_DEVICE_CLASS_AUDIO_REQUEST_MCN 2
#define UX_DEVICE_CLASS_AUDIO_REQUEST_VALUE_HIGH 3
#define UX_DEVICE_CLASS_AUDIO_REQUEST_CONTROL_SELECTOR 3
#define UX_DEVICE_CLASS_AUDIO_REQUEST_CS 3
#define UX_DEVICE_CLASS_AUDIO_REQUEST_INDEX_LOW 4
#define UX_DEVICE_CLASS_AUDIO_REQUEST_ENDPOINT 4
#define UX_DEVICE_CLASS_AUDIO_REQUEST_INTERFACE 4
#define UX_DEVICE_CLASS_AUDIO_REQUEST_INDEX_HIGH 5
#define UX_DEVICE_CLASS_AUDIO_REQUEST_ENEITY_ID 5
#define UX_DEVICE_CLASS_AUDIO_REQUEST_LENGTH 6
/* Define Audio Class terminal types. */
#define UX_DEVICE_CLASS_AUDIO_UNDEFINED 0x0100
#define UX_DEVICE_CLASS_AUDIO_USB_STREAMING 0x0101
#define UX_DEVICE_CLASS_AUDIO_USB_VENDOR_SPECIFIC 0x01FF
/* Define Audio Class input terminal types. */
#define UX_DEVICE_CLASS_AUDIO_INPUT 0x0200
#define UX_DEVICE_CLASS_AUDIO_MICROPHONE 0x0201
#define UX_DEVICE_CLASS_AUDIO_DESKTOP_MICROPHONE 0x0202
#define UX_DEVICE_CLASS_AUDIO_PERSONAL_MICROPHONE 0x0203
#define UX_DEVICE_CLASS_AUDIO_OMNI_DIRECTIONAL_MICROPHONE 0x0204
#define UX_DEVICE_CLASS_AUDIO_MICROPHONE_ARRAY 0x0205
#define UX_DEVICE_CLASS_AUDIO_PROCESSING_MICROPHONE_ARRAY 0x0206
/* Define Audio Class output terminal types. */
#define UX_DEVICE_CLASS_AUDIO_OUTPUT 0x0300
#define UX_DEVICE_CLASS_AUDIO_SPEAKER 0x0301
#define UX_DEVICE_CLASS_AUDIO_HEADPHONES 0x0302
#define UX_DEVICE_CLASS_AUDIO_HEAD_MOUNTED_DISPLAY 0x0303
#define UX_DEVICE_CLASS_AUDIO_DESKTOP_SPEAKER 0x0304
#define UX_DEVICE_CLASS_AUDIO_ROOM_SPEAKER 0x0305
#define UX_DEVICE_CLASS_AUDIO_COMMUNICATION_SPEAKER 0x0306
#define UX_DEVICE_CLASS_AUDIO_LOW_FREQUENCY_SPEAKER 0x0307
/* Define Audio Class bidirectional terminal types. */
#define UX_DEVICE_CLASS_AUDIO_BIDIRECTIONAL_UNDEFINED 0x0400
#define UX_DEVICE_CLASS_AUDIO_HANDSET 0x0401
#define UX_DEVICE_CLASS_AUDIO_HEADSET 0x0402
#define UX_DEVICE_CLASS_AUDIO_SPEAKERPHONE 0x0403
#define UX_DEVICE_CLASS_AUDIO_ECHO_SUPRESS_SPEAKERPHONE 0x0404
#define UX_DEVICE_CLASS_AUDIO_ECHO_CANCEL_SPEAKERPHONE 0x0405
/* Define Audio Class telephony terminal types. */
#define UX_DEVICE_CLASS_AUDIO_TELEPHONTY_UNDEFINED 0x0500
#define UX_DEVICE_CLASS_AUDIO_PHONE_LINE 0x0501
#define UX_DEVICE_CLASS_AUDIO_TELEPHONE 0x0502
#define UX_DEVICE_CLASS_AUDIO_DOWN_LINE_PHONE 0x0503
/* Define Audio Class external terminal types. */
#define UX_DEVICE_CLASS_AUDIO_EXTERNAL_UNDEFINED 0x0600
#define UX_DEVICE_CLASS_AUDIO_ANALOG_CONNECTOR 0x0601
#define UX_DEVICE_CLASS_AUDIO_DIGITAL_AUDIO_INTERFACE 0x0602
#define UX_DEVICE_CLASS_AUDIO_LINE_CONNECTOR 0x0603
#define UX_DEVICE_CLASS_AUDIO_LEGACY_AUDIO_CONNECTOR 0x0604
#define UX_DEVICE_CLASS_AUDIO_S_PDIF_INTERFACE 0x0605
#define UX_DEVICE_CLASS_AUDIO_1394_DA_STREAM 0x0606
#define UX_DEVICE_CLASS_AUDIO_1394_DV_STREAM_SOUNDTRACK 0x0607
#define UX_DEVICE_CLASS_AUDIO_ADAT_LIGHTPIPE 0x0608
#define UX_DEVICE_CLASS_AUDIO_TDIF 0x0609
#define UX_DEVICE_CLASS_AUDIO_MADI 0x060A
/* Define Audio Class embedded function terminal types. */
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_UNDEFINED 0x0700
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_LEVEL_CALIB_NOISE_SRC 0x0701
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_EQUALIZATION_NOISE 0x0702
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_CD_PLAYER 0x0703
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DAT 0x0704
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DCC 0x0705
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_MINIDISK 0x0706
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_ANALOG_TAPE 0x0707
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_PHONOGRAPH 0x0708
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_VCR_AUDIO 0x0709
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_VIDEO_DISC_AUDIO 0x070A
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DVD_AUDIO 0x070B
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_TV_TUNER_AUDIO 0x070C
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_SATELLITE_RECEIVER_AUDIO 0x070D
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_CABLE_TUNER_AUDIO 0x070E
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DSS_AUDIO 0x070F
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_RADIO_RECEIVER 0x0710
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_RADIO_TRANSMITTER 0x0711
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_MULTI_TRACK_RECORDER 0x0712
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_SYNTHESIZER 0x0713
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_PIANO 0x0714
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_GUITAR 0x0715
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_DRUMS_RHYTHM 0x0716
#define UX_DEVICE_CLASS_AUDIO_EMBEDDED_OTHER 0x0717
/* Define Audio Class encoding format types. */
#define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_UNDEFINED 0
#define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_I 1
#define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_II 2
#define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_III 3
#define UX_DEVICE_CLASS_AUDIO_FORMAT_TYPE_IV 4
#define UX_DEVICE_CLASS_AUDIO_EXT_FORMAT_TYPE_I 0x81
#define UX_DEVICE_CLASS_AUDIO_EXT_FORMAT_TYPE_II 0x82
#define UX_DEVICE_CLASS_AUDIO_EXT_FORMAT_TYPE_III 0x83
/* Define channels. */
#define UX_DEVICE_CLASS_AUDIO_MASTER_CHANNEL 0
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_1 1
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_2 2
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_3 3
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_4 4
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_5 5
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_6 6
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_7 7
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_8 8
#define UX_DEVICE_CLASS_AUDIO_CHANNEL_9 9
/* Define IOCTL code.
ux_device_class_audio_ioctl(audio, IOCTL_CODE, parameter).
*/
#define UX_DEVICE_CLASS_AUDIO_IOCTL_GET_ARG 1
/* Define Audio Class Task states. */
#define UX_DEVICE_CLASS_AUDIO_INTERRUPT_STOP (UX_STATE_RESET)
#define UX_DEVICE_CLASS_AUDIO_INTERRUPT_START (UX_STATE_STEP + 1)
#define UX_DEVICE_CLASS_AUDIO_INTERRUPT_WAIT (UX_STATE_STEP + 2)
#define UX_DEVICE_CLASS_AUDIO_STREAM_RW_STOP (UX_STATE_RESET)
#define UX_DEVICE_CLASS_AUDIO_STREAM_RW_START (UX_STATE_STEP + 1)
#define UX_DEVICE_CLASS_AUDIO_STREAM_RW_WAIT (UX_STATE_STEP + 2)
#define UX_DEVICE_CLASS_AUDIO_STREAM_FEEDBACK_RW_STOP (UX_STATE_RESET)
#define UX_DEVICE_CLASS_AUDIO_STREAM_FEEDBACK_RW_WAIT (UX_STATE_STEP + 1)
/* Define Audio Class callback structure. */
struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT;
struct UX_DEVICE_CLASS_AUDIO_STRUCT;
typedef struct UX_DEVICE_CLASS_AUDIO_CALLBACKS_STRUCT
{
VOID (*ux_slave_class_audio_instance_activate)(VOID *);
VOID (*ux_slave_class_audio_instance_deactivate)(VOID *);
UINT (*ux_device_class_audio_control_process)(struct UX_DEVICE_CLASS_AUDIO_STRUCT *, UX_SLAVE_TRANSFER *);
VOID *ux_device_class_audio_arg;
} UX_DEVICE_CLASS_AUDIO_CALLBACKS;
typedef struct UX_DEVICE_CLASS_AUDIO_STREAM_CALLBACKS_STRUCT
{
VOID (*ux_device_class_audio_stream_change)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT *, ULONG);
VOID (*ux_device_class_audio_stream_frame_done)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT *, ULONG);
} UX_DEVICE_CLASS_AUDIO_STREAM_CALLBACKS;
/* Define Audio Class Calling Parameter structure */
typedef struct UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER_STRUCT
{
#if !defined(UX_DEVICE_STANDALONE)
ULONG ux_device_class_audio_stream_parameter_thread_stack_size;
VOID (*ux_device_class_audio_stream_parameter_thread_entry)(ULONG id);
#else
UINT (*ux_device_class_audio_stream_parameter_task_function)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT*);
#endif
#if defined(UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT)
#if !defined(UX_DEVICE_STANDALONE)
ULONG ux_device_class_audio_stream_parameter_feedback_thread_stack_size;
VOID (*ux_device_class_audio_stream_parameter_feedback_thread_entry)(ULONG id);
#else
UINT (*ux_device_class_audio_stream_parameter_feedback_task_function)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT*);
#endif
#endif
UX_DEVICE_CLASS_AUDIO_STREAM_CALLBACKS ux_device_class_audio_stream_parameter_callbacks;
ULONG ux_device_class_audio_stream_parameter_max_frame_buffer_size;
ULONG ux_device_class_audio_stream_parameter_max_frame_buffer_nb;
} UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER;
typedef struct UX_DEVICE_CLASS_AUDIO_PARAMETER_STRUCT
{
ULONG ux_device_class_audio_parameter_master_interface;
UX_DEVICE_CLASS_AUDIO_CALLBACKS ux_device_class_audio_parameter_callbacks;
ULONG ux_device_class_audio_parameter_streams_nb;
UX_DEVICE_CLASS_AUDIO_STREAM_PARAMETER *ux_device_class_audio_parameter_streams;
#if defined(UX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT)
ULONG ux_device_class_audio_parameter_status_size;
ULONG ux_device_class_audio_parameter_status_queue_size;
#endif
} UX_DEVICE_CLASS_AUDIO_PARAMETER;
/* Define Audio Class instance structure. */
typedef struct UX_DEVICE_CLASS_AUDIO_FRAME_STRUCT
{
ULONG ux_device_class_audio_frame_length;
ULONG ux_device_class_audio_frame_pos;
UCHAR ux_device_class_audio_frame_data[4];
} UX_DEVICE_CLASS_AUDIO_FRAME;
typedef struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT
{
struct UX_DEVICE_CLASS_AUDIO_STRUCT *ux_device_class_audio_stream_audio;
UX_SLAVE_INTERFACE *ux_device_class_audio_stream_interface;
UX_SLAVE_ENDPOINT *ux_device_class_audio_stream_endpoint;
#if defined(UX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT)
UX_SLAVE_ENDPOINT *ux_device_class_audio_stream_feedback;
#if UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1
UCHAR *ux_device_class_audio_stream_feedback_buffer;
#endif
#if !defined(UX_DEVICE_STANDALONE)
UCHAR *ux_device_class_audio_stream_feedback_thread_stack;
UX_THREAD ux_device_class_audio_stream_feedback_thread;
#else
UINT (*ux_device_class_audio_stream_feedback_task_function)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT*);
UINT ux_device_class_audio_stream_feedback_task_state;
UINT ux_device_class_audio_stream_feedback_task_status;
#endif
#endif
UX_DEVICE_CLASS_AUDIO_STREAM_CALLBACKS ux_device_class_audio_stream_callbacks;
#if !defined(UX_DEVICE_STANDALONE)
UCHAR *ux_device_class_audio_stream_thread_stack;
UX_THREAD ux_device_class_audio_stream_thread;
#else
UINT (*ux_device_class_audio_stream_task_function)(struct UX_DEVICE_CLASS_AUDIO_STREAM_STRUCT*);
UINT ux_device_class_audio_stream_task_state;
UINT ux_device_class_audio_stream_task_status;
#endif
UCHAR *ux_device_class_audio_stream_buffer;
ULONG ux_device_class_audio_stream_buffer_size;
ULONG ux_device_class_audio_stream_frame_buffer_size;
ULONG ux_device_class_audio_stream_buffer_error_count;
UX_DEVICE_CLASS_AUDIO_FRAME *ux_device_class_audio_stream_transfer_pos;
UX_DEVICE_CLASS_AUDIO_FRAME *ux_device_class_audio_stream_access_pos;
} UX_DEVICE_CLASS_AUDIO_STREAM;
typedef struct UX_DEVICE_CLASS_AUDIO_STRUCT
{
UX_SLAVE_CLASS *ux_device_class_audio_class;
UX_SLAVE_DEVICE *ux_device_class_audio_device;
UX_SLAVE_INTERFACE *ux_device_class_audio_interface;
UX_DEVICE_CLASS_AUDIO_CALLBACKS ux_device_class_audio_callbacks;
ULONG ux_device_class_audio_streams_nb;
UX_DEVICE_CLASS_AUDIO_STREAM *ux_device_class_audio_streams;
#if defined(UX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT)
UX_SLAVE_ENDPOINT *ux_device_class_audio_interrupt;
#if UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1
UCHAR *ux_device_class_audio_interrupt_buffer;
#endif
ULONG ux_device_class_audio_status_size; /* in Bytes. */
ULONG ux_device_class_audio_status_queue_bytes;/* in Bytes. */
ULONG ux_device_class_audio_status_queued; /* in Bytes. */
UCHAR *ux_device_class_audio_status_queue; /* in Bytes. */
UCHAR *ux_device_class_audio_status_head;
UCHAR *ux_device_class_audio_status_tail;
#if !defined(UX_DEVICE_STANDALONE)
UX_SEMAPHORE ux_device_class_audio_status_semaphore;
UX_MUTEX ux_device_class_audio_status_mutex;
#else
UINT ux_device_class_audio_interrupt_task_state;
UINT ux_device_class_audio_interrupt_task_status;
#endif
#endif
} UX_DEVICE_CLASS_AUDIO;
/* Define Audio Class function prototypes. */
UINT _ux_device_class_audio_initialize(UX_SLAVE_CLASS_COMMAND *command);
UINT _ux_device_class_audio_uninitialize(UX_SLAVE_CLASS_COMMAND *command);
UINT _ux_device_class_audio_activate(UX_SLAVE_CLASS_COMMAND *command);
UINT _ux_device_class_audio_change(UX_SLAVE_CLASS_COMMAND *command);
UINT _ux_device_class_audio_deactivate(UX_SLAVE_CLASS_COMMAND *command);
UINT _ux_device_class_audio_control_request(UX_SLAVE_CLASS_COMMAND *command);
UINT _ux_device_class_audio_entry(UX_SLAVE_CLASS_COMMAND *command);
UINT _ux_device_class_audio_ioctl(UX_DEVICE_CLASS_AUDIO *audio, ULONG ioctl_function,
VOID *parameter);
UINT _ux_device_class_audio_stream_get(UX_DEVICE_CLASS_AUDIO *audio, ULONG stream_index, UX_DEVICE_CLASS_AUDIO_STREAM **stream);
VOID _ux_device_class_audio_write_thread_entry(ULONG audio_stream);
VOID _ux_device_class_audio_read_thread_entry(ULONG audio_stream);
UINT _ux_device_class_audio_write_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
UINT _ux_device_class_audio_read_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
UINT _ux_device_class_audio_reception_start(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
UINT _ux_device_class_audio_sample_read8(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *sample);
UINT _ux_device_class_audio_sample_read16(UX_DEVICE_CLASS_AUDIO_STREAM *audio, USHORT *sample);
UINT _ux_device_class_audio_sample_read24(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG *sample);
UINT _ux_device_class_audio_sample_read32(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG *sample);
UINT _ux_device_class_audio_read_frame_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR **frame_data, ULONG *frame_length);
UINT _ux_device_class_audio_read_frame_free(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
UINT _ux_device_class_audio_transmission_start(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
UINT _ux_device_class_audio_frame_write(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *frame, ULONG length);
UINT _ux_device_class_audio_write_frame_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR **buffer, ULONG *max_length);
UINT _ux_device_class_audio_write_frame_commit(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG length);
VOID _ux_device_class_audio_feedback_thread_entry(ULONG audio_stream);
UINT _ux_device_class_audio_feedback_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
UINT _ux_device_class_audio_feedback_set(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *encoded_feedback);
UINT _ux_device_class_audio_feedback_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *encoded_feedback);
ULONG _ux_device_class_audio_speed_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
VOID _ux_device_class_audio_interrupt_thread_entry(ULONG audio_inst);
UINT _ux_device_class_audio_interrupt_task_function(UX_DEVICE_CLASS_AUDIO *audio);
UINT _ux_device_class_audio_interrupt_send(UX_DEVICE_CLASS_AUDIO *audio, UCHAR *int_data);
UINT _ux_device_class_audio_tasks_run(VOID *instance);
UINT _uxe_device_class_audio_initialize(UX_SLAVE_CLASS_COMMAND *command);
UINT _uxe_device_class_audio_ioctl(UX_DEVICE_CLASS_AUDIO *audio, ULONG ioctl_function,
VOID *parameter);
UINT _uxe_device_class_audio_stream_get(UX_DEVICE_CLASS_AUDIO *audio, ULONG stream_index, UX_DEVICE_CLASS_AUDIO_STREAM **stream);
VOID _uxe_device_class_audio_write_thread_entry(ULONG audio_stream);
VOID _uxe_device_class_audio_read_thread_entry(ULONG audio_stream);
UINT _uxe_device_class_audio_write_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
UINT _uxe_device_class_audio_read_task_function(UX_DEVICE_CLASS_AUDIO_STREAM *stream);
UINT _uxe_device_class_audio_reception_start(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
UINT _uxe_device_class_audio_sample_read8(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *sample);
UINT _uxe_device_class_audio_sample_read16(UX_DEVICE_CLASS_AUDIO_STREAM *audio, USHORT *sample);
UINT _uxe_device_class_audio_sample_read24(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG *sample);
UINT _uxe_device_class_audio_sample_read32(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG *sample);
UINT _uxe_device_class_audio_read_frame_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR **frame_data, ULONG *frame_length);
UINT _uxe_device_class_audio_read_frame_free(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
UINT _uxe_device_class_audio_transmission_start(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
UINT _uxe_device_class_audio_frame_write(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *frame, ULONG length);
UINT _uxe_device_class_audio_write_frame_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR **buffer, ULONG *max_length);
UINT _uxe_device_class_audio_write_frame_commit(UX_DEVICE_CLASS_AUDIO_STREAM *audio, ULONG length);
UINT _uxe_device_class_audio_feedback_set(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *encoded_feedback);
UINT _uxe_device_class_audio_feedback_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio, UCHAR *encoded_feedback);
ULONG _uxe_device_class_audio_speed_get(UX_DEVICE_CLASS_AUDIO_STREAM *audio);
VOID _uxe_device_class_audio_interrupt_thread_entry(ULONG audio_inst);
UINT _uxe_device_class_audio_interrupt_task_function(UX_DEVICE_CLASS_AUDIO *audio);
UINT _uxe_device_class_audio_interrupt_send(UX_DEVICE_CLASS_AUDIO *audio, UCHAR *int_data);
/* Define Device Class Audio API prototypes. */
#if defined(UX_DEVICE_CLASS_AUDIO_ENABLE_ERROR_CHECKING)
#define ux_device_class_audio_entry _ux_device_class_audio_entry
#define ux_device_class_audio_read_thread_entry _ux_device_class_audio_read_thread_entry
#define ux_device_class_audio_write_thread_entry _ux_device_class_audio_write_thread_entry
#define ux_device_class_audio_read_task_function _ux_device_class_audio_read_task_function
#define ux_device_class_audio_write_task_function _ux_device_class_audio_write_task_function
#define ux_device_class_audio_stream_get _uxe_device_class_audio_stream_get
#define ux_device_class_audio_reception_start _uxe_device_class_audio_reception_start
#define ux_device_class_audio_sample_read8 _uxe_device_class_audio_sample_read8
#define ux_device_class_audio_sample_read16 _uxe_device_class_audio_sample_read16
#define ux_device_class_audio_sample_read24 _uxe_device_class_audio_sample_read24
#define ux_device_class_audio_sample_read32 _uxe_device_class_audio_sample_read32
#define ux_device_class_audio_read_frame_get _uxe_device_class_audio_read_frame_get
#define ux_device_class_audio_read_frame_free _uxe_device_class_audio_read_frame_free
#define ux_device_class_audio_transmission_start _uxe_device_class_audio_transmission_start
#define ux_device_class_audio_frame_write _uxe_device_class_audio_frame_write
#define ux_device_class_audio_write_frame_get _uxe_device_class_audio_write_frame_get
#define ux_device_class_audio_write_frame_commit _uxe_device_class_audio_write_frame_commit
#define ux_device_class_audio_ioctl _uxe_device_class_audio_ioctl
#define ux_device_class_audio_speed_get _ux_device_class_audio_speed_get
#define ux_device_class_audio_feedback_thread_entry _ux_device_class_audio_feedback_thread_entry
#define ux_device_class_audio_feedback_task_function _ux_device_class_audio_feedback_task_function
#define ux_device_class_audio_feedback_get _uxe_device_class_audio_feedback_get
#define ux_device_class_audio_feedback_set _uxe_device_class_audio_feedback_set
#define ux_device_class_audio_interrupt_send _uxe_device_class_audio_interrupt_send
#else
#define ux_device_class_audio_entry _ux_device_class_audio_entry
#define ux_device_class_audio_read_thread_entry _ux_device_class_audio_read_thread_entry
#define ux_device_class_audio_write_thread_entry _ux_device_class_audio_write_thread_entry
#define ux_device_class_audio_read_task_function _ux_device_class_audio_read_task_function
#define ux_device_class_audio_write_task_function _ux_device_class_audio_write_task_function
#define ux_device_class_audio_stream_get _ux_device_class_audio_stream_get
#define ux_device_class_audio_reception_start _ux_device_class_audio_reception_start
#define ux_device_class_audio_sample_read8 _ux_device_class_audio_sample_read8
#define ux_device_class_audio_sample_read16 _ux_device_class_audio_sample_read16
#define ux_device_class_audio_sample_read24 _ux_device_class_audio_sample_read24
#define ux_device_class_audio_sample_read32 _ux_device_class_audio_sample_read32
#define ux_device_class_audio_read_frame_get _ux_device_class_audio_read_frame_get
#define ux_device_class_audio_read_frame_free _ux_device_class_audio_read_frame_free
#define ux_device_class_audio_transmission_start _ux_device_class_audio_transmission_start
#define ux_device_class_audio_frame_write _ux_device_class_audio_frame_write
#define ux_device_class_audio_write_frame_get _ux_device_class_audio_write_frame_get
#define ux_device_class_audio_write_frame_commit _ux_device_class_audio_write_frame_commit
#define ux_device_class_audio_ioctl _ux_device_class_audio_ioctl
#define ux_device_class_audio_speed_get _ux_device_class_audio_speed_get
#define ux_device_class_audio_feedback_thread_entry _ux_device_class_audio_feedback_thread_entry
#define ux_device_class_audio_feedback_task_function _ux_device_class_audio_feedback_task_function
#define ux_device_class_audio_feedback_get _ux_device_class_audio_feedback_get
#define ux_device_class_audio_feedback_set _ux_device_class_audio_feedback_set
#define ux_device_class_audio_interrupt_send _ux_device_class_audio_interrupt_send
#endif
/* Determine if a C++ compiler is being used. If so, complete the standard
C conditional started above. */
#ifdef __cplusplus
}
#endif
#endif /* ifndef UX_DEVICE_CLASS_AUDIO_H */