diff mbox series

[alsa-lib] conf: SOF-Intel: map pcm device for sof driver

Message ID 20191216125136.6709-1-hui.wang@canonical.com (mailing list archive)
State New, archived
Headers show
Series [alsa-lib] conf: SOF-Intel: map pcm device for sof driver | expand

Commit Message

Hui Wang Dec. 16, 2019, 12:51 p.m. UTC
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

Comments

Jaroslav Kysela Dec. 16, 2019, 9 p.m. UTC | #1
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
Hui Wang Dec. 20, 2019, 1:30 a.m. UTC | #2
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
>
diff mbox series

Patch

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
+	}
+}