[alsa-devel] A plea for help on mixer support for Fast Track Ultra (8R)

Felix Homann linuxaudio at showlabor.de
Thu May 19 08:45:43 CEST 2011


Am 19.05.2011 07:42, schrieb Takashi Iwai:
> I see no big reason to make things more complex.  If you want to avoid
> the standard audio parsing after quirk but only parse mixer, just call
> snd_usb_create_mixer() in your quirk function.
>

Maybe I'm misunderstanding your point. But I think your suggestion is 
making things more complex.

I don't want to avoid the standard audio parsing. I want to use standard 
quirks if possible and still would like a means to call 
snd_usb_create_mixer(). That's all.

The device in question can be handled by a standard quirks 
(QUIRK_ANY_INTERFACE, QUIRK_COMPOSITE, QUIRK_AUDIO_FIXED_ENDPOINT). 
There's no hook for calling snd_usb_create_mixer() by the respective 
quirk functions, is there? Should I really need not to use those 
standard quirks just to call snd_usb_create_mixer()?

Moreover, I can't believe that the Fast Track Ultra devices are the only 
ones in the world which have a standard USB mixer without exposing it 
through the descriptors. (I've often read something like "but the mixer 
won't work") A simple generic standard way to handle those devices would 
be nice to have.

Take a look at it from my perspective: I'm just a layman on all of this. 
I full heartedly confess, that I don't actually understand all those 
functions involved in making a mixer work. I don't understand usb 
control messages an so on.
For example, take a look at the snd_nativeinstruments_control_put() 
function as Daniel suggested. There's a line

     usb_control_msg(dev, usb_sndctrlpipe(dev, 0), bRequest,
                   USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
                   cpu_to_le16(wValue), cpu_to_le16(wIndex),
                   NULL, 0, 1000);

What is it? How is anyone not deeply involved with USB programming 
and/or audio device programming supposed to understand it? How is 
anybody supposed to help Alsa development to get his device working 
without deeply diving into all this stuff *which should not be needed*?

But being a layman I could still understand that the mixer unit in my 
device is there and that it is controlled by standard usb commands 
(control messages?). So what to do next?

For the capture, playback and MIDI side it's already simple: If you have 
a device that you suspect to be more or less standard compliant but just 
doesn't tell the world about it he can just try some combinations of  
QUIRK_AUDIO_FIXED_ENDPOINT, QUIRK_AUDIO_STANDARD_INTERFACE, 
QUIRK_MIDI_FIXED_ENDPOINT etc. (which by the way are still not easy to 
understand due to lack of documentation!).

For mixers, there isn't such a standard way. That's what I would like to 
have! And that's what I have at least sketched with my patch. (While the 
standard way to tell the driver to call snd_usb_create_mixer() is still 
missing.)

Take a look at my (maybe naive?) snd_ftu_controls_create() function. 
It's easy to understand, it's simple:
I essentially just pass channel numbers, and names to 
build_named_mixer_unit_ctl() which is a slightly modified version of 
build_mixer_unit_ctl() and voila: I get a volume control for the 
respective mixer channel, just as if the control had been known from a 
descriptor. That's a lot easier to understand than fiddling around with 
usb_control_msg(), isn't it?

So, at the end as stated above, I would like to see a simple, easy to 
understand standard way to handle a mixer that essentially *is* a 
standard USB audio mixer but doesn't tell the world about it...And of 
course, it should work with my device ;-)

Kind regards,

Felix



More information about the Alsa-devel mailing list