45 if(g_uac_dev[i].udev ==
NULL)
47 memset((
char *)&g_uac_dev[i], 0,
sizeof(
UAC_DEV_T));
54static void free_uac_device(
UAC_DEV_T *uac)
68 if(g_uac_dev[i].udev == udev)
77static int uac_probe(IFACE_T *iface)
79 UDEV_T *udev = iface->udev;
80 ALT_IFACE_T *aif = iface->aif;
83 uint8_t bAlternateSetting;
89 if(ifd->bInterfaceClass != USB_CLASS_AUDIO)
92 if((ifd->bInterfaceSubClass != SUBCLS_AUDIOCONTROL) &&
93 (ifd->bInterfaceSubClass != SUBCLS_AUDIOSTREAMING))
95 UAC_ERRMSG(
"Audio class interface, but sub-class %x not supported!\n", ifd->bInterfaceSubClass);
99 UAC_DBGMSG(
"\nuac_probe - device (vid=0x%x, pid=0x%x), interface %d, type: %s\n",
100 udev->descriptor.idVendor, udev->descriptor.idProduct, iface->if_num, (ifd->bInterfaceSubClass == SUBCLS_AUDIOCONTROL) ?
"CONTROL" :
"STREAM");
102 uac = find_uac_device(udev);
107 uac = alloc_uac_device();
112 uac->
state = UAC_STATE_CONNECTING;
116 if(g_uac_list ==
NULL)
128 iface->context = (
void *)uac;
130 if(ifd->bInterfaceSubClass == SUBCLS_AUDIOSTREAMING)
132 if((usbh_uac_find_max_alt(iface, EP_ADDR_DIR_IN, EP_ATTR_TT_ISO, &bAlternateSetting) == 0) ||
133 (usbh_uac_find_max_alt(iface, EP_ADDR_DIR_OUT, EP_ATTR_TT_ISO, &bAlternateSetting) == 0))
135 ret = usbh_set_interface(iface, bAlternateSetting);
138 UAC_ERRMSG(
"Failed to set interface %d, %d! (%d)\n", iface->if_num, bAlternateSetting, ret);
144 UAC_ERRMSG(
"Cannot find audio stream endpoints!\n");
148 ret = uac_parse_streaming_interface(uac, iface, bAlternateSetting);
152 else if(ifd->bInterfaceSubClass == SUBCLS_AUDIOCONTROL)
154 ret = uac_parse_control_interface(uac, iface);
159 UAC_DBGMSG(
"UAC device 0x%x ==>\n", (
int)uac);
160 UAC_DBGMSG(
" CONTROL IFACE: 0x%x\n", (
int)uac->
acif.
iface);
161 UAC_DBGMSG(
" STREAM IN IFACE: 0x%x\n", (
int)uac->
asif_in.
iface);
162 UAC_DBGMSG(
" STREAM OUT IFACE: 0x%x\n", (
int)uac->
asif_out.
iface);
167static void uac_disconnect(IFACE_T *iface)
175 uac->
state = UAC_STATE_DISCONNECTING;
177 UAC_DBGMSG(
"uac_disconnect - device (vid=0x%x, pid=0x%x), interface %d removed.\n",
178 uac->
udev->descriptor.idVendor, uac->
udev->descriptor.idProduct, iface->if_num);
185 if(g_uac_dev[i].udev == iface->udev)
211 if(uac == g_uac_list)
213 g_uac_list = g_uac_list->
next;
217 for(p = g_uac_list; p !=
NULL; p = p->
next)
226 UAC_DBGMSG(
"uac_disconnect - device (vid=0x%x, pid=0x%x), UAC device removed.\n",
227 uac->
udev->descriptor.idVendor, uac->
udev->descriptor.idProduct);
228 free_uac_device(uac);
233UDEV_DRV_T uac_driver =
250 memset((
char *)&g_uac_dev[0], 0,
sizeof(g_uac_dev));
252 usbh_register_driver(&uac_driver);
NuMicro peripheral access layer header file.
#define USBH_ERR_NOT_MATCHED
#define CONFIG_UAC_MAX_DEV
#define UAC_RET_DEV_NOT_FOUND
#define UAC_RET_OUT_OF_MEMORY
int usbh_uac_stop_audio_out(struct uac_dev_t *audev)
Stop UAC device audio out data stream.
int usbh_uac_stop_audio_in(struct uac_dev_t *audev)
Stop UAC device audio in data stream.
struct uac_dev_t * usbh_uac_get_device_list(void)
Get a list of currently connected USB Audio Class devices.
HIDDEN_SYMBOLS void usbh_uac_init(void)
Initialize USB Audio Class driver.
USB Host Audio Class header file.
USB Host library header file.
USB Host library exported header file.
USB Host UAC class driver header file.