On 29/01/17(Sun) 19:33, Christopher Zimmermann wrote:
> [...]
> 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 17:13:28 -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))
> @@ -444,6 +447,11 @@ uaudio_match(struct device *parent, void
>       if (uaa->iface == NULL || uaa->device == NULL)
>               return (UMATCH_NONE);
>  
> +     if (uaa->vendor == USB_VENDOR_MAUDIO &&
> +         uaa->product == USB_PRODUCT_MAUDIO_FASTTRACKPRO &&
> +         uaa->configno != 2)
> +             return UMATCH_NONE;

Why to you need this?

> +
>       quirk = uaudio_lookup(uaa->vendor, uaa->product);
>       if (quirk)
>               flags = quirk->flags;
> @@ -531,8 +539,21 @@ 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);

How did you figure that out?  Is this behavior documented somehwere?

> +                     }
> +             }
>       }
>  
>       for (j = 0; j < sc->sc_nalts; j++) {
> @@ -1662,7 +1683,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 +1711,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,",

This line is > 80 chars.

> +            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 +3340,9 @@ uaudio_set_params(void *addr, int setmod
>                       }
>                       break;
>               }
> +
> +             if (sc->sc_quirks & UAUDIO_FLAG_BE)
> +                     p->encoding = AUDIO_ENCODING_SLINEAR_BE;

Why do you need this chunk and we don't need to set AUDIO_ENCODING_SLINEAR_SE
in the other case?

>  
>               i = uaudio_match_alt(sc, p, mode);
>               if (i < 0) {
> Index: umidi.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/umidi.c,v
> retrieving revision 1.43
> diff -u -p -r1.43 umidi.c
> --- umidi.c   7 Jan 2017 06:10:40 -0000       1.43
> +++ umidi.c   29 Jan 2017 17:13:29 -0000
> @@ -41,6 +41,7 @@
>  #include <sys/poll.h>
>  
>  #include <dev/usb/usb.h>
> +#include <dev/usb/usbdevs.h>
>  #include <dev/usb/usbdi.h>
>  #include <dev/usb/usbdi_util.h>
>  
> @@ -152,6 +153,11 @@ umidi_match(struct device *parent, void 
>       DPRINTFN(1,("umidi_match\n"));
>  
>       if (uaa->iface == NULL)
> +             return UMATCH_NONE;
> +
> +     if (uaa->vendor == USB_VENDOR_MAUDIO &&
> +         uaa->product == USB_PRODUCT_MAUDIO_FASTTRACKPRO &&
> +         uaa->configno != 2)
>               return UMATCH_NONE;

I'd leave the configno check out and add a comment explaining why we
want to force this driver to attach to uaudio(4).



>       if (umidi_search_quirk(uaa->vendor, uaa->product, uaa->ifaceno))
> 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 17:13:30 -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

How can they have the same vendor ID?  It's just the same company, so
rename the existing entry.

>  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

Reply via email to