Update of /cvsroot/alsa/alsa-driver/usb
In directory usw-pr-cvs1:/tmp/cvs-serv24692/usb

Modified Files:
        Makefile usbaudio.c 
Log Message:
moved usb wrapper functions into usbaudio.c.



Index: Makefile
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/Makefile,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Makefile    14 Aug 2002 17:23:46 -0000      1.4
+++ Makefile    10 Oct 2002 12:25:03 -0000      1.5
@@ -4,4 +4,8 @@
 include $(TOPDIR)/Makefile.conf
 
 TOPDIR = $(MAINSRCDIR)
+
+# for compatibility wrappers
+export-objs := usbaudio.o
+
 include $(TOPDIR)/alsa-kernel/usb/Makefile

Index: usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-driver/usb/usbaudio.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- usbaudio.c  14 Aug 2002 17:23:46 -0000      1.18
+++ usbaudio.c  10 Oct 2002 12:25:03 -0000      1.19
@@ -1,3 +1,193 @@
 #define SND_NEED_USB_WRAPPER
 #include "../alsa-kernel/usb/usbaudio.c"
+
+
+/*
+ * workarounds / hacks for the older kernels follow below
+ */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 24)
+/* M-Audio Quattro has weird alternate settings.  the altsetting jumps
+ * from 0 to 4 or 3 insuccessively, and this screws up
+ * usb_set_interface() (at least on 2.4.18/19 and 2.4.21).
+ */
+
+/*
+ * the following is a stripped version of usb_set_interface() with the fix
+ * for insuccessive altsetting numbers.
+ */
+
+/* stripped version for isochronos only */
+static void hack_usb_set_maxpacket(struct usb_device *dev)
+{
+       int i, b;
+
+       for (i=0; i<dev->actconfig->bNumInterfaces; i++) {
+               struct usb_interface *ifp = dev->actconfig->interface + i;
+               struct usb_interface_descriptor *as = ifp->altsetting + 
+ifp->act_altsetting;
+               struct usb_endpoint_descriptor *ep = as->endpoint;
+               int e;
+
+               for (e=0; e<as->bNumEndpoints; e++) {
+                       b = ep[e].bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+                       if (usb_endpoint_out(ep[e].bEndpointAddress)) {
+                               if (ep[e].wMaxPacketSize > dev->epmaxpacketout[b])
+                                       dev->epmaxpacketout[b] = ep[e].wMaxPacketSize;
+                       }
+                       else {
+                               if (ep[e].wMaxPacketSize > dev->epmaxpacketin [b])
+                                       dev->epmaxpacketin [b] = ep[e].wMaxPacketSize;
+                       }
+               }
+       }
+}
+
+/* stripped version */
+int snd_hack_usb_set_interface(struct usb_device *dev, int interface, int alternate)
+{
+       struct usb_interface *iface;
+       struct usb_interface_descriptor *iface_as;
+       int i, ret;
+
+       iface = usb_ifnum_to_if(dev, interface);
+       if (!iface)
+               return -EINVAL;
+       if (iface->num_altsetting == 1)
+               return 0;
+       if (alternate < 0 || alternate >= iface->num_altsetting)
+               return -EINVAL;
+
+       if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
+                                  USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE,
+                                  iface->altsetting[alternate].bAlternateSetting,
+                                  interface, NULL, 0, HZ * 5)) < 0)
+               return ret;
+
+       iface->act_altsetting = alternate;
+       iface_as = &iface->altsetting[alternate];
+       for (i = 0; i < iface_as->bNumEndpoints; i++) {
+               u8 ep = iface_as->endpoint[i].bEndpointAddress;
+               usb_settoggle(dev, ep&USB_ENDPOINT_NUMBER_MASK, usb_endpoint_out(ep), 
+0);
+       }
+       hack_usb_set_maxpacket(dev);
+       return 0;
+}
+
+#endif /* LINUX_VERSION < 2.5.24 */
+
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
+/*
+ * 2.2 compatible layer
+ */
+#undef usb_driver
+#undef usb_device_id
+#undef usb_register
+#undef usb_deregister
+#undef usb_driver_claim_interface
+
+#define MAX_USB_DRIVERS        5
+struct snd_usb_reg_table {
+       struct usb_driver driver;
+       struct snd_compat_usb_driver *orig;
+};
+
+static struct snd_usb_reg_table my_usb_drivers[MAX_USB_DRIVERS];
+
+static void *snd_usb_compat_probe(struct usb_device *dev, unsigned int ifnum)
+{
+       struct usb_config_descriptor *config = dev->actconfig;  
+       struct snd_compat_usb_driver *p;
+       struct usb_interface_descriptor *alts = config->interface[ifnum].altsetting;
+       const struct snd_compat_usb_device_id *tbl;
+       struct snd_compat_usb_device_id id;
+       int i;
+
+       for (i = 0; i < MAX_USB_DRIVERS; i++) {
+               if (! (p = my_usb_drivers[i].orig))
+                       continue;
+               for (tbl = p->id_table; tbl->match_flags; tbl++) {
+                       /* we are too lazy to check all entries... */
+                       if ((tbl->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
+                           tbl->idVendor != dev->descriptor.idVendor)
+                               return NULL;
+                       if ((tbl->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
+                           tbl->idProduct != dev->descriptor.idProduct)
+                               return NULL;
+                       if ((tbl->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) &&
+                           tbl->bInterfaceClass != alts->bInterfaceClass)
+                               return NULL;
+                       if ((tbl->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) &&
+                           tbl->bInterfaceSubClass != alts->bInterfaceSubClass)
+                               return NULL;
+               }
+               id = *tbl;
+               id.idVendor = dev->descriptor.idVendor;
+               id.idProduct = dev->descriptor.idProduct;
+               id.bInterfaceClass = alts->bInterfaceClass;
+               id.bInterfaceSubClass = alts->bInterfaceSubClass;
+               return p->probe(dev, ifnum, &id);
+       }
+       return NULL;
+}
+
+int snd_compat_usb_register(struct snd_compat_usb_driver *driver)
+{
+       int i;
+       struct usb_driver *drv;
+
+       for (i = 0; i < MAX_USB_DRIVERS; i++) {
+               if (! my_usb_drivers[i].orig)
+                       break;
+       }
+       if (i >= MAX_USB_DRIVERS)
+               return -ENOMEM;
+       my_usb_drivers[i].orig = driver;
+       drv = &my_usb_drivers[i].driver;
+       drv->name = driver->name;
+       drv->probe = snd_usb_compat_probe;
+       drv->disconnect = driver->disconnect;
+       INIT_LIST_HEAD(&drv->driver_list);
+       usb_register(drv);
+       return 0;
+}
+
+static struct snd_usb_reg_table *find_matching_usb_driver(struct 
+snd_compat_usb_driver *driver)
+{
+       int i;
+       for (i = 0; i < MAX_USB_DRIVERS; i++) {
+               if (my_usb_drivers[i].orig == driver)
+                       return &my_usb_drivers[i];
+       }
+       return NULL;
+}
+
+void snd_compat_usb_deregister(struct snd_compat_usb_driver *driver)
+{
+       struct snd_usb_reg_table *tbl;  
+       if ((tbl = find_matchingUsb_driver(driver)) != NULL)
+               tbl->orig = NULL;
+}
+
+void snd_compat_usb_driver_claim_interface(struct snd_compat_usb_driver *driver, 
+struct usb_interface *iface, void *ptr)
+{
+       if ((tbl = find_matchingUsb_driver(driver)) != NULL)
+               usb_driver_claim_interface(&tbl->driver, iface, ptr);
+}
+
+#endif /* LINUX_VERSION < 2.3.0 */
+
+
+/*
+ * symbols
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 24)
+EXPORT_SYMBOL(snd_hack_usb_set_interface);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)
+EXPORT_SYMBOL(snd_compat_usb_register);
+EXPORT_SYMBOL(snd_compat_usb_deregister);
+EXPORT_SYMBOL(snd_compat_usb_driver_claim_interface);
+#endif
+#else
 EXPORT_NO_SYMBOLS;
+#endif



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to