[alsa-devel] [alsa-lib][PATCH] conf: SOF-Intel: map pcm device for sof driver
On the machines with HDA codec, the sof driver will use the legacy hda codec driver, as a result, most mixer controls are same as before.
There are only 2 difference: - HDMI pcm index is 3, 4 and 5 instead of 3, 7, 8... - dmic is on device 6, 7 instead of 0
After applying this patch, we will get (aplay -L): hdmi:CARD=sofsklhdacard,DEV=0 sof-skl_hda_card, HDMI Audio Output hdmi:CARD=sofsklhdacard,DEV=1 sof-skl_hda_card, HDMI Audio Output hdmi:CARD=sofsklhdacard,DEV=2 sof-skl_hda_card, HDMI Audio Output
and (arecord -L): dmic:CARD=sofsklhdacard,DEV=0 sof-skl_hda_card, Digital Mic connected to the PCH directly dmic:CARD=sofsklhdacard,DEV=1 sof-skl_hda_card, Digital Mic connected to the PCH directly
Then we could add minor changes in the pulseaudio configuration, after that, all output and input devices will work under pulseaudio.
This is a supplement for ucm, the ucm for sof driver has higher priority than this conf, if there is no ucm for sof driver, this conf will take effect.
Signed-off-by: Hui Wang hui.wang@canonical.com --- src/conf/alsa.conf | 4 + src/conf/cards/Makefile.am | 3 +- src/conf/cards/SOF-Intel.conf | 345 ++++++++++++++++++++++++++++++++++ src/conf/cards/aliases.conf | 1 + src/conf/pcm/Makefile.am | 2 +- src/conf/pcm/dmic.conf | 54 ++++++ 6 files changed, 407 insertions(+), 2 deletions(-) create mode 100644 src/conf/cards/SOF-Intel.conf create mode 100644 src/conf/pcm/dmic.conf
diff --git a/src/conf/alsa.conf b/src/conf/alsa.conf index 09980586..28c11c81 100644 --- a/src/conf/alsa.conf +++ b/src/conf/alsa.conf @@ -101,6 +101,9 @@ defaults.pcm.iec958.card defaults.pcm.card defaults.pcm.iec958.device defaults.pcm.device defaults.pcm.modem.card defaults.pcm.card defaults.pcm.modem.device defaults.pcm.device +defaults.pcm.dmic.card defaults.pcm.card +defaults.pcm.dmic.device 6 + # truncate files via file or tee PCM defaults.pcm.file_format "raw" defaults.pcm.file_truncate true @@ -141,6 +144,7 @@ pcm.dmix cards.pcm.dmix pcm.dsnoop cards.pcm.dsnoop pcm.modem cards.pcm.modem pcm.phoneline cards.pcm.phoneline +pcm.dmic cards.pcm.dmic
pcm.hw { @args [ CARD DEV SUBDEV ] diff --git a/src/conf/cards/Makefile.am b/src/conf/cards/Makefile.am index 00999f01..b22386a0 100644 --- a/src/conf/cards/Makefile.am +++ b/src/conf/cards/Makefile.am @@ -58,7 +58,8 @@ cfg_files = aliases.conf \ VIA8237.conf \ VX222.conf \ VXPocket.conf \ - VXPocket440.conf + VXPocket440.conf \ + SOF-Intel.conf
if BUILD_ALISP cfg_files += aliases.alisp diff --git a/src/conf/cards/SOF-Intel.conf b/src/conf/cards/SOF-Intel.conf new file mode 100644 index 00000000..fe280d72 --- /dev/null +++ b/src/conf/cards/SOF-Intel.conf @@ -0,0 +1,345 @@ +# +# Configuration for the Intel HD audio (with sof driver) +# + +confdir:pcm/front.conf + +SOF-Intel.pcm.front.0 { + @args [ CARD ] + @args.CARD { + type string + } + type asym + playback.pcm { + type softvol + slave.pcm { + type hw + card $CARD + subdevice 0 + } + control { + name "PCM Playback Volume" + card $CARD + } + } + capture.pcm { + type hw + card $CARD + } +} + +# default with dmix+softvol & dsnoop +SOF-Intel.pcm.default { + @args [ CARD ] + @args.CARD { + type string + } + type asym + playback.pcm { + type plug + slave.pcm { + type softvol + slave.pcm { + @func concat + strings [ "dmix:" $CARD ] + } + control { + name "PCM Playback Volume" + card $CARD + } + } + } + capture.pcm { + type plug + slave.pcm { + type softvol + slave.pcm { + @func concat + strings [ "dsnoop:" $CARD ] + } + control { + name "Digital Capture Volume" + card $CARD + } + min_dB -30.0 + max_dB 30.0 + resolution 121 + } + # to avoid possible phase inversions with digital mics + route_policy copy + } + hint.device 0 +} + +confdir:pcm/surround21.conf +confdir:pcm/surround40.conf +confdir:pcm/surround41.conf +confdir:pcm/surround50.conf +confdir:pcm/surround51.conf +confdir:pcm/surround71.conf + +SOF-Intel.pcm.surround40.0 cards.SOF-Intel.pcm.front.0 +SOF-Intel.pcm.surround51.0 cards.SOF-Intel.pcm.front.0 +SOF-Intel.pcm.surround71.0 cards.SOF-Intel.pcm.front.0 + +confdir:pcm/iec958.conf + +SOF-Intel.pcm.iec958.0 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { + type string + } + @args.AES0 { + type integer + } + @args.AES1 { + type integer + } + @args.AES2 { + type integer + } + @args.AES3 { + type integer + } + type asym + playback.pcm { + type hooks + slave.pcm { + type hw + card $CARD + device 1 + } + hooks.0 { + type ctl_elems + hook_args [ + { + name "IEC958 Playback Default" + index 16 + optional true + lock true + preserve true + value [ $AES0 $AES1 $AES2 $AES3 ] + } + { + name "IEC958 Playback Switch" + index 16 + optional true + value true + # if this element is present, skip the rest + skip_rest true + } + { + name "IEC958 Playback Default" + lock true + preserve true + value [ $AES0 $AES1 $AES2 $AES3 ] + } + { + name "IEC958 Playback Switch" + value true + } + ] + } + } + capture.pcm { + type hooks + slave.pcm { + type hw + card $CARD + device 1 + } + hooks.0 { + type ctl_elems + hook_args [ + { + name "IEC958 Capture Switch" + lock true + preserve true + value true + } + ] + } + } + hint.device 1 +} + +confdir:pcm/hdmi.conf + +SOF-Intel.pcm.hdmi.common { + @args [ CARD DEVICE CTLINDEX AES0 AES1 AES2 AES3 ] + @args.CARD { + type string + } + @args.DEVICE { + type integer + } + @args.CTLINDEX { + type integer + } + @args.AES0 { + type integer + } + @args.AES1 { + type integer + } + @args.AES2 { + type integer + } + @args.AES3 { + type integer + } + type hooks + slave.pcm { + type hw + card $CARD + device $DEVICE + } + hooks.0 { + type ctl_elems + hook_args [ + { + name "IEC958 Playback Default" + index $CTLINDEX + lock true + preserve true + value [ $AES0 $AES1 $AES2 $AES3 ] + } + { + name "IEC958 Playback Switch" + index $CTLINDEX + value true + } + ] + } + hint.device $DEVICE +} + +SOF-Intel.pcm.hdmi.0 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { type string } + @args.AES0 { type integer } + @args.AES1 { type integer } + @args.AES2 { type integer } + @args.AES3 { type integer } + @func refer + name { + @func concat + strings [ + "cards.SOF-Intel.pcm.hdmi.common:" + "CARD=" $CARD "," + "DEVICE=3," + "CTLINDEX=0," + "AES0=" $AES0 "," + "AES1=" $AES1 "," + "AES2=" $AES2 "," + "AES3=" $AES3 + ] + } +} + +SOF-Intel.pcm.hdmi.1 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { type string } + @args.AES0 { type integer } + @args.AES1 { type integer } + @args.AES2 { type integer } + @args.AES3 { type integer } + @func refer + name { + @func concat + strings [ + "cards.SOF-Intel.pcm.hdmi.common:" + "CARD=" $CARD "," + "DEVICE=4," + "CTLINDEX=1," + "AES0=" $AES0 "," + "AES1=" $AES1 "," + "AES2=" $AES2 "," + "AES3=" $AES3 + ] + } +} + +SOF-Intel.pcm.hdmi.2 { + @args [ CARD AES0 AES1 AES2 AES3 ] + @args.CARD { type string } + @args.AES0 { type integer } + @args.AES1 { type integer } + @args.AES2 { type integer } + @args.AES3 { type integer } + @func refer + name { + @func concat + strings [ + "cards.SOF-Intel.pcm.hdmi.common:" + "CARD=" $CARD "," + "DEVICE=5," + "CTLINDEX=2," + "AES0=" $AES0 "," + "AES1=" $AES1 "," + "AES2=" $AES2 "," + "AES3=" $AES3 + ] + } +} + +confdir:pcm/dmic.conf + +SOF-Intel.pcm.dmic.common { + @args [ CARD DEVICE ] + @args.CARD { + type string + } + @args.DEVICE { + type integer + } + type plug + slave.pcm { + type hw + card $CARD + device $DEVICE + } + + hint.device $DEVICE +} + +SOF-Intel.pcm.dmic.0 { + @args [ CARD ] + @args.CARD { type string } + @func refer + name { + @func concat + strings [ + "cards.SOF-Intel.pcm.dmic.common:" + "CARD=" $CARD "," + "DEVICE=6" + ] + } +} + +SOF-Intel.pcm.dmic.1 { + @args [ CARD ] + @args.CARD { type string } + @func refer + name { + @func concat + strings [ + "cards.SOF-Intel.pcm.dmic.common:" + "CARD=" $CARD "," + "DEVICE=7" + ] + } +} + +confdir:pcm/modem.conf + +SOF-Intel.pcm.modem.0 { + @args [ CARD ] + @args.CARD { + type string + } + type hw + card $CARD + device 6 + hint.show off +} diff --git a/src/conf/cards/aliases.conf b/src/conf/cards/aliases.conf index 18a920f4..0c44c1aa 100644 --- a/src/conf/cards/aliases.conf +++ b/src/conf/cards/aliases.conf @@ -57,6 +57,7 @@ CMI8786 cards.CMI8788 CMI8787 cards.CMI8788 pistachio cards.pistachio-card VC4-HDMI cards.vc4-hdmi +sof-skl_hda_car cards.SOF-Intel
confdir:pcm/default.conf confdir:pcm/dmix.conf diff --git a/src/conf/pcm/Makefile.am b/src/conf/pcm/Makefile.am index c548660d..20da0448 100644 --- a/src/conf/pcm/Makefile.am +++ b/src/conf/pcm/Makefile.am @@ -3,7 +3,7 @@ cfg_files = default.conf front.conf rear.conf center_lfe.conf side.conf\ surround50.conf surround51.conf \ surround71.conf iec958.conf hdmi.conf modem.conf \ dmix.conf dsnoop.conf \ - dpl.conf + dpl.conf dmic.conf
EXTRA_DIST = $(cfg_files)
diff --git a/src/conf/pcm/dmic.conf b/src/conf/pcm/dmic.conf new file mode 100644 index 00000000..1dce37c9 --- /dev/null +++ b/src/conf/pcm/dmic.conf @@ -0,0 +1,54 @@ +# +# input from digital mic +# + +pcm.!dmic { + @args [ CARD DEV ] + @args.CARD { + type string + default { + @func getenv + vars [ + ALSA_PCM_CARD + ALSA_CARD + ] + default { + @func refer + name defaults.pcm.dmic.card + } + } + } + @args.DEV { + type integer + default { + default { + @func refer + name defaults.pcm.dmic.device + } + } + } + type empty + slave.pcm { + @func refer + name { + @func concat + strings [ + "cards." + { + @func card_driver + card $CARD + } + ".pcm.dmic." $DEV ":" + "CARD=" $CARD + ] + } + } + hint { + show { + @func refer + name defaults.namehint.basic + } + description "Digital Mic connected to the PCH directly" + device $DEV + } +}
Dne 16. 12. 19 v 13:51 Hui Wang napsal(a):
On the machines with HDA codec, the sof driver will use the legacy hda codec driver, as a result, most mixer controls are same as before.
There are only 2 difference:
- HDMI pcm index is 3, 4 and 5 instead of 3, 7, 8...
- dmic is on device 6, 7 instead of 0
After applying this patch, we will get (aplay -L): hdmi:CARD=sofsklhdacard,DEV=0 sof-skl_hda_card, HDMI Audio Output hdmi:CARD=sofsklhdacard,DEV=1 sof-skl_hda_card, HDMI Audio Output hdmi:CARD=sofsklhdacard,DEV=2 sof-skl_hda_card, HDMI Audio Output
and (arecord -L): dmic:CARD=sofsklhdacard,DEV=0 sof-skl_hda_card, Digital Mic connected to the PCH directly dmic:CARD=sofsklhdacard,DEV=1 sof-skl_hda_card, Digital Mic connected to the PCH directly
Then we could add minor changes in the pulseaudio configuration, after that, all output and input devices will work under pulseaudio.
This is a supplement for ucm, the ucm for sof driver has higher priority than this conf, if there is no ucm for sof driver, this conf will take effect.
Exactly. The dmic definitions should not be a standard in my eyes. I would not like to accept this. I can accept the standard definitions for the playback devices for this driver, but UCM will replace everything. It's better to define the special PA config for now until we resolve all the UCM issues like:
http://people.redhat.com/~jkysela/sof/carbon-x1-pulse.tar.gz2
The 2nd PA UCM patchset which is working with the current UCM in ALSA's repos for this hardware:
https://gitlab.freedesktop.org/pulseaudio/pulseaudio/merge_requests/217
But it is just a start. There are plenty unresolved abstraction issues with this.
Jaroslav
On 2019/12/17 上午5:00, Jaroslav Kysela wrote:
Dne 16. 12. 19 v 13:51 Hui Wang napsal(a):
On the machines with HDA codec, the sof driver will use the legacy hda codec driver, as a result, most mixer controls are same as before.
There are only 2 difference: - HDMI pcm index is 3, 4 and 5 instead of 3, 7, 8... - dmic is on device 6, 7 instead of 0
After applying this patch, we will get (aplay -L): hdmi:CARD=sofsklhdacard,DEV=0 sof-skl_hda_card, HDMI Audio Output hdmi:CARD=sofsklhdacard,DEV=1 sof-skl_hda_card, HDMI Audio Output hdmi:CARD=sofsklhdacard,DEV=2 sof-skl_hda_card, HDMI Audio Output
and (arecord -L): dmic:CARD=sofsklhdacard,DEV=0 sof-skl_hda_card, Digital Mic connected to the PCH directly dmic:CARD=sofsklhdacard,DEV=1 sof-skl_hda_card, Digital Mic connected to the PCH directly
Then we could add minor changes in the pulseaudio configuration, after that, all output and input devices will work under pulseaudio.
This is a supplement for ucm, the ucm for sof driver has higher priority than this conf, if there is no ucm for sof driver, this conf will take effect.
Exactly. The dmic definitions should not be a standard in my eyes. I would not like to accept this. I can accept the standard definitions for the playback devices for this driver, but UCM will replace everything. It's better to define the special PA config for now until we resolve all the UCM issues like:
http://people.redhat.com/~jkysela/sof/carbon-x1-pulse.tar.gz2
The 2nd PA UCM patchset which is working with the current UCM in ALSA's repos for this hardware:
https://gitlab.freedesktop.org/pulseaudio/pulseaudio/merge_requests/217
But it is just a start. There are plenty unresolved abstraction issues with this.
Yes, ucm is more powerful and should be the default choice for users with sof driver+hda codec. But there are 2 issues:
1. too complicated, not easy to backport all patches to old version linux distribution, like ubuntu 18.04 LTS (with alsa-lib 1.1.3 and PA v11.1)
2. no generic ucm confs for most machines, need to write ucm confs machine by machine (existing PA can runtime decide/build a machine's conf, no need to write conf machine by machine)
After we have sth like below: (if the name dmic is not good, we could change it to be a more reasonable name)
dmic:CARD=sofsklhdacard,DEV=0 sof-skl_hda_card, Digital Mic connected to the PCH directly dmic:CARD=sofsklhdacard,DEV=1 sof-skl_hda_card, Digital Mic connected to the PCH directly
We just need to do a simple change in the PA's conf, the audio basically could work (include the audio-device-selection-popup-dialogue and mic-mute led on Lenovo machine). Of course it doesn't work perfectly so far, because dmic is not connected to the codec, so it is in a standalone source in the PA, we need to write some code to handle it.
This is the simple change in the PA's conf: https://pastebin.ubuntu.com/p/Tnmkr6D2Kv/
Thanks,
Hui.
Jaroslav
participants (2)
-
Hui Wang
-
Jaroslav Kysela