diff options
Diffstat (limited to 'lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h')
| -rw-r--r-- | lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h | 396 |
1 files changed, 396 insertions, 0 deletions
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h new file mode 100644 index 000000000..ca63511b2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h | |||
| @@ -0,0 +1,396 @@ | |||
| 1 | /* | ||
| 2 | LUFA Library | ||
| 3 | Copyright (C) Dean Camera, 2017. | ||
| 4 | |||
| 5 | dean [at] fourwalledcubicle [dot] com | ||
| 6 | www.lufa-lib.org | ||
| 7 | */ | ||
| 8 | |||
| 9 | /* | ||
| 10 | Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||
| 11 | |||
| 12 | Permission to use, copy, modify, distribute, and sell this | ||
| 13 | software and its documentation for any purpose is hereby granted | ||
| 14 | without fee, provided that the above copyright notice appear in | ||
| 15 | all 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. | ||
| 20 | |||
| 21 | The author disclaims 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 | ||
| 28 | this software. | ||
| 29 | */ | ||
| 30 | |||
| 31 | /** \file | ||
| 32 | * \brief Device mode driver for the library USB Audio 1.0 Class driver. | ||
| 33 | * | ||
| 34 | * Device mode driver for the library USB Audio 1.0 Class driver. | ||
| 35 | * | ||
| 36 | * \note This file should not be included directly. It is automatically included as needed by the USB module driver | ||
| 37 | * dispatch header located in LUFA/Drivers/USB.h. | ||
| 38 | */ | ||
| 39 | |||
| 40 | /** \ingroup Group_USBClassAudio | ||
| 41 | * \defgroup Group_USBClassAudioDevice Audio 1.0 Class Device Mode Driver | ||
| 42 | * | ||
| 43 | * \section Sec_USBClassAudioDevice_Dependencies Module Source Dependencies | ||
| 44 | * The following files must be built with any user project that uses this module: | ||
| 45 | * - LUFA/Drivers/USB/Class/Device/AudioClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> | ||
| 46 | * | ||
| 47 | * \section Sec_USBClassAudioDevice_ModDescription Module Description | ||
| 48 | * Device Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver. | ||
| 49 | * | ||
| 50 | * @{ | ||
| 51 | */ | ||
| 52 | |||
| 53 | #ifndef _AUDIO_CLASS_DEVICE_H_ | ||
| 54 | #define _AUDIO_CLASS_DEVICE_H_ | ||
| 55 | |||
| 56 | /* Includes: */ | ||
| 57 | #include "../../USB.h" | ||
| 58 | #include "../Common/AudioClassCommon.h" | ||
| 59 | |||
| 60 | /* Enable C linkage for C++ Compilers: */ | ||
| 61 | #if defined(__cplusplus) | ||
| 62 | extern "C" { | ||
| 63 | #endif | ||
| 64 | |||
| 65 | /* Preprocessor Checks: */ | ||
| 66 | #if !defined(__INCLUDE_FROM_AUDIO_DRIVER) | ||
| 67 | #error Do not include this file directly. Include LUFA/Drivers/USB.h instead. | ||
| 68 | #endif | ||
| 69 | |||
| 70 | /* Public Interface - May be used in end-application: */ | ||
| 71 | /* Type Defines: */ | ||
| 72 | /** \brief Audio Class Device Mode Configuration and State Structure. | ||
| 73 | * | ||
| 74 | * Class state structure. An instance of this structure should be made for each Audio interface | ||
| 75 | * within the user application, and passed to each of the Audio class driver functions as the | ||
| 76 | * \c AudioInterfaceInfo parameter. This stores each Audio interface's configuration and state information. | ||
| 77 | */ | ||
| 78 | typedef struct | ||
| 79 | { | ||
| 80 | struct | ||
| 81 | { | ||
| 82 | uint8_t ControlInterfaceNumber; /**< Index of the Audio Control interface within the device this | ||
| 83 | * structure controls. | ||
| 84 | */ | ||
| 85 | uint8_t StreamingInterfaceNumber; /**< Index of the Audio Streaming interface within the device this | ||
| 86 | * structure controls. | ||
| 87 | */ | ||
| 88 | |||
| 89 | USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */ | ||
| 90 | USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */ | ||
| 91 | } Config; /**< Config data for the USB class interface within the device. All elements in this section | ||
| 92 | * <b>must</b> be set or the interface will fail to enumerate and operate correctly. | ||
| 93 | */ | ||
| 94 | struct | ||
| 95 | { | ||
| 96 | bool InterfaceEnabled; /**< Set and cleared by the class driver to indicate if the host has enabled the streaming endpoints | ||
| 97 | * of the Audio Streaming interface. | ||
| 98 | */ | ||
| 99 | } State; /**< State data for the USB class interface within the device. All elements in this section | ||
| 100 | * are reset to their defaults when the interface is enumerated. | ||
| 101 | */ | ||
| 102 | } USB_ClassInfo_Audio_Device_t; | ||
| 103 | |||
| 104 | /* Function Prototypes: */ | ||
| 105 | /** Configures the endpoints of a given Audio interface, ready for use. This should be linked to the library | ||
| 106 | * \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing the | ||
| 107 | * given Audio interface is selected. | ||
| 108 | * | ||
| 109 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 110 | * | ||
| 111 | * \return Boolean \c true if the endpoints were successfully configured, \c false otherwise. | ||
| 112 | */ | ||
| 113 | bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); | ||
| 114 | |||
| 115 | /** Processes incoming control requests from the host, that are directed to the given Audio class interface. This should be | ||
| 116 | * linked to the library \ref EVENT_USB_Device_ControlRequest() event. | ||
| 117 | * | ||
| 118 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 119 | */ | ||
| 120 | void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); | ||
| 121 | |||
| 122 | /** Audio class driver callback for the setting and retrieval of streaming endpoint properties. This callback must be implemented | ||
| 123 | * in the user application to handle property manipulations on streaming audio endpoints. | ||
| 124 | * | ||
| 125 | * When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||
| 126 | * the given endpoint index, and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||
| 127 | * to indicate the size of the retrieved data. | ||
| 128 | * | ||
| 129 | * \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||
| 130 | * of the \c DataLength parameter. | ||
| 131 | * | ||
| 132 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 133 | * \param[in] EndpointProperty Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t. | ||
| 134 | * \param[in] EndpointAddress Address of the streaming endpoint whose property is being referenced. | ||
| 135 | * \param[in] EndpointControl Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t. | ||
| 136 | * \param[in,out] DataLength For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||
| 137 | * length of the retrieved data. When NULL, the function should return whether the given property | ||
| 138 | * and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||
| 139 | * \param[in,out] Data Pointer to a location where the parameter data is stored for SET operations, or where | ||
| 140 | * the retrieved data is to be stored for GET operations. | ||
| 141 | * | ||
| 142 | * \return Boolean \c true if the property GET/SET was successful, \c false otherwise | ||
| 143 | */ | ||
| 144 | bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||
| 145 | const uint8_t EndpointProperty, | ||
| 146 | const uint8_t EndpointAddress, | ||
| 147 | const uint8_t EndpointControl, | ||
| 148 | uint16_t* const DataLength, | ||
| 149 | uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1); | ||
| 150 | |||
| 151 | /** Audio class driver callback for the setting and retrieval of streaming interface properties. This callback must be implemented | ||
| 152 | * in the user application to handle property manipulations on streaming audio interfaces. | ||
| 153 | * | ||
| 154 | * When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||
| 155 | * the given entity and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||
| 156 | * to indicate the size of the retrieved data. | ||
| 157 | * | ||
| 158 | * \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||
| 159 | * of the \c DataLength parameter. | ||
| 160 | * | ||
| 161 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 162 | * \param[in] Property Property of the interface to get or set, a value from \ref Audio_ClassRequests_t. | ||
| 163 | * \param[in] EntityAddress Address of the audio entity whose property is being referenced. | ||
| 164 | * \param[in] Parameter Parameter of the entity to get or set, specific to each type of entity (see USB Audio specification). | ||
| 165 | * \param[in,out] DataLength For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||
| 166 | * length of the retrieved data. When NULL, the function should return whether the given property | ||
| 167 | * and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||
| 168 | * \param[in,out] Data Pointer to a location where the parameter data is stored for SET operations, or where | ||
| 169 | * the retrieved data is to be stored for GET operations. | ||
| 170 | * | ||
| 171 | * \return Boolean \c true if the property GET/SET was successful, \c false otherwise | ||
| 172 | */ | ||
| 173 | bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||
| 174 | const uint8_t Property, | ||
| 175 | const uint8_t EntityAddress, | ||
| 176 | const uint16_t Parameter, | ||
| 177 | uint16_t* const DataLength, | ||
| 178 | uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1); | ||
| 179 | |||
| 180 | /** Audio class driver event for an Audio Stream start/stop change. This event fires each time the device receives a stream enable or | ||
| 181 | * disable control request from the host, to start and stop the audio stream. The current state of the stream can be determined by the | ||
| 182 | * State.InterfaceEnabled value inside the Audio interface structure passed as a parameter. | ||
| 183 | * | ||
| 184 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 185 | */ | ||
| 186 | void EVENT_Audio_Device_StreamStartStop(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo); | ||
| 187 | |||
| 188 | /* Inline Functions: */ | ||
| 189 | /** General management task for a given Audio class interface, required for the correct operation of the interface. This should | ||
| 190 | * be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). | ||
| 191 | * | ||
| 192 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 193 | */ | ||
| 194 | static inline void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 195 | ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 196 | static inline void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 197 | { | ||
| 198 | (void)AudioInterfaceInfo; | ||
| 199 | } | ||
| 200 | |||
| 201 | /** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming | ||
| 202 | * OUT endpoint ready for reading. | ||
| 203 | * | ||
| 204 | * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or | ||
| 205 | * the call will fail. | ||
| 206 | * | ||
| 207 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 208 | * | ||
| 209 | * \return Boolean \c true if the given Audio interface has a sample to be read, \c false otherwise. | ||
| 210 | */ | ||
| 211 | static inline bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 212 | ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 213 | static inline bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 214 | { | ||
| 215 | if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled)) | ||
| 216 | return false; | ||
| 217 | |||
| 218 | Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataOUTEndpoint.Address); | ||
| 219 | return Endpoint_IsOUTReceived(); | ||
| 220 | } | ||
| 221 | |||
| 222 | /** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects | ||
| 223 | * the streaming IN endpoint ready for writing. | ||
| 224 | * | ||
| 225 | * \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or | ||
| 226 | * the call will fail. | ||
| 227 | * | ||
| 228 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 229 | * | ||
| 230 | * \return Boolean \c true if the given Audio interface is ready to accept the next sample, \c false otherwise. | ||
| 231 | */ | ||
| 232 | static inline bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 233 | ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 234 | static inline bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 235 | { | ||
| 236 | if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled)) | ||
| 237 | return false; | ||
| 238 | |||
| 239 | Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataINEndpoint.Address); | ||
| 240 | return Endpoint_IsINReady(); | ||
| 241 | } | ||
| 242 | |||
| 243 | /** Reads the next 8-bit audio sample from the current audio interface. | ||
| 244 | * | ||
| 245 | * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure | ||
| 246 | * that the correct endpoint is selected and ready for data. | ||
| 247 | * | ||
| 248 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 249 | * | ||
| 250 | * \return Signed 8-bit audio sample from the audio interface. | ||
| 251 | */ | ||
| 252 | static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 253 | ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 254 | static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 255 | { | ||
| 256 | int8_t Sample; | ||
| 257 | |||
| 258 | (void)AudioInterfaceInfo; | ||
| 259 | |||
| 260 | Sample = Endpoint_Read_8(); | ||
| 261 | |||
| 262 | if (!(Endpoint_BytesInEndpoint())) | ||
| 263 | Endpoint_ClearOUT(); | ||
| 264 | |||
| 265 | return Sample; | ||
| 266 | } | ||
| 267 | |||
| 268 | /** Reads the next 16-bit audio sample from the current audio interface. | ||
| 269 | * | ||
| 270 | * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure | ||
| 271 | * that the correct endpoint is selected and ready for data. | ||
| 272 | * | ||
| 273 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 274 | * | ||
| 275 | * \return Signed 16-bit audio sample from the audio interface. | ||
| 276 | */ | ||
| 277 | static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 278 | ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 279 | static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 280 | { | ||
| 281 | int16_t Sample; | ||
| 282 | |||
| 283 | (void)AudioInterfaceInfo; | ||
| 284 | |||
| 285 | Sample = (int16_t)Endpoint_Read_16_LE(); | ||
| 286 | |||
| 287 | if (!(Endpoint_BytesInEndpoint())) | ||
| 288 | Endpoint_ClearOUT(); | ||
| 289 | |||
| 290 | return Sample; | ||
| 291 | } | ||
| 292 | |||
| 293 | /** Reads the next 24-bit audio sample from the current audio interface. | ||
| 294 | * | ||
| 295 | * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure | ||
| 296 | * that the correct endpoint is selected and ready for data. | ||
| 297 | * | ||
| 298 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 299 | * | ||
| 300 | * \return Signed 24-bit audio sample from the audio interface. | ||
| 301 | */ | ||
| 302 | static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 303 | ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 304 | static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 305 | { | ||
| 306 | int32_t Sample; | ||
| 307 | |||
| 308 | (void)AudioInterfaceInfo; | ||
| 309 | |||
| 310 | Sample = (((uint32_t)Endpoint_Read_8() << 16) | Endpoint_Read_16_LE()); | ||
| 311 | |||
| 312 | if (!(Endpoint_BytesInEndpoint())) | ||
| 313 | Endpoint_ClearOUT(); | ||
| 314 | |||
| 315 | return Sample; | ||
| 316 | } | ||
| 317 | |||
| 318 | /** Writes the next 8-bit audio sample to the current audio interface. | ||
| 319 | * | ||
| 320 | * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to | ||
| 321 | * ensure that the correct endpoint is selected and ready for data. | ||
| 322 | * | ||
| 323 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 324 | * \param[in] Sample Signed 8-bit audio sample. | ||
| 325 | */ | ||
| 326 | static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||
| 327 | const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 328 | static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||
| 329 | const int8_t Sample) | ||
| 330 | { | ||
| 331 | Endpoint_Write_8(Sample); | ||
| 332 | |||
| 333 | if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size) | ||
| 334 | Endpoint_ClearIN(); | ||
| 335 | } | ||
| 336 | |||
| 337 | /** Writes the next 16-bit audio sample to the current audio interface. | ||
| 338 | * | ||
| 339 | * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to | ||
| 340 | * ensure that the correct endpoint is selected and ready for data. | ||
| 341 | * | ||
| 342 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 343 | * \param[in] Sample Signed 16-bit audio sample. | ||
| 344 | */ | ||
| 345 | static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||
| 346 | const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 347 | static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||
| 348 | const int16_t Sample) | ||
| 349 | { | ||
| 350 | Endpoint_Write_16_LE(Sample); | ||
| 351 | |||
| 352 | if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size) | ||
| 353 | Endpoint_ClearIN(); | ||
| 354 | } | ||
| 355 | |||
| 356 | /** Writes the next 24-bit audio sample to the current audio interface. | ||
| 357 | * | ||
| 358 | * \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to | ||
| 359 | * ensure that the correct endpoint is selected and ready for data. | ||
| 360 | * | ||
| 361 | * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class configuration and state. | ||
| 362 | * \param[in] Sample Signed 24-bit audio sample. | ||
| 363 | */ | ||
| 364 | static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||
| 365 | const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; | ||
| 366 | static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||
| 367 | const int32_t Sample) | ||
| 368 | { | ||
| 369 | Endpoint_Write_16_LE(Sample); | ||
| 370 | Endpoint_Write_8(Sample >> 16); | ||
| 371 | |||
| 372 | if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size) | ||
| 373 | Endpoint_ClearIN(); | ||
| 374 | } | ||
| 375 | |||
| 376 | /* Private Interface - For use in library only: */ | ||
| 377 | #if !defined(__DOXYGEN__) | ||
| 378 | /* Function Prototypes: */ | ||
| 379 | #if defined(__INCLUDE_FROM_AUDIO_DEVICE_C) | ||
| 380 | void Audio_Device_Event_Stub(void) ATTR_CONST; | ||
| 381 | |||
| 382 | void EVENT_Audio_Device_StreamStartStop(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) | ||
| 383 | ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(Audio_Device_Event_Stub); | ||
| 384 | #endif | ||
| 385 | |||
| 386 | #endif | ||
| 387 | |||
| 388 | /* Disable C linkage for C++ Compilers: */ | ||
| 389 | #if defined(__cplusplus) | ||
| 390 | } | ||
| 391 | #endif | ||
| 392 | |||
| 393 | #endif | ||
| 394 | |||
| 395 | /** @} */ | ||
| 396 | |||
