X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/2731c3a8aef715c2ea27d541e946200bd4fc189f..77a9df36a77d2523dd2bc24fa17f9f04c6c175c5:/LUFA/Drivers/USB/Class/Device/Audio.c?ds=inline diff --git a/LUFA/Drivers/USB/Class/Device/Audio.c b/LUFA/Drivers/USB/Class/Device/Audio.c index f183fdedd..0b47b34a2 100644 --- a/LUFA/Drivers/USB/Class/Device/Audio.c +++ b/LUFA/Drivers/USB/Class/Device/Audio.c @@ -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) @@ -70,6 +70,7 @@ void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const Audi Endpoint_ClearStatusStage(); AudioInterfaceInfo->State.InterfaceEnabled = ((USB_ControlRequest.wValue & 0xFF) != 0); + EVENT_Audio_Device_StreamStartStop(AudioInterfaceInfo); } break; @@ -89,10 +90,11 @@ 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_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, + EndpointControl, NULL, NULL)) { uint16_t ValueLength = USB_ControlRequest.wLength; uint8_t Value[ValueLength]; @@ -101,7 +103,8 @@ 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_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, + EndpointControl, &ValueLength, Value); } } @@ -113,12 +116,13 @@ 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_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, + EndpointControl, &ValueLength, Value)) { Endpoint_ClearSETUP(); Endpoint_Write_Control_Stream_LE(Value, ValueLength); @@ -139,29 +143,40 @@ bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioIn uint16_t Size; uint8_t Type; uint8_t Direction; + bool DoubleBanked; if (EndpointNum == AudioInterfaceInfo->Config.DataINEndpointNumber) { Size = AudioInterfaceInfo->Config.DataINEndpointSize; Direction = ENDPOINT_DIR_IN; Type = EP_TYPE_ISOCHRONOUS; + DoubleBanked = true; } else if (EndpointNum == AudioInterfaceInfo->Config.DataOUTEndpointNumber) { Size = AudioInterfaceInfo->Config.DataOUTEndpointSize; Direction = ENDPOINT_DIR_OUT; Type = EP_TYPE_ISOCHRONOUS; + DoubleBanked = true; } else { continue; } - if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, ENDPOINT_BANK_DOUBLE))) - return false; + if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + { + return false; + } } return true; } +void Audio_Device_Event_Stub(void) +{ + +} + #endif