From 6e0a26083ad76d2cea5aa934b530fdd8d6f4e7c1 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 12 Jun 2011 13:59:03 +0000 Subject: [PATCH] Fix bugs in the Host mode Audio class driver. --- .../AudioInputHost/ConfigDescriptor.c | 4 ++-- .../AudioOutputHost/ConfigDescriptor.c | 6 +++--- LUFA/Drivers/USB/Class/Host/Audio.c | 9 ++++++--- LUFA/Drivers/USB/Class/Host/Audio.h | 19 ++++++++++++++----- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Demos/Host/LowLevel/AudioInputHost/ConfigDescriptor.c b/Demos/Host/LowLevel/AudioInputHost/ConfigDescriptor.c index 589012aaa3..8f551144cd 100644 --- a/Demos/Host/LowLevel/AudioInputHost/ConfigDescriptor.c +++ b/Demos/Host/LowLevel/AudioInputHost/ConfigDescriptor.c @@ -92,7 +92,7 @@ uint8_t ProcessConfigurationDescriptor(void) { /* Find a new Audio Control interface if the current one doesn't contain a compatible streaming interface */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ return NoCompatibleInterfaceFound; @@ -103,7 +103,7 @@ uint8_t ProcessConfigurationDescriptor(void) /* Find the next Audio Streaming interface within that Audio Control interface */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ return NoCompatibleInterfaceFound; diff --git a/Demos/Host/LowLevel/AudioOutputHost/ConfigDescriptor.c b/Demos/Host/LowLevel/AudioOutputHost/ConfigDescriptor.c index 30b50c6819..2171320c70 100644 --- a/Demos/Host/LowLevel/AudioOutputHost/ConfigDescriptor.c +++ b/Demos/Host/LowLevel/AudioOutputHost/ConfigDescriptor.c @@ -88,11 +88,11 @@ uint8_t ProcessConfigurationDescriptor(void) /* Check if we haven't found an Audio Control interface yet, or if we have run out of related Audio Streaming interfaces */ if (!(AudioControlInterface) || USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Find a new Audio Control interface if the current one doesn't contain a compatible streaming interface */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ return NoCompatibleInterfaceFound; @@ -103,7 +103,7 @@ uint8_t ProcessConfigurationDescriptor(void) /* Find the next Audio Streaming interface within that Audio Control interface */ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, - DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) { /* Descriptor not found, error out */ return NoCompatibleInterfaceFound; diff --git a/LUFA/Drivers/USB/Class/Host/Audio.c b/LUFA/Drivers/USB/Class/Host/Audio.c index e02ce30eb9..5760b6af82 100644 --- a/LUFA/Drivers/USB/Class/Host/Audio.c +++ b/LUFA/Drivers/USB/Class/Host/Audio.c @@ -62,7 +62,7 @@ uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfa DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) { if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, - DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) { return AUDIO_ENUMERROR_NoCompatibleInterfaceFound; } @@ -70,7 +70,7 @@ uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfa AudioControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, - DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) + DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) { return AUDIO_ENUMERROR_NoCompatibleInterfaceFound; } @@ -102,7 +102,7 @@ uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfa Size = DataINEndpoint->EndpointSize; EndpointAddress = DataINEndpoint->EndpointAddress; Token = PIPE_TOKEN_IN; - Type = EP_TYPE_BULK; + Type = EP_TYPE_ISOCHRONOUS; DoubleBanked = true; AudioInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; @@ -211,6 +211,9 @@ uint8_t Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInte uint16_t const DataLength, void* const Data) { + if (!(AudioInterfaceInfo->State.IsActive)) + return HOST_SENDCONTROL_DeviceDisconnected; + uint8_t RequestType; uint8_t EndpointAddress; diff --git a/LUFA/Drivers/USB/Class/Host/Audio.h b/LUFA/Drivers/USB/Class/Host/Audio.h index befcc2f592..26d537614c 100644 --- a/LUFA/Drivers/USB/Class/Host/Audio.h +++ b/LUFA/Drivers/USB/Class/Host/Audio.h @@ -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. */ @@ -325,10 +331,11 @@ { Pipe_Write_8(Sample); - if (Pipe_BytesInPipe() == AudioInterfaceInfo->State.DataOUTPipeSize) + if (!(Pipe_IsReadWriteAllowed())) { Pipe_Unfreeze(); Pipe_ClearOUT(); + Pipe_WaitUntilReady(); Pipe_Freeze(); } } @@ -348,10 +355,11 @@ { Pipe_Write_16_LE(Sample); - if (Pipe_BytesInPipe() == AudioInterfaceInfo->State.DataOUTPipeSize) + if (!(Pipe_IsReadWriteAllowed())) { Pipe_Unfreeze(); Pipe_ClearOUT(); + Pipe_WaitUntilReady(); Pipe_Freeze(); } } @@ -372,10 +380,11 @@ Pipe_Write_16_LE(Sample); Pipe_Write_8(Sample >> 16); - if (Pipe_BytesInPipe() == AudioInterfaceInfo->State.DataOUTPipeSize) + if (!(Pipe_IsReadWriteAllowed())) { Pipe_Unfreeze(); Pipe_ClearOUT(); + Pipe_WaitUntilReady(); Pipe_Freeze(); } }