On 12/11/2017 07:40 AM, Takashi Iwai wrote:
On Mon, 11 Dec 2017 13:30:35 +0100, Hans de Goede wrote:
Hi All,
This weekend I've created a modified ucm config based on:
https://github.com/plbossart/UCM/tree/master/chtrt5645
For a board which has a single speaker connected to the left channel (standard mono speaker setup) and a stereo headphone jack with working jack detection.
I've been unable to come up with a ucm file which allows selecting between a "Stereo Speaker + Headphone" vs "Mono Speaker + Headphone" output profile.
https://github.com/plbossart/UCM/tree/master/byt-rt5640 has "Mono Speaker", "Stereo Speaker" and "Headphone" profiles but does not auto-switch between Headphone and speaker based on jack detection, I've been unable to allow selecting either stereo or mono speaker while keeping auto-switching to/from the headphones.
But thinking more about this I don't think that having "Stereo Speaker + Headphone" and "Mono Speaker + Headphone" profiles is the answer. Profiles make sense on machines with a bunch of outputs where we don't no what the user is going to plug in, but in this case the stereo vs mono speaker distinction is a clear property of the device, which we should IMHO autodetect based on the device-model.
So I think we need a way to have different ucm files per board, so instead of loading /usr/share/ucm/chtrt5645/*.conf on my device, alsa should try to load /usr/share/ucm/chtrt5645-<boardname>/*.conf
Specifically I'm thinking about using udev + hwdb (dmi string) matching to set an ALSA_UCM_NAME udev property.
If the consensus is that this is a good idea I can take a shot at writing patches for this (in my spare time mostly), the downside of this approach is it would cause a dependency on libudev for the alsa ucm code.
You don't need to patch, I guess. The recent code should set a string generated from DMI as the longname of the card, and alsa-lib UCM parser prefers the longname to the driver name field. That is, /usr/share/ucm/$LONGNAME/$LONGNAME.conf would be read at first, then /usr/share/ucm/$DRIVER/$DRIVER.conf is used as fallback.
The long name is really awful at times, I've seen PulseAudio try to load UCM profiles of boards with over 40 characters with multiple repeats. Also from a maintainability perspective we need the include mechanism and I don't think it was ever merged - or what I saw wasn't very useful.