X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/34164a5550911277db03bbbc2a604bc59e0bbc99..21a012a018221fd1e55b8b054d09d7900ed9fd79:/LUFA/Drivers/USB/Class/Host/Audio.h diff --git a/LUFA/Drivers/USB/Class/Host/Audio.h b/LUFA/Drivers/USB/Class/Host/Audio.h index 0ceaf885b..81dcedbcd 100644 --- a/LUFA/Drivers/USB/Class/Host/Audio.h +++ b/LUFA/Drivers/USB/Class/Host/Audio.h @@ -29,23 +29,23 @@ */ /** \file - * \brief Host mode driver for the library USB Audio Class driver. + * \brief Host mode driver for the library USB Audio 1.0 Class driver. * - * Host mode driver for the library USB Audio Class driver. + * Host mode driver for the library USB Audio 1.0 Class driver. * * \note This file should not be included directly. It is automatically included as needed by the USB module driver * dispatch header located in LUFA/Drivers/USB.h. */ /** \ingroup Group_USBClassAudio - * \defgroup Group_USBClassAudioHost Audio Class Host Mode Driver + * \defgroup Group_USBClassAudioHost Audio 1.0 Class Host Mode Driver * * \section Sec_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: * - LUFA/Drivers/USB/Class/Host/Audio.c (Makefile source module name: LUFA_SRC_USBCLASS) * * \section Sec_ModDescription Module Description - * Host Mode USB Class driver framework interface, for the Audio USB Class driver. + * Host Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver. * * @{ */ @@ -79,8 +79,14 @@ { const struct { - uint8_t DataINPipeNumber; /**< Pipe number of the Audio interface's IN data pipe. */ - uint8_t DataOUTPipeNumber; /**< Pipe number of the Audio interface's OUT data pipe. */ + uint8_t DataINPipeNumber; /**< Pipe number of the Audio interface's IN data pipe. If this interface should not + * bind to an IN endpoint, this may be set to 0 to disable audio input streaming for + * this driver instance. + */ + uint8_t DataOUTPipeNumber; /**< Pipe number of the Audio interface's OUT data pipe. If this interface should not + * bind to an OUT endpoint, this may be set to 0 to disable audio output streaming for + * this driver instance. + */ } Config; /**< Config data for the USB class interface within the device. All elements in this section * must be set or the interface will fail to enumerate and operate correctly. */ @@ -138,8 +144,29 @@ * * \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. */ - uint8_t AUDIO_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, - bool EnableStreaming); + uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, + const bool EnableStreaming); + + /** Gets or sets the specified property of a streaming audio class endpoint that is bound to a pipe in the given + * class instance. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state. + * \param[in] DataPipeIndex Index of the data pipe whose bound endpoint is to be altered. + * \param[in] EndpointProperty Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t. + * \param[in] EndpointControl Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t. + * \param[in,out] DataLength For SET operations, the length of the parameter data to set. For GET operations, the maximum + * length of the retrieved data. + * \param[in,out] Data Pointer to a location where the parameter data is stored for SET operations, or where + * the retrieved data is to be stored for GET operations. + * + * \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. + */ + uint8_t Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, + const uint8_t DataPipeIndex, + const uint8_t EndpointProperty, + const uint8_t EndpointControl, + const uint16_t DataLength, + void* const Data); /* Inline Functions: */ /** General management task for a given Audio host class interface, required for the correct operation of @@ -171,8 +198,14 @@ if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive)) return false; - Pipe_SelectPipe(AudioInterfaceInfo->Config.DataOUTPipeNumber); - return Pipe_IsINReceived(); + bool SampleReceived = false; + + Pipe_SelectPipe(AudioInterfaceInfo->Config.DataINPipeNumber); + Pipe_Unfreeze(); + SampleReceived = Pipe_IsINReceived(); + Pipe_Freeze(); + + return SampleReceived; } /** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects @@ -192,7 +225,7 @@ if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive)) return false; - Pipe_SelectPipe(AudioInterfaceInfo->Config.DataINPipeNumber); + Pipe_SelectPipe(AudioInterfaceInfo->Config.DataOUTPipeNumber); return Pipe_IsOUTReady(); } @@ -216,7 +249,11 @@ Sample = Pipe_Read_8(); if (!(Pipe_BytesInPipe())) - Pipe_ClearIN(); + { + Pipe_Unfreeze(); + Pipe_ClearIN(); + Pipe_Freeze(); + } return Sample; } @@ -241,7 +278,11 @@ Sample = (int16_t)Pipe_Read_16_LE(); if (!(Pipe_BytesInPipe())) - Pipe_ClearIN(); + { + Pipe_Unfreeze(); + Pipe_ClearIN(); + Pipe_Freeze(); + } return Sample; } @@ -266,7 +307,11 @@ Sample = (((uint32_t)Pipe_Read_8() << 16) | Pipe_Read_16_LE()); if (!(Pipe_BytesInPipe())) - Pipe_ClearIN(); + { + Pipe_Unfreeze(); + Pipe_ClearIN(); + Pipe_Freeze(); + } return Sample; } @@ -286,8 +331,13 @@ { Pipe_Write_8(Sample); - if (Pipe_BytesInPipe() == AudioInterfaceInfo->State.DataINPipeSize) - Pipe_ClearOUT(); + if (!(Pipe_IsReadWriteAllowed())) + { + Pipe_Unfreeze(); + Pipe_ClearOUT(); + Pipe_WaitUntilReady(); + Pipe_Freeze(); + } } /** Writes the next 16-bit audio sample to the current audio interface. @@ -305,8 +355,13 @@ { Pipe_Write_16_LE(Sample); - if (Pipe_BytesInPipe() == AudioInterfaceInfo->State.DataINPipeSize) - Pipe_ClearOUT(); + if (!(Pipe_IsReadWriteAllowed())) + { + Pipe_Unfreeze(); + Pipe_ClearOUT(); + Pipe_WaitUntilReady(); + Pipe_Freeze(); + } } /** Writes the next 24-bit audio sample to the current audio interface. @@ -325,17 +380,22 @@ Pipe_Write_16_LE(Sample); Pipe_Write_8(Sample >> 16); - if (Pipe_BytesInPipe() == AudioInterfaceInfo->State.DataINPipeSize) - Pipe_ClearOUT(); + if (!(Pipe_IsReadWriteAllowed())) + { + Pipe_Unfreeze(); + Pipe_ClearOUT(); + Pipe_WaitUntilReady(); + Pipe_Freeze(); + } } /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) /* Function Prototypes: */ #if defined(__INCLUDE_FROM_AUDIO_HOST_C) - static uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor); - static uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor); - static uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor); + static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor); + static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor); + static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor); #endif #endif