diff options
author | Harald Welte <laforge@gnumonks.org> | 2012-02-29 11:52:21 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2012-02-29 11:52:21 +0100 |
commit | b6697b17fcf76dc56d095caa517ba489f1ff59e5 (patch) | |
tree | 292a1ae12f451343f6258c5876f1dce351c249fd | |
parent | cc42e4df365a68580c21d92103bf106ce581c78d (diff) |
fast_source: implement get/set of mute feature
this avoids unneccessary stalls on EP0
-rw-r--r-- | firmware/src/fast_source.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/firmware/src/fast_source.c b/firmware/src/fast_source.c index 4cef913..fcc049d 100644 --- a/firmware/src/fast_source.c +++ b/firmware/src/fast_source.c @@ -33,6 +33,8 @@ #include <usb/device/core/USBDCallbacks.h> #include <usb/common/audio/AUDGenericRequest.h> #include <usb/common/audio/AUDFeatureUnitRequest.h> +#include <usb/common/audio/AUDFeatureUnitDescriptor.h> + #include <fast_source_descr.h> #include <fast_source.h> @@ -44,6 +46,7 @@ static USBDDriver fast_source_driver; struct usb_state { struct llist_head queue; int active; + uint8_t muted; }; static struct usb_state usb_state; @@ -52,15 +55,21 @@ static struct usb_state usb_state; static void fastsource_get_feat_cur_val(uint8_t entity, uint8_t channel, uint8_t control, uint8_t length) { - /* FIXME */ - USBD_Stall(0); + TRACE_INFO("get_feat(E%u, CN%u, CS%u, L%u) ", entity, channel, control, length); + if (channel == 0 && control == AUDFeatureUnitDescriptor_MUTE && length == 1) + USBD_Write(0, &usb_state.muted, sizeof(usb_state.muted), 0, 0); + else + USBD_Stall(0); } static void fastsource_set_feat_cur_val(uint8_t entity, uint8_t channel, uint8_t control, uint8_t length) { - /* FIXME */ - USBD_Stall(0); + TRACE_INFO("set_feat(E%u, CO%u, CH%u, L%u) ", entity, channel, control, length); + if (channel == 0 && control == AUDFeatureUnitDescriptor_MUTE && length == 1) + USBD_Read(0, &usb_state.muted, sizeof(usb_state.muted), 0, 0); + else + USBD_Stall(0); } /* handler for EP0 (control) requests */ @@ -208,6 +217,7 @@ void USBDCallbacks_RequestReceived(const USBGenericRequest *request) void USBDDriverCallbacks_InterfaceSettingChanged(unsigned char interface, unsigned char setting) { + printf("USB_IF_CHANGED(%u, %u)\n\r", interface, setting); if ((interface == AUDDLoopRecDriverDescriptors_STREAMING) && (setting == 0)) LED_Clear(USBD_LEDOTHER); |