mirror of
https://github.com/azure-rtos/usbx.git
synced 2025-02-04 07:13:12 +08:00
668 lines
35 KiB
C
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 */
|