On 2017-01-29 Martin Pieuchot <m...@openbsd.org> wrote:
> On 28/01/17(Sat) 13:02, Christopher Zimmermann wrote:
> > Hi,
> > 
> > I needed to add some quirks to support the M-Audio FastTrack Pro USB
> > audio interface.  
> 
> Since this is just for one device there's no need for a quirk.  Simply
> check for the device ID.

You are talking about usb_subr.c? Done.

> > 
> > * The device needs to be switched to the configuration 2 to show all
> >   its capabilities. This is done by a new quirk in usb_subr.c  
> 
> Then do not match the first configuration in uaudio(4).

I already tried that. It can be done, but then the umidi driver needs
changes, too, because it would otherwise claim the device in
configuration 0.
Should I do it this way without touching usb_subr.c?


Here's an updated diff which changes configuration explicitely in
usb_subr.c and doesn't touch umidi.c.


Christopher


Index: uaudio.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uaudio.c,v
retrieving revision 1.122
diff -u -p -r1.122 uaudio.c
--- uaudio.c    3 Jan 2017 06:45:58 -0000       1.122
+++ uaudio.c    29 Jan 2017 13:40:36 -0000
@@ -172,6 +172,7 @@ struct chan {
 #define UAUDIO_FLAG_VENDOR_CLASS 0x0010        /* claims vendor class but 
works */
 #define UAUDIO_FLAG_DEPENDENT   0x0020 /* play and record params must equal */
 #define UAUDIO_FLAG_EMU0202     0x0040
+#define UAUDIO_FLAG_BE          0x0080
 
 struct uaudio_devs {
        struct usb_devno         uv_dev;
@@ -223,7 +224,9 @@ struct uaudio_devs {
        { { USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_QUICKCAMZOOM },
                UAUDIO_FLAG_BAD_AUDIO },
        { { USB_VENDOR_TELEX, USB_PRODUCT_TELEX_MIC1 },
-               UAUDIO_FLAG_NO_FRAC }
+               UAUDIO_FLAG_NO_FRAC },
+       { { USB_VENDOR_MAUDIO, USB_PRODUCT_MAUDIO_FASTTRACKPRO },
+               UAUDIO_FLAG_BE | UAUDIO_FLAG_DEPENDENT }
 };
 #define uaudio_lookup(v, p) \
        ((struct uaudio_devs *)usb_lookup(uaudio_devs, v, p))
@@ -531,8 +534,19 @@ uaudio_attach(struct device *parent, str
                                found = 1;
                        }
                }
-               if (found)
+               if (found) {
                        usbd_claim_iface(sc->sc_udev, i);
+                       if (uaa->vendor == USB_VENDOR_MAUDIO &&
+                           uaa->product == USB_PRODUCT_MAUDIO_FASTTRACKPRO) {
+                               /* temporarily switch every iface to 24bit.
+                                * Causes the device to be big endian even
+                                * for 16bit samples.
+                                * using 16bits first will cause the device
+                                * to break when we later switch to 24bit. */
+                               usbd_set_interface(sc->sc_alts[i].ifaceh, 2);
+                               usbd_set_interface(sc->sc_alts[i].ifaceh, 0);
+                       }
+               }
        }
 
        for (j = 0; j < sc->sc_nalts; j++) {
@@ -1662,7 +1676,10 @@ uaudio_process_as(struct uaudio_softc *s
                } else if (prec == 24) {
                        sc->sc_altflags |= HAS_24;
                }
-               enc = AUDIO_ENCODING_SLINEAR_LE;
+               if (sc->sc_quirks & UAUDIO_FLAG_BE)
+                       enc = AUDIO_ENCODING_SLINEAR_BE;
+               else
+                       enc = AUDIO_ENCODING_SLINEAR_LE;
                format_str = "pcm";
                break;
        case UA_FMT_PCM8:
@@ -1687,9 +1704,13 @@ uaudio_process_as(struct uaudio_softc *s
                return (USBD_NORMAL_COMPLETION);
        }
 #ifdef UAUDIO_DEBUG
-       printf("%s: %s: %d-ch %d-bit %d-byte %s,", sc->sc_dev.dv_xname,
+       printf("%s: %s: alt %d(%d) for interface %d %d-ch %d-bit %d-byte %s enc 
%d,",
+              sc->sc_dev.dv_xname,
               dir == UE_DIR_IN ? "recording" : "playback",
-              chan, prec, bps, format_str);
+              id->bAlternateSetting,
+              sc->sc_nalts,
+              id->bInterfaceNumber,
+              chan, prec, bps, format_str, enc);
        if (asf1d->bSamFreqType == UA_SAMP_CONTNUOUS) {
                printf(" %d-%dHz\n", UA_SAMP_LO(asf1d), UA_SAMP_HI(asf1d));
        } else {
@@ -3312,6 +3333,9 @@ uaudio_set_params(void *addr, int setmod
                        }
                        break;
                }
+
+               if (sc->sc_quirks & UAUDIO_FLAG_BE)
+                       p->encoding = AUDIO_ENCODING_SLINEAR_BE;
 
                i = uaudio_match_alt(sc, p, mode);
                if (i < 0) {
Index: usb_subr.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/usb_subr.c,v
retrieving revision 1.131
diff -u -p -r1.131 usb_subr.c
--- usb_subr.c  19 Sep 2016 16:46:10 -0000      1.131
+++ usb_subr.c  29 Jan 2017 13:40:37 -0000
@@ -906,7 +906,13 @@ usbd_probe_and_attach(struct device *par
        DPRINTF(("usbd_probe_and_attach: looping over %d configurations\n",
                 dd->bNumConfigurations));
        /* Next try with interface drivers. */
-       for (confi = 0; confi < dd->bNumConfigurations; confi++) {
+       if (uaa.vendor == USB_VENDOR_MAUDIO &&
+           uaa.product == USB_PRODUCT_MAUDIO_FASTTRACKPRO)
+               confi = 1;
+       else
+               confi = 0;
+       for (; confi < dd->bNumConfigurations; confi++)
+       {
                DPRINTFN(1,("usbd_probe_and_attach: trying config idx=%d\n",
                            confi));
                err = usbd_set_config_index(dev, confi, 1);
Index: usbdevs
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.673
diff -u -p -r1.673 usbdevs
--- usbdevs     15 Dec 2016 15:42:05 -0000      1.673
+++ usbdevs     29 Jan 2017 13:40:38 -0000
@@ -283,6 +283,7 @@ vendor DIGITALSTREAM        0x074e  Digital Stre
 vendor AUREAL          0x0755  Aureal Semiconductor
 vendor IDOWELL         0x075d  iDowell
 vendor MIDIMAN         0x0763  Midiman
+vendor MAUDIO          0x0763  M-Audio
 vendor CYBERPOWER      0x0764  CyberPower
 vendor SURECOM         0x0769  Surecom Technology
 vendor LINKSYS2                0x077b  Linksys
@@ -3027,6 +3028,9 @@ product MICROTEK V6UL             0x80ac  ScanMaker 
 
 /* Midiman products */
 product MIDIMAN MIDISPORT2X2   0x1001  Midisport 2x2
+
+/* M-Audio products */
+product MAUDIO FASTTRACKPRO    0x2012  FastTrack Pro
 
 /* Minds At Work LLC products */
 product MINDSATWORK DW         0x0001  Digital Wallet
Index: usbdevs.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v
retrieving revision 1.685
diff -u -p -r1.685 usbdevs.h
--- usbdevs.h   15 Dec 2016 15:44:46 -0000      1.685
+++ usbdevs.h   29 Jan 2017 13:40:40 -0000
@@ -1,4 +1,4 @@
-/*     $OpenBSD: usbdevs.h,v 1.685 2016/12/15 15:44:46 pirofti Exp $   */
+/*     $OpenBSD$       */
 
 /*
  * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.
@@ -290,6 +290,7 @@
 #define        USB_VENDOR_AUREAL       0x0755          /* Aureal Semiconductor 
*/
 #define        USB_VENDOR_IDOWELL      0x075d          /* iDowell */
 #define        USB_VENDOR_MIDIMAN      0x0763          /* Midiman */
+#define        USB_VENDOR_MAUDIO       0x0763          /* M-Audio */
 #define        USB_VENDOR_CYBERPOWER   0x0764          /* CyberPower */
 #define        USB_VENDOR_SURECOM      0x0769          /* Surecom Technology */
 #define        USB_VENDOR_LINKSYS2     0x077b          /* Linksys */
@@ -3034,6 +3035,9 @@
 
 /* Midiman products */
 #define        USB_PRODUCT_MIDIMAN_MIDISPORT2X2        0x1001          /* 
Midisport 2x2 */
+
+/* M-Audio products */
+#define        USB_PRODUCT_MAUDIO_FASTTRACKPRO 0x2012          /* FastTrack 
Pro */
 
 /* Minds At Work LLC products */
 #define        USB_PRODUCT_MINDSATWORK_DW      0x0001          /* Digital 
Wallet */
Index: usbdevs_data.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs_data.h,v
retrieving revision 1.679
diff -u -p -r1.679 usbdevs_data.h
--- usbdevs_data.h      15 Dec 2016 15:44:46 -0000      1.679
+++ usbdevs_data.h      29 Jan 2017 13:40:44 -0000
@@ -1,4 +1,4 @@
-/*     $OpenBSD: usbdevs_data.h,v 1.679 2016/12/15 15:44:46 pirofti Exp $      
*/
+/*     $OpenBSD$       */
 
 /*
  * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.
@@ -7334,6 +7334,10 @@ const struct usb_known_product usb_known
            "Midisport 2x2",
        },
        {
+           USB_VENDOR_MAUDIO, USB_PRODUCT_MAUDIO_FASTTRACKPRO,
+           "FastTrack Pro",
+       },
+       {
            USB_VENDOR_MINDSATWORK, USB_PRODUCT_MINDSATWORK_DW,
            "Digital Wallet",
        },
@@ -12484,6 +12488,10 @@ const struct usb_known_vendor usb_known_
        {
            USB_VENDOR_MIDIMAN,
            "Midiman",
+       },
+       {
+           USB_VENDOR_MAUDIO,
+           "M-Audio",
        },
        {
            USB_VENDOR_CYBERPOWER,




-- 
http://gmerlin.de
OpenPGP: http://gmerlin.de/christopher.pub
2779 7F73 44FD 0736 B67A  C410 69EC 7922 34B4 2566

Attachment: pgpzgqt8g7ksB.pgp
Description: OpenPGP digital signature

Reply via email to