3 Copyright (C) Dean Camera, 2009.
5 dean [at] fourwalledcubicle [dot] com
6 www.fourwalledcubicle.com
10 Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
12 Permission to use, copy, modify, and distribute this software
13 and its documentation for any purpose and without fee is hereby
14 granted, provided that the above copyright notice appear in all
15 copies and that both that the copyright notice and this
16 permission notice and warranty disclaimer appear in supporting
17 documentation, and that the name of the author not be used in
18 advertising or publicity pertaining to distribution of the
19 software without specific, written prior permission.
21 The author disclaim all warranties with regard to this
22 software, including all implied warranties of merchantability
23 and fitness. In no event shall the author be liable for any
24 special, indirect or consequential damages or any damages
25 whatsoever resulting from loss of use, data or profits, whether
26 in an action of contract, negligence or other tortious action,
27 arising out of or in connection with the use or performance of
31 /** \ingroup Group_USBDeviceClassDrivers
32 * @defgroup Group_USBClassAudioDevice Audio Device Class Driver - LUFA/Drivers/Class/Device/Audio.h
34 * \section Sec_Dependencies Module Source Dependencies
35 * The following files must be built with any user project that uses this module:
36 * - LUFA/Drivers/USB/Class/Device/Audio.c
38 * \section Module Description
39 * Functions, macros, variables, enums and types related to the management of USB Audio Class interfaces
40 * within a USB device.
45 #ifndef _AUDIO_CLASS_H_
46 #define _AUDIO_CLASS_H_
49 #include "../../USB.h"
53 /* Enable C linkage for C++ Compilers: */
54 #if defined(__cplusplus)
59 /** Descriptor header constant to indicate a Audio class interface descriptor. */
60 #define DTYPE_AudioInterface 0x24
62 /** Descriptor header constant to indicate a Audio class endpoint descriptor. */
63 #define DTYPE_AudioEndpoint 0x25
65 /** Audio class descriptor subtype value for a Audio class specific header descriptor. */
66 #define DSUBTYPE_Header 0x01
68 /** Audio class descriptor subtype value for an Output Terminal Audio class specific descriptor. */
69 #define DSUBTYPE_InputTerminal 0x02
71 /** Audio class descriptor subtype value for an Input Terminal Audio class specific descriptor. */
72 #define DSUBTYPE_OutputTerminal 0x03
74 /** Audio class descriptor subtype value for a Feature Unit Audio class specific descriptor. */
75 #define DSUBTYPE_FeatureUnit 0x06
77 /** Audio class descriptor subtype value for a general Audio class specific descriptor. */
78 #define DSUBTYPE_General 0x01
80 /** Audio class descriptor subtype value for an Audio class specific descriptor indicating the format of an audio stream. */
81 #define DSUBTYPE_Format 0x02
83 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
84 #define CHANNEL_LEFT_FRONT (1 << 0)
86 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
87 #define CHANNEL_RIGHT_FRONT (1 << 1)
89 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
90 #define CHANNEL_CENTER_FRONT (1 << 2)
92 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
93 #define CHANNEL_LOW_FREQ_ENHANCE (1 << 3)
95 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
96 #define CHANNEL_LEFT_SURROUND (1 << 4)
98 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
99 #define CHANNEL_RIGHT_SURROUND (1 << 5)
101 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
102 #define CHANNEL_LEFT_OF_CENTER (1 << 6)
104 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
105 #define CHANNEL_RIGHT_OF_CENTER (1 << 7)
107 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
108 #define CHANNEL_SURROUND (1 << 8)
110 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
111 #define CHANNEL_SIDE_LEFT (1 << 9)
113 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
114 #define CHANNEL_SIDE_RIGHT (1 << 10)
116 /** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
117 #define CHANNEL_TOP (1 << 11)
119 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
120 #define FEATURE_MUTE (1 << 0)
122 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
123 #define FEATURE_VOLUME (1 << 1)
125 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
126 #define FEATURE_BASS (1 << 2)
128 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
129 #define FEATURE_MID (1 << 3)
131 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
132 #define FEATURE_TREBLE (1 << 4)
134 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
135 #define FEATURE_GRAPHIC_EQUALIZER (1 << 5)
137 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
139 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
140 #define FEATURE_AUTOMATIC_GAIN (1 << 6)
142 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
143 #define FEATURE_DELAY (1 << 7)
145 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
146 #define FEATURE_BASS_BOOST (1 << 8)
148 /** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
149 #define FEATURE_BASS_LOUDNESS (1 << 9)
151 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
152 #define TERMINAL_UNDEFINED 0x0100
154 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
155 #define TERMINAL_STREAMING 0x0101
157 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
158 #define TERMINAL_VENDOR 0x01FF
160 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
161 #define TERMINAL_IN_UNDEFINED 0x0200
163 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
164 #define TERMINAL_IN_MIC 0x0201
166 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
167 #define TERMINAL_IN_DESKTOP_MIC 0x0202
169 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
170 #define TERMINAL_IN_PERSONAL_MIC 0x0203
172 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
173 #define TERMINAL_IN_OMNIDIR_MIC 0x0204
175 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
176 #define TERMINAL_IN_MIC_ARRAY 0x0205
178 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
179 #define TERMINAL_IN_PROCESSING_MIC 0x0206
181 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
182 #define TERMINAL_IN_OUT_UNDEFINED 0x0300
184 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
185 #define TERMINAL_OUT_SPEAKER 0x0301
187 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
188 #define TERMINAL_OUT_HEADPHONES 0x0302
190 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
191 #define TERMINAL_OUT_HEAD_MOUNTED 0x0303
193 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
194 #define TERMINAL_OUT_DESKTOP 0x0304
196 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
197 #define TERMINAL_OUT_ROOM 0x0305
199 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
200 #define TERMINAL_OUT_COMMUNICATION 0x0306
202 /** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
203 #define TERMINAL_OUT_LOWFREQ 0x0307
205 /** Convenience macro, to fill a 24-bit AudioSampleFreq_t structure with the given sample rate as a 24-bit number.
207 * \param freq Required audio sampling frequency in HZ
209 #define AUDIO_SAMPLE_FREQ(freq) {LowWord: ((uint32_t)freq & 0x00FFFF), HighByte: (((uint32_t)freq >> 16) & 0x0000FF)}
211 /** Mask for the attributes parameter of an Audio class specific Endpoint descriptor, indicating that the endpoint
212 * accepts only filled endpoint packets of audio samples.
214 #define EP_ACCEPTS_ONLY_FULL_PACKETS (1 << 7)
216 /** Mask for the attributes parameter of an Audio class specific Endpoint descriptor, indicating that the endpoint
217 * will accept partially filled endpoint packets of audio samples.
219 #define EP_ACCEPTS_SMALL_PACKETS (0 << 7)
222 /** Type define for an Audio class specific interface descriptor. This follows a regular interface descriptor to
223 * supply extra information about the audio device's layout to the host. See the USB Audio specification for more
228 USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length */
229 uint8_t Subtype
; /**< Sub type value used to distinguish between audio class specific descriptors */
231 uint16_t ACSpecification
; /**< Binary coded decimal value, indicating the supported Audio Class specification version */
232 uint16_t TotalLength
; /**< Total length of the Audio class specific descriptors, including this descriptor */
234 uint8_t InCollection
; /**< Total number of audio class interfaces within this device */
235 uint8_t InterfaceNumbers
[1]; /**< Interface numbers of each audio interface */
236 } USB_AudioInterface_AC_t
;
238 /** Type define for an Audio class specific Feature Unit descriptor. This indicates to the host what features
239 * are present in the device's audio stream for basic control, such as per-channel volume. See the USB Audio
240 * specification for more details.
244 USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length */
245 uint8_t Subtype
; /**< Sub type value used to distinguish between audio class specific descriptors */
247 uint8_t UnitID
; /**< ID value of this feature unit - must be a unique value within the device */
248 uint8_t SourceID
; /**< Source ID value of the audio source input into this feature unit */
250 uint8_t ControlSize
; /**< Size of each element in the ChanelControlls array */
251 uint8_t ChannelControls
[3]; /**< Feature masks for the control channel, and each separate audio channel */
253 uint8_t FeatureUnitStrIndex
; /**< Index of a string descriptor describing this descriptor within the device */
254 } USB_AudioFeatureUnit_t
;
256 /** Type define for an Audio class specific input terminal descriptor. This indicates to the host that the device
257 * contains an input audio source, either from a physical terminal on the device, or a logical terminal (for example,
258 * a USB endpoint). See the USB Audio specification for more details.
262 USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length */
263 uint8_t Subtype
; /**< Sub type value used to distinguish between audio class specific descriptors */
265 uint8_t TerminalID
; /**< ID value of this terminal unit - must be a unique value within the device */
266 uint16_t TerminalType
; /**< Type of terminal, a TERMINAL_* mask */
267 uint8_t AssociatedOutputTerminal
; /**< ID of associated output terminal, for physically grouped terminals
268 * such as the speaker and microphone of a phone handset
270 uint8_t TotalChannels
; /**< Total number of separate audio channels within this interface (right, left, etc.) */
271 uint16_t ChannelConfig
; /**< CHANNEL_* masks indicating what channel layout is supported by this terminal */
273 uint8_t ChannelStrIndex
; /**< Index of a string descriptor describing this channel within the device */
274 uint8_t TerminalStrIndex
; /**< Index of a string descriptor describing this descriptor within the device */
275 } USB_AudioInputTerminal_t
;
277 /** Type define for an Audio class specific output terminal descriptor. This indicates to the host that the device
278 * contains an output audio sink, either to a physical terminal on the device, or a logical terminal (for example,
279 * a USB endpoint). See the USB Audio specification for more details.
283 USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length */
284 uint8_t Subtype
; /**< Sub type value used to distinguish between audio class specific descriptors */
286 uint8_t TerminalID
; /**< ID value of this terminal unit - must be a unique value within the device */
287 uint16_t TerminalType
; /**< Type of terminal, a TERMINAL_* mask */
288 uint8_t AssociatedInputTerminal
; /**< ID of associated input terminal, for physically grouped terminals
289 * such as the speaker and microphone of a phone handset
291 uint8_t SourceID
; /**< ID value of the unit this terminal's audio is sourced from */
293 uint8_t TerminalStrIndex
; /**< Index of a string descriptor describing this descriptor within the device */
294 } USB_AudioOutputTerminal_t
;
296 /** Type define for an Audio class specific streaming interface descriptor. This indicates to the host
297 * how audio streams within the device are formatted. See the USB Audio specification for more details.
301 USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length */
302 uint8_t Subtype
; /**< Sub type value used to distinguish between audio class specific descriptors */
304 uint8_t TerminalLink
; /**< ID value of the output terminal this descriptor is describing */
306 uint8_t FrameDelay
; /**< Delay in frames resulting from the complete sample processing from input to output */
307 uint16_t AudioFormat
; /**< Format of the audio stream, see Audio Device Formats specification */
308 } USB_AudioInterface_AS_t
;
310 /** Type define for a 24bit audio sample frequency structure. GCC does not contain a built in 24bit datatype,
311 * this this structure is used to build up the value instead. Fill this structure with the SAMPLE_FREQ() macro.
315 uint16_t LowWord
; /**< Low 16 bits of the 24-bit value */
316 uint8_t HighByte
; /**< Upper 8 bits of the 24-bit value */
319 /** Type define for an Audio class specific audio format descriptor. This is used to give the host full details
320 * about the number of channels, the sample resolution, acceptable sample frequencies and encoding method used
321 * in the device's audio streams. See the USB Audio specification for more details.
325 USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length */
326 uint8_t Subtype
; /**< Sub type value used to distinguish between audio class specific descriptors */
328 uint8_t FormatType
; /**< Format of the audio stream, see Audio Device Formats specification */
329 uint8_t Channels
; /**< Total number of discrete channels in the stream */
331 uint8_t SubFrameSize
; /**< Size in bytes of each channel's sample data in the stream */
332 uint8_t BitResolution
; /**< Bits of resolution of each channel's samples in the stream */
334 uint8_t SampleFrequencyType
; /**< Total number of sample frequencies supported by the device */
335 AudioSampleFreq_t SampleFrequencies
[1]; /**< Sample frequencies supported by the device */
338 /** Type define for an Audio class specific endpoint descriptor. This contains a regular endpoint
339 * descriptor with a few Audio-class specific extensions. See the USB Audio specification for more details.
343 USB_Descriptor_Endpoint_t Endpoint
; /**< Standard endpoint descriptor describing the audio endpoint */
345 uint8_t Refresh
; /**< Always set to zero */
346 uint8_t SyncEndpointNumber
; /**< Endpoint address to send synchronisation information to, if needed (zero otherwise) */
347 } USB_AudioStreamEndpoint_Std_t
;
349 /** Type define for an Audio class specific extended endpoint descriptor. This contains extra information
350 * on the usage of endpoints used to stream audio in and out of the USB Audio device, and follows an Audio
351 * class specific extended endpoint descriptor. See the USB Audio specification for more details.
355 USB_Descriptor_Header_t Header
; /**< Regular descriptor header containing the descriptor's type and length */
356 uint8_t Subtype
; /**< Sub type value used to distinguish between audio class specific descriptors */
358 uint8_t Attributes
; /**< Audio class specific endpoint attributes, such as ACCEPTS_SMALL_PACKETS */
360 uint8_t LockDelayUnits
; /**< Units used for the LockDelay field, see Audio class specification */
361 uint16_t LockDelay
; /**< Time required to internally lock endpoint's internal clock recovery circuitry */
362 } USB_AudioStreamEndpoint_Spc_t
;
364 /** Type define for an Audio Class interface configuration and state structure. This structure should be used for each Audio
365 * Class unit within the device, and passed (per-interface) to the Audio Class driver functions so that each Audio interface
366 * has seperate state and configuration data and can be controlled seperately.
370 uint8_t StreamingInterfaceNumber
; /**< Index of the Audio Streaming interface within the device this structure controls */
372 uint8_t DataINEndpointNumber
; /**< Endpoint number of the incomming Audio Streaming data, if available (zero if unused) */
373 uint16_t DataINEndpointSize
; /**< Size in bytes of the incomming Audio Streaming data endpoint, if available (zero if unused) */
375 uint8_t DataOUTEndpointNumber
; /**< Endpoint number of the outgoing Audio Streaming data, if available (zero if unused) */
376 uint16_t DataOUTEndpointSize
; /**< Size in bytes of the outgoing Audio Streaming data endpoint, if available (zero if unused) */
378 bool InterfaceEnabled
; /**< Set and cleared by the class driver to indicate if the host has enabled the streaming endpoints
379 * of the Audio Streaming interface
381 } USB_ClassInfo_Audio_t
;
383 /* Function Prototypes: */
384 /** Configures the endpoints of a given Audio interface, ready for use. This should be linked to the library
385 * \ref EVENT_USB_ConfigurationChanged() event so that the endpoints are configured when the configuration containing the
386 * given Audio interface is selected.
388 * \param AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
390 * \return Boolean true if the endpoints were sucessfully configured, false otherwise
392 bool USB_Audio_ConfigureEndpoints(USB_ClassInfo_Audio_t
* AudioInterfaceInfo
);
394 /** Processes incomming control requests from the host, that are directed to the given Audio class interface. This should be
395 * linked to the library \ref EVENT_USB_UnhandledControlPacket() event.
397 * \param AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
399 void USB_Audio_ProcessControlPacket(USB_ClassInfo_Audio_t
* AudioInterfaceInfo
);
401 /** General management task for a given Audio class interface, required for the correct operation of the interface. This should
402 * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
404 * \param AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
406 void USB_Audio_USBTask(USB_ClassInfo_Audio_t
* AudioInterfaceInfo
);
408 /** Reads the next 8-bit audio sample from the current audio interface.
410 * \note This should be preceeded immediately by a call to the USB_Audio_IsSampleReceived() function to ensure that
411 * the correct endpoint is selected and ready for data.
413 * \return Signed 8-bit audio sample from the audio interface
415 int8_t USB_Audio_ReadSample8(void);
417 /** Reads the next 16-bit audio sample from the current audio interface.
419 * \note This should be preceeded immediately by a call to the USB_Audio_IsSampleReceived() function to ensure that
420 * the correct endpoint is selected and ready for data.
422 * \return Signed 16-bit audio sample from the audio interface
424 int16_t USB_Audio_ReadSample16(void);
426 /** Reads the next 24-bit audio sample from the current audio interface.
428 * \note This should be preceeded immediately by a call to the USB_Audio_IsSampleReceived() function to ensure that
429 * the correct endpoint is selected and ready for data.
431 * \return Signed 24-bit audio sample from the audio interface
433 int32_t USB_Audio_ReadSample24(void);
435 /** Writes the next 8-bit audio sample to the current audio interface.
437 * \note This should be preceeded immediately by a call to the USB_Audio_IsReadyForNextSample() function to ensure that
438 * the correct endpoint is selected and ready for data.
440 * \param Sample Signed 8-bit audio sample
442 void USB_Audio_WriteSample8(int8_t Sample
);
444 /** Writes the next 16-bit audio sample to the current audio interface.
446 * \note This should be preceeded immediately by a call to the USB_Audio_IsReadyForNextSample() function to ensure that
447 * the correct endpoint is selected and ready for data.
449 * \param Sample Signed 16-bit audio sample
451 void USB_Audio_WriteSample16(int16_t Sample
);
453 /** Writes the next 24-bit audio sample to the current audio interface.
455 * \note This should be preceeded immediately by a call to the USB_Audio_IsReadyForNextSample() function to ensure that
456 * the correct endpoint is selected and ready for data.
458 * \param Sample Signed 24-bit audio sample
460 void USB_Audio_WriteSample24(int32_t Sample
);
462 /** Determines if the given audio interface is ready for a sample to be read from it.
464 * \param AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
466 * \return Boolean true if the given Audio interface has a sample to be read, false otherwise
468 bool USB_Audio_IsSampleReceived(USB_ClassInfo_Audio_t
* AudioInterfaceInfo
);
470 /** Determines if the given audio interface is ready to accept the next sample to be written to it.
472 * \param AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state.
474 * \return Boolean true if the given Audio interface is ready to accept the next sample, false otherwise
476 bool USB_Audio_IsReadyForNextSample(USB_ClassInfo_Audio_t
* AudioInterfaceInfo
);
478 /* Disable C linkage for C++ Compilers: */
479 #if defined(__cplusplus)