278 lines
8.3 KiB
C
278 lines
8.3 KiB
C
/**
|
|
* @file
|
|
* @brief USB Audio Device Class public header
|
|
*
|
|
* Header follows below documentation:
|
|
* - USB Device Class Definition for Audio Devices (audio10.pdf)
|
|
*
|
|
* Additional documentation considered a part of USB Audio v1.0:
|
|
* - USB Device Class Definition for Audio Data Formats (frmts10.pdf)
|
|
* - USB Device Class Definition for Terminal Types (termt10.pdf)
|
|
*/
|
|
|
|
#ifndef _USBD_AUDIO_H_
|
|
#define _USBD_AUDIO_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** Audio Interface Subclass Codes
|
|
* Refer to Table A-2 from audio10.pdf
|
|
*/
|
|
#define AUDIO_SUBCLASS_UNDEFINED 0x00
|
|
#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01
|
|
#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
|
|
#define AUDIO_SUBCLASS_MIDISTREAMING 0x03
|
|
|
|
#define AUDIO_PROTOCOL_UNDEFINED 0x00U
|
|
|
|
#define AUDIO_ENDPOINT_GENERAL 0x01U
|
|
|
|
/** Audio Class-Specific Control Interface Descriptor Subtypes
|
|
* Refer to Table A-5 from audio10.pdf
|
|
*/
|
|
#define AUDIO_CONTROL_UNDEFINED 0x01U
|
|
#define AUDIO_CONTROL_HEADER 0x01U
|
|
#define AUDIO_CONTROL_INPUT_TERMINAL 0x02U
|
|
#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03U
|
|
#define AUDIO_CONTROL_MIXER_UNIT 0x04U
|
|
#define AUDIO_CONTROL_SELECTOR_UNIT 0x05U
|
|
#define AUDIO_CONTROL_FEATURE_UNIT 0x06U
|
|
#define AUDIO_CONTROL_PROCESSING_UNIT 0x07U
|
|
#define AUDIO_CONTROL_EXTENSION_UNIT 0x08U
|
|
|
|
/** Audio Class-Specific AS Interface Descriptor Subtypes
|
|
* Refer to Table A-6 from audio10.pdf
|
|
*/
|
|
#define AUDIO_STREAMING_UNDEFINED 0x00U
|
|
#define AUDIO_STREAMING_GENERAL 0x01U
|
|
#define AUDIO_STREAMING_FORMAT_TYPE 0x02U
|
|
#define AUDIO_STREAMING_FORMAT_SPECIFIC 0x03U
|
|
|
|
/** Audio Class-Specific Request Codes
|
|
* Refer to Table A-9 from audio10.pdf
|
|
*/
|
|
#define AUDIO_REQUEST_UNDEFINED 0x00
|
|
#define AUDIO_REQUEST_SET_CUR 0x01
|
|
#define AUDIO_REQUEST_GET_CUR 0x81
|
|
#define AUDIO_REQUEST_SET_MIN 0x02
|
|
#define AUDIO_REQUEST_GET_MIN 0x82
|
|
#define AUDIO_REQUEST_SET_MAX 0x03
|
|
#define AUDIO_REQUEST_GET_MAX 0x83
|
|
#define AUDIO_REQUEST_SET_RES 0x04
|
|
#define AUDIO_REQUEST_GET_RES 0x84
|
|
#define AUDIO_REQUEST_SET_MEM 0x05
|
|
#define AUDIO_REQUEST_GET_MEM 0x85
|
|
#define AUDIO_REQUEST_GET_STAT 0xFF
|
|
|
|
/* Feature Unit Control Bits */
|
|
#define AUDIO_CONTROL_MUTE 0x0001
|
|
#define AUDIO_CONTROL_VOLUME 0x0002
|
|
#define AUDIO_CONTROL_BASS 0x0004
|
|
#define AUDIO_CONTROL_MID 0x0008
|
|
#define AUDIO_CONTROL_TREBLE 0x0010
|
|
#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020
|
|
#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040
|
|
#define AUDIO_CONTROL_DEALY 0x0080
|
|
#define AUDIO_CONTROL_BASS_BOOST 0x0100
|
|
#define AUDIO_CONTROL_LOUDNESS 0x0200
|
|
|
|
/** Feature Unit Control Selectors
|
|
* Refer to Table A-11 from audio10.pdf
|
|
*/
|
|
#define AUDIO_FU_CONTROL_MUTE 0x01
|
|
#define AUDIO_FU_CONTROL_VOLUME 0x02
|
|
#define AUDIO_FU_CONTROL_BASS 0x03
|
|
#define AUDIO_FU_CONTROL_MID 0x04
|
|
#define AUDIO_FU_CONTROL_TREBLE 0x05
|
|
#define AUDIO_FU_CONTROL_GRAPHIC_EQUALIZER 0x06
|
|
#define AUDIO_FU_CONTROL_AUTOMATIC_GAIN 0x07
|
|
#define AUDIO_FU_CONTROL_DELAY 0x08
|
|
#define AUDIO_FU_CONTROL_BASS_BOOST 0x09
|
|
#define AUDIO_FU_CONTROL_LOUDNESS 0x0A
|
|
|
|
/* Audio Descriptor Types */
|
|
#define AUDIO_UNDEFINED_DESCRIPTOR_TYPE 0x20
|
|
#define AUDIO_DEVICE_DESCRIPTOR_TYPE 0x21
|
|
#define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22
|
|
#define AUDIO_STRING_DESCRIPTOR_TYPE 0x23
|
|
#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24
|
|
#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25
|
|
|
|
/* Audio Data Format Type I Codes */
|
|
#define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000
|
|
#define AUDIO_FORMAT_PCM 0x0001
|
|
#define AUDIO_FORMAT_PCM8 0x0002
|
|
#define AUDIO_FORMAT_IEEE_FLOAT 0x0003
|
|
#define AUDIO_FORMAT_ALAW 0x0004
|
|
#define AUDIO_FORMAT_MULAW 0x0005
|
|
|
|
/* Predefined Audio Channel Configuration Bits */
|
|
#define AUDIO_CHANNEL_M 0x0000 /* Mono */
|
|
#define AUDIO_CHANNEL_L 0x0001 /* Left Front */
|
|
#define AUDIO_CHANNEL_R 0x0002 /* Right Front */
|
|
#define AUDIO_CHANNEL_C 0x0004 /* Center Front */
|
|
#define AUDIO_CHANNEL_LFE 0x0008 /* Low Freq. Enhance. */
|
|
#define AUDIO_CHANNEL_LS 0x0010 /* Left Surround */
|
|
#define AUDIO_CHANNEL_RS 0x0020 /* Right Surround */
|
|
#define AUDIO_CHANNEL_LC 0x0040 /* Left of Center */
|
|
#define AUDIO_CHANNEL_RC 0x0080 /* Right of Center */
|
|
#define AUDIO_CHANNEL_S 0x0100 /* Surround */
|
|
#define AUDIO_CHANNEL_SL 0x0200 /* Side Left */
|
|
#define AUDIO_CHANNEL_SR 0x0400 /* Side Right */
|
|
#define AUDIO_CHANNEL_T 0x0800 /* Top */
|
|
|
|
#define AUDIO_FORMAT_TYPE_I 0x01
|
|
#define AUDIO_FORMAT_TYPE_II 0x02
|
|
#define AUDIO_FORMAT_TYPE_III 0x03
|
|
|
|
/** USB Terminal Types
|
|
* Refer to Table 2-1 - Table 2-4 from termt10.pdf
|
|
*/
|
|
enum usb_audio_terminal_types {
|
|
/* USB Terminal Types */
|
|
USB_AUDIO_USB_UNDEFINED = 0x0100,
|
|
USB_AUDIO_USB_STREAMING = 0x0101,
|
|
USB_AUDIO_USB_VENDOR_SPEC = 0x01FF,
|
|
|
|
/* Input Terminal Types */
|
|
USB_AUDIO_IN_UNDEFINED = 0x0200,
|
|
USB_AUDIO_IN_MICROPHONE = 0x0201,
|
|
USB_AUDIO_IN_DESKTOP_MIC = 0x0202,
|
|
USB_AUDIO_IN_PERSONAL_MIC = 0x0203,
|
|
USB_AUDIO_IN_OM_DIR_MIC = 0x0204,
|
|
USB_AUDIO_IN_MIC_ARRAY = 0x0205,
|
|
USB_AUDIO_IN_PROC_MIC_ARRAY = 0x0205,
|
|
|
|
/* Output Terminal Types */
|
|
USB_AUDIO_OUT_UNDEFINED = 0x0300,
|
|
USB_AUDIO_OUT_SPEAKER = 0x0301,
|
|
USB_AUDIO_OUT_HEADPHONES = 0x0302,
|
|
USB_AUDIO_OUT_HEAD_AUDIO = 0x0303,
|
|
USB_AUDIO_OUT_DESKTOP_SPEAKER = 0x0304,
|
|
USB_AUDIO_OUT_ROOM_SPEAKER = 0x0305,
|
|
USB_AUDIO_OUT_COMM_SPEAKER = 0x0306,
|
|
USB_AUDIO_OUT_LOW_FREQ_SPEAKER = 0x0307,
|
|
|
|
/* Bi-directional Terminal Types */
|
|
USB_AUDIO_IO_UNDEFINED = 0x0400,
|
|
USB_AUDIO_IO_HANDSET = 0x0401,
|
|
USB_AUDIO_IO_HEADSET = 0x0402,
|
|
USB_AUDIO_IO_SPEAKERPHONE_ECHO_NONE = 0x0403,
|
|
USB_AUDIO_IO_SPEAKERPHONE_ECHO_SUP = 0x0404,
|
|
USB_AUDIO_IO_SPEAKERPHONE_ECHO_CAN = 0x0405,
|
|
};
|
|
|
|
/**
|
|
* @warning Size of baInterface is 2 just to make it useable
|
|
* for all kind of devices: headphones, microphone and headset.
|
|
* Actual size of the struct should be checked by reading
|
|
* .bLength.
|
|
*/
|
|
struct cs_ac_if_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDescriptorSubtype;
|
|
uint16_t bcdADC;
|
|
uint16_t wTotalLength;
|
|
uint8_t bInCollection;
|
|
uint8_t baInterfaceNr[2];
|
|
} __packed;
|
|
|
|
struct input_terminal_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDescriptorSubtype;
|
|
uint8_t bTerminalID;
|
|
uint16_t wTerminalType;
|
|
uint8_t bAssocTerminal;
|
|
uint8_t bNrChannels;
|
|
uint16_t wChannelConfig;
|
|
uint8_t iChannelNames;
|
|
uint8_t iTerminal;
|
|
} __packed;
|
|
|
|
/**
|
|
* @note Size of Feature unit descriptor is not fixed.
|
|
* This structure is just a helper not a common type.
|
|
*/
|
|
struct feature_unit_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDescriptorSubtype;
|
|
uint8_t bUnitID;
|
|
uint8_t bSourceID;
|
|
uint8_t bControlSize;
|
|
uint16_t bmaControls[1];
|
|
} __packed;
|
|
|
|
struct output_terminal_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDescriptorSubtype;
|
|
uint8_t bTerminalID;
|
|
uint16_t wTerminalType;
|
|
uint8_t bAssocTerminal;
|
|
uint8_t bSourceID;
|
|
uint8_t iTerminal;
|
|
} __packed;
|
|
|
|
struct as_cs_interface_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDescriptorSubtype;
|
|
uint8_t bTerminalLink;
|
|
uint8_t bDelay;
|
|
uint16_t wFormatTag;
|
|
} __packed;
|
|
|
|
struct format_type_i_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDescriptorSubtype;
|
|
uint8_t bFormatType;
|
|
uint8_t bNrChannels;
|
|
uint8_t bSubframeSize;
|
|
uint8_t bBitResolution;
|
|
uint8_t bSamFreqType;
|
|
uint8_t tSamFreq[3];
|
|
} __packed;
|
|
|
|
struct std_as_ad_endpoint_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bEndpointAddress;
|
|
uint8_t bmAttributes;
|
|
uint16_t wMaxPacketSize;
|
|
uint8_t bInterval;
|
|
uint8_t bRefresh;
|
|
uint8_t bSynchAddress;
|
|
} __packed;
|
|
|
|
struct cs_as_ad_ep_descriptor {
|
|
uint8_t bLength;
|
|
uint8_t bDescriptorType;
|
|
uint8_t bDescriptorSubtype;
|
|
uint8_t bmAttributes;
|
|
uint8_t bLockDelayUnits;
|
|
uint16_t wLockDelay;
|
|
} __packed;
|
|
|
|
struct usbd_audio_control_info {
|
|
uint16_t vol_min;
|
|
uint16_t vol_max;
|
|
uint16_t vol_res;
|
|
uint16_t vol_current;
|
|
uint8_t mute;
|
|
};
|
|
|
|
void usbd_audio_add_interface(usbd_class_t *class, usbd_interface_t *intf);
|
|
void usbd_audio_set_interface_callback(uint8_t value);
|
|
void usbd_audio_set_volume(uint8_t vol);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _USB_AUDIO_H_ */
|