M4521_BSP V3.02.000
The Board Support Package for M4521
uac_core.c
Go to the documentation of this file.
1/**************************************************************************/
13#include <stdio.h>
14#include <string.h>
15
16#include "M4521.h"
17#include "usbh_core.h"
18
19#include "usbh_uac.h"
20#include "uac.h"
21
22
50int32_t UAC_GetChannelNumber(UAC_DEV_T *audev, uint8_t target)
51{
52 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
53
54 if(uac_info == NULL)
55 return UAC_RET_IO_ERR;
56
57 if(target == UAC_SPEAKER)
58 {
59 if(!uac_info->ft_play)
61 return uac_info->ft_play->bNrChannels;
62 }
63 else
64 {
65 if(!uac_info->ft_rec)
67 return uac_info->ft_rec->bNrChannels;
68 }
69}
70
71
83int32_t UAC_GetBitResolution(UAC_DEV_T *audev, uint8_t target, uint8_t *byte_cnt)
84{
85 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
86
87 if(uac_info == NULL)
88 return UAC_RET_IO_ERR;
89
90 if(target == UAC_SPEAKER)
91 {
92 if(!uac_info->ft_play)
94 *byte_cnt = uac_info->ft_play->bSubframeSize;
95 return uac_info->ft_play->bBitResolution;
96 }
97 else
98 {
99 if(!uac_info->it_microphone)
101 *byte_cnt = uac_info->ft_rec->bSubframeSize;
102 return uac_info->ft_rec->bBitResolution;
103 }
104}
105
106
108
109uint32_t srate_to_u32(uint8_t *srate)
110{
111 return (srate[2] << 16) | (srate[1] << 8) | srate[0];
112}
113
115
116
134int32_t UAC_GetSamplingRate(UAC_DEV_T *audev, uint8_t target, uint32_t *srate_list,
135 int max_cnt, uint8_t *type)
136{
137 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
138 AC_FT1_T *ft;
139 int i;
140
141 if(target == UAC_SPEAKER)
142 ft = uac_info->ft_play;
143 else
144 ft = uac_info->ft_rec;
145
146 if(!ft)
148
149 *type = ft->bSamFreqType;
150
151 if(*type == 0)
152 {
153 if(max_cnt < 2)
155
156 srate_list[0] = srate_to_u32(&ft->tSamFreq[0][0]);
157 srate_list[1] = srate_to_u32(&ft->tSamFreq[1][0]);
158 }
159 else
160 {
161 for(i = 0; i < *type; i++)
162 srate_list[i] = srate_to_u32(&ft->tSamFreq[i][0]);
163 }
164 return 0;
165}
166
167
188int32_t UAC_SamplingRateControl(UAC_DEV_T *audev, uint8_t target, uint8_t req, uint32_t *srate)
189{
190 USB_DEV_T *udev = audev->udev;
191 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
192 USB_EP_DESC_T *ep;
193 int pipe, len;
194 uint8_t bmRequestType;
195 uint8_t tSampleFreq[3];
196
197 if(uac_info == NULL)
198 return UAC_RET_IO_ERR;
199
200 if(target == UAC_SPEAKER)
201 ep = uac_info->epd_play;
202 else
203 ep = uac_info->epd_rec;
204
205 if(ep == NULL)
207
208 tSampleFreq[0] = *srate & 0xff;
209 tSampleFreq[1] = (*srate >> 8) & 0xff;
210 tSampleFreq[2] = (*srate >> 16) & 0xff;
211
212 bmRequestType = USB_TYPE_CLASS | USB_RECIP_ENDPOINT;
213
214 if(req & 0x80)
215 {
216 pipe = usb_rcvctrlpipe(udev, 0);
217 bmRequestType |= 0x80;
218 }
219 else
220 {
221 pipe = usb_sndctrlpipe(udev, 0);
222 }
223
224 len = USBH_SendCtrlMsg(udev, pipe, req, bmRequestType,
225 (SAMPLING_FREQ_CONTROL << 8), // wValue
226 ep->bEndpointAddress, // wIndex
227 tSampleFreq, 3, UAC_REQ_TIMEOUT);
228 if(len == 3)
229 {
230 *srate = srate_to_u32(tSampleFreq);
231 return 0;
232 }
233
234 return UAC_RET_IO_ERR;
235}
236
237
238
267int32_t UAC_MuteControl(UAC_DEV_T *audev, uint8_t target, uint8_t req, uint16_t chn, uint8_t *mute)
268{
269 USB_DEV_T *udev = audev->udev;
270 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
271 AC_FU_T *fu;
272 int pipe, len;
273 uint8_t bmRequestType;
274
275 if(uac_info == NULL)
276 return UAC_RET_IO_ERR;
277
278 if(target == UAC_SPEAKER)
279 fu = uac_info->fu_play;
280 else if(target == UAC_MICROPHONE)
281 fu = uac_info->fu_rec;
282 else
283 return UAC_RET_INVALID;
284
285 //if (uac_check_fu_ctrl(uac_info, target, chn, MUTE_CONTROL) != 0)
286 // return UAC_RET_DEV_NOT_SUPPORTED;
287
288 bmRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE;
289
290 if(req & 0x80)
291 {
292 pipe = usb_rcvctrlpipe(udev, 0);
293 bmRequestType |= 0x80;
294 }
295 else
296 {
297 pipe = usb_sndctrlpipe(udev, 0);
298 }
299
300 len = USBH_SendCtrlMsg(udev, pipe, req, bmRequestType,
301 (MUTE_CONTROL << 8) | chn, // wValue
302 (fu->bUnitID << 8) | (audev->ctrl_ifnum), // wIndex
303 mute, 1, UAC_REQ_TIMEOUT);
304 if(len == 1)
305 return 0;
306 else
307 return -1;
308}
309
310
360int32_t UAC_VolumeControl(UAC_DEV_T *audev, uint8_t target, uint8_t req, uint16_t chn, uint16_t *volume)
361{
362 USB_DEV_T *udev = audev->udev;
363 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
364 AC_FU_T *fu;
365 int pipe, len;
366 uint8_t bmRequestType;
367
368 if(uac_info == NULL)
369 return UAC_RET_IO_ERR;
370
371 if(target == UAC_SPEAKER)
372 fu = uac_info->fu_play;
373 else if(target == UAC_MICROPHONE)
374 fu = uac_info->fu_rec;
375 else
376 return UAC_RET_INVALID;
377
378 //if (uac_check_fu_ctrl(uac_info, target, chn, VOLUME_CONTROL) != 0)
379 // return UAC_RET_DEV_NOT_SUPPORTED;
380
381 bmRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE;
382
383 if(req & 0x80)
384 {
385 pipe = usb_rcvctrlpipe(udev, 0);
386 bmRequestType |= 0x80;
387 }
388 else
389 {
390 pipe = usb_sndctrlpipe(udev, 0);
391 }
392
393
394 len = USBH_SendCtrlMsg(udev, pipe, req, bmRequestType,
395 (VOLUME_CONTROL << 8) | chn, // wValue
396 (fu->bUnitID << 8) | (audev->ctrl_ifnum), // wIndex
397 (uint8_t *)volume, 2, UAC_REQ_TIMEOUT);
398 if(len == 2)
399 return 0;
400 else
401 return -1;
402}
403
404
433int32_t UAC_AutoGainControl(UAC_DEV_T *audev, uint8_t target, uint8_t req, uint16_t chn, uint8_t *mute)
434{
435 USB_DEV_T *udev = audev->udev;
436 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
437 AC_FU_T *fu;
438 int pipe, len;
439 uint8_t bmRequestType;
440
441 if(uac_info == NULL)
442 return UAC_RET_IO_ERR;
443
444 if(target == UAC_SPEAKER)
445 fu = uac_info->fu_play;
446 else if(target == UAC_MICROPHONE)
447 fu = uac_info->fu_rec;
448 else
449 return UAC_RET_INVALID;
450
451 //if (uac_check_fu_ctrl(uac_info, target, chn, MUTE_CONTROL) != 0)
452 // return UAC_RET_DEV_NOT_SUPPORTED;
453
454 bmRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE;
455
456 if(req & 0x80)
457 {
458 pipe = usb_rcvctrlpipe(udev, 0);
459 bmRequestType |= 0x80;
460 }
461 else
462 {
463 pipe = usb_sndctrlpipe(udev, 0);
464 }
465
466 len = USBH_SendCtrlMsg(udev, pipe, req, bmRequestType,
467 (AUTOMATIC_GAIN_CONTROL << 8) | chn, // wValue
468 (fu->bUnitID << 8) | (audev->ctrl_ifnum), // wIndex
469 mute, 1, UAC_REQ_TIMEOUT);
470 if(len == 1)
471 return 0;
472 else
473 return -1;
474}
475
476
478
479static void iso_in_irq(URB_T *urb)
480{
481 UAC_DEV_T *audev = (UAC_DEV_T *)urb->context;
482 uint8_t *buff;
483 int i, len, cp_len;
484 int status;
485
486 /* We don't want to do anything if we are about to be removed! */
487 if(!audev || !audev->udev)
488 return;
489
490 //printf("Iso in - SF=%d, EC=%d, L=%d.\n", urb->start_frame, urb->error_count, urb->actual_length);
491 //printf("IN: SF=%d, L=%d\n", urb->start_frame, urb->actual_length);
492
493 for(i = 0; i < urb->number_of_packets; i++)
494 {
495 len = urb->iso_frame_desc[i].actual_length;
496 if(!len)
497 continue;
498
499 buff = (uint8_t *)urb->transfer_buffer + i * AU_IN_MAX_PKTSZ;
500 cp_len = audev->au_in_bufsz - audev->au_in_bufidx;
501 if(cp_len > len)
502 cp_len = len;
503
504 memcpy(&(audev->au_in_buff[audev->au_in_bufidx]), buff, cp_len);
505 audev->au_in_func(audev, &(audev->au_in_buff[audev->au_in_bufidx]), cp_len);
506
507 audev->au_in_bufidx += cp_len;
508 len -= cp_len;
509
510 if(len)
511 {
512 buff += cp_len;
513 memcpy(audev->au_in_buff, buff + cp_len, len);
514 audev->au_in_func(audev, audev->au_in_buff, len);
515 audev->au_in_bufidx = len;
516 }
517 }
518
519 if(!audev->in_streaming)
520 return;
521
522 urb->transfer_flags = USB_ISO_ASAP;
525 urb->actual_length = 0;
526 for(i = 0; i < ISO_FRAME_COUNT; i++)
527 {
528 urb->iso_frame_desc[i].status = 0;
529 urb->iso_frame_desc[i].actual_length = 0;
532 }
533
534 /* Submit URB */
535 status = USBH_SubmitUrb(urb);
536 if(status)
537 USBAS_DBGMSG("v: USBH_SubmitUrb ret %d\n", status);
538}
539
541
542
557int32_t UAC_InstallIsoInCbFun(UAC_DEV_T *audev, uint8_t *au_in_buff, int bufsiz, UAC_CB_FUNC *func)
558{
559 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
560 USB_EP_DESC_T *ep;
561
562 if(!func || !uac_info)
563 return UAC_RET_INVALID;
564
565 ep = uac_info->epd_rec;
566 if(!ep)
567 {
568 USBAS_DBGMSG("Isochronous-in endpoint not found in this device!\n");
570 }
571
572 audev->au_in_func = func;
573 audev->au_in_buff = au_in_buff;
574 audev->au_in_bufsz = bufsiz;
575 audev->au_in_bufidx = 0;
576 return UAC_RET_OK;
577}
578
579
588{
589 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
590 USB_EP_DESC_T *ep;
591 URB_T *urb;
592 int uidx, i, ret;
593
594 if(!uac_info || !audev->au_in_func || (audev->urbin[0]))
595 return UAC_RET_INVALID;
596
597 ep = uac_info->epd_rec;
598 if(!ep)
599 {
600 USBAS_DBGMSG("Isochronous-in endpoint not found in this device!\n");
602 }
603
604 audev->au_in_bufidx = 0;
605
606 /* Set interface alternative settings */
607 if(USBH_SetInterface(audev->udev, uac_info->ifd_rec->bInterfaceNumber, uac_info->ifd_rec->bAlternateSetting) != 0)
608 return UAC_RET_IO_ERR;
609
610 for(uidx = 0; uidx < ISO_IN_URB_CNT; uidx++)
611 {
612 urb = USBH_AllocUrb();
613 if(urb == NULL)
614 {
615 USBAS_DBGMSG("Failed to allocated URB!\n");
617 goto err_out;
618 }
619
620 audev->urbin[uidx] = urb;
621 urb->dev = audev->udev;
622 urb->context = audev;
623 urb->pipe = usb_rcvisocpipe(audev->udev, ep->bEndpointAddress);
624 urb->transfer_flags = USB_ISO_ASAP;
625 urb->complete = iso_in_irq;
626 urb->interval = ep->bInterval;
628 urb->transfer_buffer = &(audev->iso_inbuf[uidx][0]);
630 urb->actual_length = 0;
631
632 for(i = 0; i < ISO_FRAME_COUNT; i++)
633 {
636 }
637
638 ret = USBH_SubmitUrb(urb);
639 if(ret)
640 {
641 USBAS_DBGMSG("Error - failed to submit URB (%d)", ret);
642 ret = UAC_RET_IO_ERR;
643 goto err_out;
644 }
645 }
646 audev->in_streaming = 1;
647
648 return UAC_RET_OK;
649
650err_out:
651 for(i = 0; i < ISO_IN_URB_CNT; i++)
652 {
653 if(audev->urbin[i])
654 {
655 USBH_UnlinkUrb(audev->urbin[i]);
656 USBH_FreeUrb(audev->urbin[i]);
657 audev->urbin[i] = NULL;
658 }
659 }
660 audev->au_in_func = NULL;
661 return ret;
662}
663
664
673{
674 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
675 int i;
676
677 audev->in_streaming = 0;
678
679 /* Set interface alternative settings */
680 USBH_SetInterface(audev->udev, uac_info->ifd_rec->bInterfaceNumber, 0);
681
682 for(i = 0; i < ISO_IN_URB_CNT; i++)
683 {
684 if(audev->urbin[i])
685 {
686 USBH_UnlinkUrb(audev->urbin[i]);
687 USBH_FreeUrb(audev->urbin[i]);
688 audev->urbin[i] = NULL;
689 }
690 }
691 return UAC_RET_OK;
692}
693
694
696
697static void iso_out_irq(URB_T *urb)
698{
699 UAC_DEV_T *audev = (UAC_DEV_T *)urb->context;
700 USB_EP_DESC_T *ep;
701 int i, status;
702
703 /* We don't want to do anything if we are about to be removed! */
704 if(!audev || !audev->udev)
705 return;
706
707 ep = ((UAC_INFO_T *)audev->priv)->epd_play;
708
709 //printf("Iso out - SF=%d, EC=%d, L=%d.\n", urb->start_frame, urb->error_count, urb->actual_length);
710 //printf("OUT: SF=%d, L=%d\n", urb->start_frame, urb->actual_length);
711
712 if(!audev->out_streaming)
713 return;
714
715 urb->transfer_flags = USB_ISO_ASAP;
718 urb->actual_length = 0;
719 for(i = 0; i < ISO_FRAME_COUNT; i++)
720 {
721 urb->iso_frame_desc[i].status = 0;
723 urb->iso_frame_desc[i].actual_length = audev->au_out_func(audev, (uint8_t *)urb->transfer_buffer + urb->iso_frame_desc[i].offset, ep->wMaxPacketSize);
726 }
727
728 /* Submit URB */
729 status = USBH_SubmitUrb(urb);
730 if(status)
731 USBAS_DBGMSG("v: USBH_SubmitUrb ret %d\n", status);
732}
733
735
736
748{
749 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
750 USB_EP_DESC_T *ep;
751
752 if(!func || !uac_info)
753 return UAC_RET_INVALID;
754
755 ep = uac_info->epd_play;
756 if(!ep)
757 {
758 USBAS_DBGMSG("Isochronous-out endpoint not found in this device!\n");
760 }
761
762 audev->au_out_func = func;
763 return UAC_RET_OK;
764}
765
766
775{
776 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
777 USB_EP_DESC_T *ep;
778 URB_T *urb;
779 int uidx, i, ret;
780
781 if(!uac_info || !audev->au_out_func || (audev->urbout[0]))
782 return UAC_RET_INVALID;
783
784 ep = uac_info->epd_play;
785 if(!ep)
786 {
787 USBAS_DBGMSG("Isochronous-out endpoint not found in this device!\n");
789 }
790
791 /* Set interface alternative settings */
792 if(USBH_SetInterface(audev->udev, uac_info->ifd_play->bInterfaceNumber, uac_info->ifd_play->bAlternateSetting) != 0)
793 return UAC_RET_IO_ERR;
794
795 for(uidx = 0; uidx < ISO_OUT_URB_CNT; uidx++)
796 {
797 urb = USBH_AllocUrb();
798 if(urb == NULL)
799 {
800 USBAS_DBGMSG("Failed to allocated URB!\n");
802 goto err_out;
803 }
804
805 audev->urbout[uidx] = urb;
806 urb->dev = audev->udev;
807 urb->context = audev;
808 urb->pipe = usb_sndisocpipe(audev->udev, ep->bEndpointAddress);
809 urb->transfer_flags = USB_ISO_ASAP;
810 urb->complete = iso_out_irq;
811 urb->interval = ep->bInterval;
813 urb->transfer_buffer = &(audev->iso_outbuf[uidx][0]);
815 urb->actual_length = 0;
816
817 for(i = 0; i < ISO_FRAME_COUNT; i++)
818 {
820 urb->iso_frame_desc[i].length = audev->au_out_func(audev, (uint8_t *)urb->transfer_buffer + urb->iso_frame_desc[i].offset, ep->wMaxPacketSize);
821 if(urb->iso_frame_desc[i].length > ep->wMaxPacketSize)
822 {
823 USBAS_ERRMSG("Audio-out packet buffer overrun!\n");
824 return -1;
825 }
827 }
828
829 ret = USBH_SubmitUrb(urb);
830 if(ret)
831 {
832 USBAS_DBGMSG("Error - failed to submit URB (%d)", ret);
833 ret = UAC_RET_IO_ERR;
834 goto err_out;
835 }
836 }
837 audev->out_streaming = 1;
838
839 return UAC_RET_OK;
840
841err_out:
842 for(i = 0; i < ISO_OUT_URB_CNT; i++)
843 {
844 if(audev->urbout[i])
845 {
846 USBH_UnlinkUrb(audev->urbout[i]);
847 USBH_FreeUrb(audev->urbout[i]);
848 audev->urbout[i] = NULL;
849 }
850 }
851 audev->au_out_func = NULL;
852 return ret;
853}
854
855
864{
865 UAC_INFO_T *uac_info = (UAC_INFO_T *)audev->priv;
866 int i;
867
868 audev->out_streaming = 0;
869
870 /* Set interface alternative settings */
871 USBH_SetInterface(audev->udev, uac_info->ifd_play->bInterfaceNumber, 0);
872
873 for(i = 0; i < ISO_OUT_URB_CNT; i++)
874 {
875 if(audev->urbout[i])
876 {
877 USBH_UnlinkUrb(audev->urbout[i]);
878 USBH_FreeUrb(audev->urbout[i]);
879 audev->urbout[i] = NULL;
880 }
881 }
882 return UAC_RET_OK;
883}
884
885 /* end of group USBH_AS_EXPORTED_FUNCTIONS */
887 /* end of group USBH_AS_Driver */
889 /* end of group USB_Host_Driver */
891 /* end of group Component_Library */
893
894
895
896
897
#define NULL
Definition: M4521.h:13912
#define UAC_MICROPHONE
Definition: usbh_uac.h:34
#define UAC_SPEAKER
Definition: usbh_uac.h:33
#define ISO_OUT_URB_CNT
Definition: usbh_uac.h:28
#define UAC_RET_INVALID
Definition: usbh_uac.h:43
#define UAC_RET_DEV_NOT_SUPPORTED
Definition: usbh_uac.h:46
#define AU_IN_MAX_PKTSZ
Definition: usbh_uac.h:29
#define UAC_REQ_TIMEOUT
Definition: usbh_uac.h:31
#define ISO_IN_URB_CNT
Definition: usbh_uac.h:27
#define UAC_RET_OUT_OF_MEMORY
Definition: usbh_uac.h:44
#define UAC_RET_OK
Definition: usbh_uac.h:40
#define UAC_RET_IO_ERR
Definition: usbh_uac.h:42
#define AU_OUT_MAX_PKTSZ
Definition: usbh_uac.h:30
int ctrl_ifnum
Definition: usbh_uac.h:107
int32_t UAC_StartIsoOutPipe(UAC_DEV_T *audev)
Start to send audio data to UAC device via isochronous out pipe.
Definition: uac_core.c:774
int au_in_bufsz
Definition: usbh_uac.h:131
int32_t UAC_AutoGainControl(UAC_DEV_T *audev, uint8_t target, uint8_t req, uint16_t chn, uint8_t *gain)
Audio Class device automatic gain control.
Definition: uac_core.c:433
int32_t UAC_StopIsoOutPipe(UAC_DEV_T *audev)
Stop UAC device audio out data stream.
Definition: uac_core.c:863
int32_t UAC_MuteControl(UAC_DEV_T *audev, uint8_t target, uint8_t req, uint16_t chn, uint8_t *data)
Control Audio Class device mute on/off.
Definition: uac_core.c:267
int32_t UAC_GetChannelNumber(UAC_DEV_T *audev, uint8_t target)
Obtain Audio Class device's channel number.
Definition: uac_core.c:50
void * priv
Definition: usbh_uac.h:110
int32_t UAC_GetBitResolution(UAC_DEV_T *audev, uint8_t target, uint8_t *val8)
Obtain Audio Class device subframe bit resolution..
Definition: uac_core.c:83
UAC_CB_FUNC * au_out_func
Definition: usbh_uac.h:129
int au_in_bufidx
Definition: usbh_uac.h:132
USB_DEV_T * udev
Definition: usbh_uac.h:106
uint8_t iso_outbuf[ISO_OUT_URB_CNT][AU_OUT_MAX_PKTSZ *ISO_FRAME_COUNT]
Definition: usbh_uac.h:121
int32_t UAC_GetSamplingRate(UAC_DEV_T *audev, uint8_t target, uint32_t *srate_list, int max_cnt, uint8_t *type)
Get a list of sampling rate frequences supported by the UAC device.
Definition: uac_core.c:134
uint8_t out_streaming
Definition: usbh_uac.h:123
int32_t UAC_InstallIsoOutCbFun(UAC_DEV_T *audev, UAC_CB_FUNC *func)
Install isochronous-out (speaker) callback function. The UAC driver will call the callback function t...
Definition: uac_core.c:747
uint8_t * au_in_buff
Definition: usbh_uac.h:130
int32_t UAC_SamplingRateControl(UAC_DEV_T *audev, uint8_t target, uint8_t req, uint32_t *srate)
Set sampling rate frequency.
Definition: uac_core.c:188
uint8_t in_streaming
Definition: usbh_uac.h:122
int32_t UAC_VolumeControl(UAC_DEV_T *audev, uint8_t target, uint8_t req, uint16_t chn, uint16_t *volume)
Audio Class device volume control.
Definition: uac_core.c:360
int32_t UAC_StopIsoInPipe(UAC_DEV_T *audev)
Stop UAC device audio in data stream.
Definition: uac_core.c:672
URB_T * urbout[ISO_OUT_URB_CNT]
Definition: usbh_uac.h:119
int32_t UAC_InstallIsoInCbFun(UAC_DEV_T *audev, uint8_t *au_in_buff, int bufsiz, UAC_CB_FUNC *func)
Install isochronous-in (microphone) callback function. Received audio data from UAC device will be de...
Definition: uac_core.c:557
UAC_CB_FUNC * au_in_func
Definition: usbh_uac.h:128
uint8_t iso_inbuf[ISO_IN_URB_CNT][AU_IN_MAX_PKTSZ *ISO_FRAME_COUNT]
Definition: usbh_uac.h:120
URB_T * urbin[ISO_IN_URB_CNT]
Definition: usbh_uac.h:118
int32_t UAC_StartIsoInPipe(UAC_DEV_T *audev)
Start to receive audio data from UAC device via isochronous in pipe.
Definition: uac_core.c:587
int() UAC_CB_FUNC(struct uac_dev_t *dev, uint8_t *data, int len)
Definition: usbh_uac.h:90
URB_T * USBH_AllocUrb(void)
Allocate an URB from USB Core driver internal URB pool.
Definition: usbh_support.c:76
void * transfer_buffer
Definition: usbh_core.h:523
int32_t USBH_SubmitUrb(URB_T *urb)
Submit an URB to USB core for transfer data.
Definition: usbh_core.c:219
int actual_length
Definition: usbh_core.h:525
int transfer_buffer_length
Definition: usbh_core.h:524
uint32_t pipe
Definition: usbh_core.h:520
struct usb_device * dev
Definition: usbh_core.h:519
int number_of_packets
Definition: usbh_core.h:528
int32_t USBH_UnlinkUrb(URB_T *urb)
Cancel an URB which has been submit to USB core.
Definition: usbh_core.c:237
uint32_t transfer_flags
Definition: usbh_core.h:522
int32_t USBH_SetInterface(USB_DEV_T *dev, char interface, char alternate)
Set USB device interface.
Definition: usbh_core.c:948
ISO_PACKET_DESCRIPTOR_T iso_frame_desc[8]
Definition: usbh_core.h:534
void USBH_FreeUrb(URB_T *)
Free the URB allocated from USBH_AllocUrb()
Definition: usbh_support.c:99
void(* complete)(struct urb_t *)
Definition: usbh_core.h:533
int interval
Definition: usbh_core.h:529
void * context
Definition: usbh_core.h:532
int32_t USBH_SendCtrlMsg(USB_DEV_T *dev, uint32_t pipe, uint8_t request, uint8_t requesttype, uint16_t value, uint16_t index, void *data, uint16_t size, int timeout)
Execute a control transfer.
Definition: usbh_core.c:375
#define ISO_FRAME_COUNT
Definition: usbh_config.h:43
USB Host core driver header file.
HIDDEN_SYMBOLS struct usb_device USB_DEV_T
USB_EP_DESC_T
Definition: usbh_core.h:282