diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2011-06-03 07:56:12 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2011-06-03 07:56:12 +0000 |
commit | 2731c3a8aef715c2ea27d541e946200bd4fc189f (patch) | |
tree | d56ff72432af73136b6c5a8c5fd9fa14da9b9852 /LUFA/Drivers/USB/Class/Device/Audio.c | |
parent | c2135f2776e01842a775502c24b59d9169ffa851 (diff) | |
download | lufa-2731c3a8aef715c2ea27d541e946200bd4fc189f.tar.gz lufa-2731c3a8aef715c2ea27d541e946200bd4fc189f.tar.bz2 lufa-2731c3a8aef715c2ea27d541e946200bd4fc189f.zip |
Added new callback to the Audio Class driver to allow for endpoint control manipulations such as data sample rates.
Modified the Class Driver AudioInput and AudioOutput demos to support multiple sample rates.
Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed.
Fix broken LowLevel audio demo descriptors.
Minor documentation fixes.
Diffstat (limited to 'LUFA/Drivers/USB/Class/Device/Audio.c')
-rw-r--r-- | LUFA/Drivers/USB/Class/Device/Audio.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/LUFA/Drivers/USB/Class/Device/Audio.c b/LUFA/Drivers/USB/Class/Device/Audio.c index 8c5c9960d..f183fdedd 100644 --- a/LUFA/Drivers/USB/Class/Device/Audio.c +++ b/LUFA/Drivers/USB/Class/Device/Audio.c @@ -45,6 +45,22 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi if (USB_ControlRequest.wIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber) return; + if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE) + { + if (USB_ControlRequest.wIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber) + return; + } + 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; + } + } + switch (USB_ControlRequest.bRequest) { case REQ_SetInterface: @@ -64,6 +80,53 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); } + + break; + case AUDIO_REQ_SetCurrent: + case AUDIO_REQ_SetMinimum: + case AUDIO_REQ_SetMaximum: + case AUDIO_REQ_SetResolution: + 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 EndpointControl = (USB_ControlRequest.wValue >> 8); + + if (CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointIndex, EndpointControl, NULL, NULL)) + { + uint16_t ValueLength = USB_ControlRequest.wLength; + uint8_t Value[ValueLength]; + + Endpoint_ClearSETUP(); + Endpoint_Read_Control_Stream_LE(Value, ValueLength); + Endpoint_ClearIN(); + + CALLBACK_Audio_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointIndex, EndpointControl, &ValueLength, Value); + } + } + + break; + case AUDIO_REQ_GetCurrent: + case AUDIO_REQ_GetMinimum: + case AUDIO_REQ_GetMaximum: + case AUDIO_REQ_GetResolution: + 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 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)) + { + Endpoint_ClearSETUP(); + Endpoint_Write_Control_Stream_LE(Value, ValueLength); + Endpoint_ClearOUT(); + } + } + + break; } } |