On 03/02/17(Fri) 12:06, Christopher Zimmermann wrote: > [...] > > > > > @@ -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? > > > > > > This device exposes only a very limited set of features in > > > configuration 1. > > > > But configuration 1 is midi not audio right? So it won't match, so > > why do you need that? > > In config 1 the device exposes these ifaces: > 0 audio control > 1 midi > 2 audio play > 3 audio rec > > in config 2 the device exposes these ifaces: > 0 audio control > 1 midi > 2 audio analog out > 3 audio analog / digital out > 4 audio analog in (with mic preamps) > 5 audio digital in > > if any iface in config 1 is claimed the device cannot switch to config 2.
But do you still want umidi(4) to attach or not at all? > > > > > + 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). > > > > > > See my comment above about the same piece of code in uaudio.c. > > > If I don't add this condition umidi will attach to configuration 1 > > > and configuration 2 wouldn't be tried, uaudio wouldn't attach. > > > > Please re-read my comment. I'm talking about the "configno" check. > > Think about somebody reading your code in 5 years, it will just looks > > like black magic. > > What about adding this comment: > > /* > * This combined audio / midi device exposes its > * full set of features only in configuration 2. > */ Or something along the way of: /* * As long as the USB stack does not support switching between multiple * configurations, only match the second one, it offers more features. */ > > What you're doing is working around our stupid USB detection mechanism > > to use a specific configuration. So you don't want your device to > > attach to umidi(4) no matter with which configuration. > > > > > + if (p->precision > 8) > > > + /* > > > + * Don't search for matching encoding. > > > + * Just tell the upper layers which one we support. > > > + */ > > > + p->encoding = sc->sc_alts[i].encoding; > > > > Why do you need that? > > - The audio device is big endian. > - The uaudio driver was written for little endian devices. > - The audio driver assumes _host_ endianness. > - The uaudio driver will reject AUDIO_SETPAR (audio(4)) requests which don't > exactly match the device encoding. > - I change uaudio to communicate the supported endianness back to audio(4), so > that userspace will receive the supported parameters via AUDIO_GETPAR and > will use a supported encoding. Ok I don't understand this magic, maybe ratchov@ can comment on it? > > > + else if (p->encoding != sc->sc_alts[i].encoding) > > > + continue; > > > + > > > alts_eh |= 1 << i; > > > DPRINTFN(6,("%s: matched %s alt %d for enc/pre\n", > > > __func__, mode == AUMODE_RECORD ? "rec" : "play", i)); > > > > -- > http://gmerlin.de > OpenPGP: http://gmerlin.de/christopher.pub > 2779 7F73 44FD 0736 B67A C410 69EC 7922 34B4 2566