Fix errors in the Audio device demos and class driver regarding multiple sample frequ...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 7 Jun 2011 02:05:19 +0000 (02:05 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 7 Jun 2011 02:05:19 +0000 (02:05 +0000)
Demos/Device/ClassDriver/AudioInput/AudioInput.c
Demos/Device/ClassDriver/AudioOutput/AudioOutput.c
Demos/Device/LowLevel/AudioInput/AudioInput.c
Demos/Device/LowLevel/AudioInput/Descriptors.c
Demos/Device/LowLevel/AudioOutput/AudioOutput.c
Demos/Device/LowLevel/AudioOutput/Descriptors.c
LUFA/Drivers/USB/Class/Device/Audio.c
LUFA/Drivers/USB/Class/Device/Audio.h
LUFA/ManPages/FutureChanges.txt

index 1acf20d..447cb91 100644 (file)
@@ -190,13 +190,13 @@ void EVENT_USB_Device_ControlRequest(void)
  */
 bool CALLBACK_Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
                                            const uint8_t EndpointProperty,
-                                           const uint8_t EndpointIndex,
+                                           const uint8_t EndpointAddress,
                                            const uint8_t EndpointControl,
                                            uint16_t* const DataLength,
                                            uint8_t* Data)
 {
        /* Check the requested endpoint to see if a supported endpoint is being manipulated */
-       if (EndpointIndex == Microphone_Audio_Interface.Config.DataINEndpointNumber)
+       if (EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_IN | Microphone_Audio_Interface.Config.DataINEndpointNumber))
        {
                /* Check the requested control to see if a supported control is being manipulated */
                if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq)
index 77727f0..f1d6060 100644 (file)
@@ -226,13 +226,13 @@ void EVENT_USB_Device_ControlRequest(void)
  */
 bool CALLBACK_Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
                                            const uint8_t EndpointProperty,
-                                           const uint8_t EndpointIndex,
+                                           const uint8_t EndpointAddress,
                                            const uint8_t EndpointControl,
                                            uint16_t* const DataLength,
                                            uint8_t* Data)
 {
        /* Check the requested endpoint to see if a supported endpoint is being manipulated */
-       if (EndpointIndex == Speaker_Audio_Interface.Config.DataOUTEndpointNumber)
+       if (EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_OUT | Speaker_Audio_Interface.Config.DataOUTEndpointNumber))
        {
                /* Check the requested control to see if a supported control is being manipulated */
                if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq)
index d791676..e00b693 100644 (file)
@@ -160,18 +160,18 @@ void EVENT_USB_Device_ControlRequest(void)
                case AUDIO_REQ_SetCurrent:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
                        {
-                               /* Extract out the relevant request information to get the target Endpoint index and control being set */
-                               uint8_t EndpointIndex   = (uint8_t)USB_ControlRequest.wIndex;
+                               /* Extract out the relevant request information to get the target Endpoint address and control being set */
+                               uint8_t EndpointAddress = (uint8_t)USB_ControlRequest.wIndex;
                                uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
                                
                                /* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
-                               if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+                               if ((EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_IN | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
                                {
                                        uint8_t SampleRate[3];
                                
                                        Endpoint_ClearSETUP();
                                        Endpoint_Read_Control_Stream_LE(SampleRate, sizeof(SampleRate));
-                                       Endpoint_ClearOUT();
+                                       Endpoint_ClearIN();
                                        
                                        /* Set the new sampling frequency to the value given by the host */
                                        CurrentAudioSampleFrequency = (((uint32_t)SampleRate[2] << 16) | ((uint32_t)SampleRate[1] << 8) | (uint32_t)SampleRate[0]);
@@ -183,14 +183,14 @@ void EVENT_USB_Device_ControlRequest(void)
                        
                        break;
                case AUDIO_REQ_GetCurrent:
-                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
                        {
-                               /* Extract out the relevant request information to get the target Endpoint index and control being retrieved */
-                               uint8_t EndpointIndex   = (uint8_t)USB_ControlRequest.wIndex;
+                               /* Extract out the relevant request information to get the target Endpoint address and control being retrieved */
+                               uint8_t EndpointAddress = (uint8_t)USB_ControlRequest.wIndex;
                                uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
                                
                                /* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
-                               if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+                               if ((EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_IN | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
                                {
                                        uint8_t SampleRate[3];
                                        
index 1095907..04f2524 100644 (file)
@@ -235,7 +235,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
                        .Header                   = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t), .Type = DTYPE_CSEndpoint},
                        .Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General,
 
-                       .Attributes               = AUDIO_EP_ACCEPTS_SMALL_PACKETS,
+                       .Attributes               = (AUDIO_EP_ACCEPTS_SMALL_PACKETS | AUDIO_EP_SAMPLE_FREQ_CONTROL),
 
                        .LockDelayUnits           = 0x00,
                        .LockDelay                = 0x0000
index c5d9363..fcc3d5a 100644 (file)
@@ -186,12 +186,12 @@ void EVENT_USB_Device_ControlRequest(void)
                case AUDIO_REQ_SetCurrent:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
                        {
-                               /* Extract out the relevant request information to get the target Endpoint index and control being set */
-                               uint8_t EndpointIndex   = (uint8_t)USB_ControlRequest.wIndex;
+                               /* Extract out the relevant request information to get the target Endpoint address and control being set */
+                               uint8_t EndpointAddress = (uint8_t)USB_ControlRequest.wIndex;
                                uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
                                
                                /* Only handle SET CURRENT requests to the audio endpoint's sample frequency property */
-                               if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+                               if ((EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_OUT | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
                                {
                                        uint8_t SampleRate[3];
                                
@@ -211,12 +211,12 @@ void EVENT_USB_Device_ControlRequest(void)
                case AUDIO_REQ_GetCurrent:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
                        {
-                               /* Extract out the relevant request information to get the target Endpoint index and control being retrieved */
-                               uint8_t EndpointIndex   = (uint8_t)USB_ControlRequest.wIndex;
+                               /* Extract out the relevant request information to get the target Endpoint address and control being retrieved */
+                               uint8_t EndpointAddress = (uint8_t)USB_ControlRequest.wIndex;
                                uint8_t EndpointControl = (USB_ControlRequest.wValue >> 8);
                                
                                /* Only handle GET CURRENT requests to the audio endpoint's sample frequency property */
-                               if ((EndpointIndex == AUDIO_STREAM_EPNUM) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
+                               if ((EndpointAddress == (ENDPOINT_DESCRIPTOR_DIR_OUT | AUDIO_STREAM_EPNUM)) && (EndpointControl == AUDIO_EPCONTROL_SamplingFreq))
                                {
                                        uint8_t SampleRate[3];
                                        
index a86eee7..0a6ec6d 100644 (file)
@@ -235,7 +235,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
                        .Header                   = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t), .Type = DTYPE_CSEndpoint},
                        .Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General,
 
-                       .Attributes               = AUDIO_EP_ACCEPTS_SMALL_PACKETS,
+                       .Attributes               = (AUDIO_EP_ACCEPTS_SMALL_PACKETS | AUDIO_EP_SAMPLE_FREQ_CONTROL),
 
                        .LockDelayUnits           = 0x00,
                        .LockDelay                = 0x0000
index f183fde..dbf62da 100644 (file)
@@ -42,9 +42,6 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
        if (!(Endpoint_IsSETUPReceived()))
          return;
 
-       if (USB_ControlRequest.wIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber)
-         return;
-
        if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE)
        {
                if (USB_ControlRequest.wIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber)
@@ -52,13 +49,16 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
        }
        else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT)
        {
-               if (!((AudioInterfaceInfo->Config.DataINEndpointNumber &&
-                      (USB_ControlRequest.wIndex == AudioInterfaceInfo->Config.DataINEndpointNumber)) ||
-                     (AudioInterfaceInfo->Config.DataOUTEndpointNumber &&
-                      (USB_ControlRequest.wIndex == AudioInterfaceInfo->Config.DataOUTEndpointNumber))))
-               {
-                       return;
-               }
+               bool EndpointFilterMatch = false;
+       
+               EndpointFilterMatch |= (AudioInterfaceInfo->Config.DataINEndpointNumber &&
+                                       ((uint8_t)USB_ControlRequest.wIndex == (ENDPOINT_DESCRIPTOR_DIR_IN  | AudioInterfaceInfo->Config.DataINEndpointNumber)));
+       
+               EndpointFilterMatch |= (AudioInterfaceInfo->Config.DataOUTEndpointNumber &&
+                                       ((uint8_t)USB_ControlRequest.wIndex == (ENDPOINT_DESCRIPTOR_DIR_OUT | AudioInterfaceInfo->Config.DataOUTEndpointNumber)));
+
+               if (!(EndpointFilterMatch))
+                 return;
        }       
 
        switch (USB_ControlRequest.bRequest)
@@ -89,10 +89,10 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
                        {
                                uint8_t EndpointProperty = USB_ControlRequest.bRequest;
-                               uint8_t EndpointIndex    = (uint8_t)USB_ControlRequest.wIndex;
+                               uint8_t EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex;
                                uint8_t EndpointControl  = (USB_ControlRequest.wValue >> 8);
                        
-                               if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointIndex, EndpointControl, NULL, NULL))
+                               if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, EndpointControl, NULL, NULL))
                                {
                                        uint16_t ValueLength = USB_ControlRequest.wLength;
                                        uint8_t  Value[ValueLength];
@@ -101,7 +101,7 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
                                        Endpoint_Read_Control_Stream_LE(Value, ValueLength);
                                        Endpoint_ClearIN();                                     
 
-                                       CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointIndex, EndpointControl, &ValueLength, Value);
+                                       CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, EndpointControl, &ValueLength, Value);
                                }                               
                        }
 
@@ -113,12 +113,12 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
                        {
                                uint8_t  EndpointProperty = USB_ControlRequest.bRequest;
-                               uint8_t  EndpointIndex    = (uint8_t)USB_ControlRequest.wIndex;
+                               uint8_t  EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex;
                                uint8_t  EndpointControl  = (USB_ControlRequest.wValue >> 8);
                                uint16_t ValueLength      = USB_ControlRequest.wLength;
                                uint8_t  Value[ValueLength];
 
-                               if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointIndex, EndpointControl, &ValueLength, Value))
+                               if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, EndpointControl, &ValueLength, Value))
                                {
                                        Endpoint_ClearSETUP();
                                        Endpoint_Write_Control_Stream_LE(Value, ValueLength);
index ed23683..cad87f3 100644 (file)
                         *
                         *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
                         *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t.
-                        *  \param[in]     EndpointIndex       Index of the streaming endpoint whose property is being referenced.
+                        *  \param[in]     EndpointAddress     Address of the streaming endpoint whose property is being referenced.
                         *  \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. When NULL, the function should return whether the given property
                         */
                        bool CALLBACK_Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
                                                                   const uint8_t EndpointProperty,
-                                                                  const uint8_t EndpointIndex,
+                                                                  const uint8_t EndpointAddress,
                                                                   const uint8_t EndpointControl,
                                                                   uint16_t* const DataLength,
                                                                   uint8_t* Data);
index 4eea5c5..522d0a3 100644 (file)
@@ -33,7 +33,6 @@
   *      -# Add class driver support for Test and Measurement class
   *      -# Add class driver support for EEM class
   *      -# Add class driver support for ECM class
-  *      -# Extend Low Level Audio demos to include sample rate switching
   *  - Ports
   *      -# Complete AVR32 port for existing devices, add UC3C support
   *      -# Atmel ARM7 series microcontrollers