Blob Blame History Raw
From 27c7927842a691ef13724cd16fb26264680c6aa2 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sat, 29 Feb 2020 10:30:37 +0100
Subject: [PATCH 01/14] conf: change the order of PCM devices in alsa.conf

Appearently, some applications use the first device for probe or so.

Fixes: https://github.com/alsa-project/alsa-lib/issues/27

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/conf/alsa.conf | 46 +++++++++++++++++++++++-----------------------
 1 file changed, 23 insertions(+), 23 deletions(-)

diff --git a/src/conf/alsa.conf b/src/conf/alsa.conf
index 09980586..a091b810 100644
--- a/src/conf/alsa.conf
+++ b/src/conf/alsa.conf
@@ -119,29 +119,6 @@ defaults.timer.subdevice 0
 #  PCM interface
 #
 
-# redirect to load-on-demand extended pcm definitions
-pcm.cards cards.pcm
-
-pcm.default cards.pcm.default
-pcm.sysdefault cards.pcm.default
-pcm.front cards.pcm.front
-pcm.rear cards.pcm.rear
-pcm.center_lfe cards.pcm.center_lfe
-pcm.side cards.pcm.side
-pcm.surround21 cards.pcm.surround21
-pcm.surround40 cards.pcm.surround40
-pcm.surround41 cards.pcm.surround41
-pcm.surround50 cards.pcm.surround50
-pcm.surround51 cards.pcm.surround51
-pcm.surround71 cards.pcm.surround71
-pcm.iec958 cards.pcm.iec958
-pcm.spdif iec958
-pcm.hdmi cards.pcm.hdmi
-pcm.dmix cards.pcm.dmix
-pcm.dsnoop cards.pcm.dsnoop
-pcm.modem cards.pcm.modem
-pcm.phoneline cards.pcm.phoneline
-
 pcm.hw {
 	@args [ CARD DEV SUBDEV ]
 	@args.CARD {
@@ -323,6 +300,29 @@ pcm.null {
 	}
 }
 
+# redirect to load-on-demand extended pcm definitions
+pcm.cards cards.pcm
+
+pcm.default cards.pcm.default
+pcm.sysdefault cards.pcm.default
+pcm.front cards.pcm.front
+pcm.rear cards.pcm.rear
+pcm.center_lfe cards.pcm.center_lfe
+pcm.side cards.pcm.side
+pcm.surround21 cards.pcm.surround21
+pcm.surround40 cards.pcm.surround40
+pcm.surround41 cards.pcm.surround41
+pcm.surround50 cards.pcm.surround50
+pcm.surround51 cards.pcm.surround51
+pcm.surround71 cards.pcm.surround71
+pcm.iec958 cards.pcm.iec958
+pcm.spdif iec958
+pcm.hdmi cards.pcm.hdmi
+pcm.dmix cards.pcm.dmix
+pcm.dsnoop cards.pcm.dsnoop
+pcm.modem cards.pcm.modem
+pcm.phoneline cards.pcm.phoneline
+
 #
 #  Control interface
 #
-- 
2.25.1


From 09e78da4cade7b8fecb8f36717b85c456f2e5487 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 1 Mar 2020 19:57:06 +0100
Subject: [PATCH 02/14] conf: namehint - add omit_noargs to the hint section

Do not list simple surround devices in the namehint function by default.

Fixes: https://github.com/alsa-project/alsa-lib/issues/27

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/conf/pcm/surround21.conf | 1 +
 src/conf/pcm/surround40.conf | 1 +
 src/conf/pcm/surround41.conf | 1 +
 src/conf/pcm/surround50.conf | 1 +
 src/conf/pcm/surround51.conf | 1 +
 src/conf/pcm/surround71.conf | 1 +
 src/control/namehint.c       | 6 +++++-
 7 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/conf/pcm/surround21.conf b/src/conf/pcm/surround21.conf
index 1cf1b7af..ad19507b 100644
--- a/src/conf/pcm/surround21.conf
+++ b/src/conf/pcm/surround21.conf
@@ -57,5 +57,6 @@ pcm.!surround21 {
 	hint {
 		description "2.1 Surround output to Front and Subwoofer speakers"
 		device_output $DEV
+		omit_noargs true
 	}
 }
diff --git a/src/conf/pcm/surround40.conf b/src/conf/pcm/surround40.conf
index 9788ad48..7c615022 100644
--- a/src/conf/pcm/surround40.conf
+++ b/src/conf/pcm/surround40.conf
@@ -55,5 +55,6 @@ pcm.!surround40 {
 	hint {
 		description "4.0 Surround output to Front and Rear speakers"
 		device_output $DEV
+		omit_noargs true
 	}
 }
diff --git a/src/conf/pcm/surround41.conf b/src/conf/pcm/surround41.conf
index 7b4ef3be..cb6c0445 100644
--- a/src/conf/pcm/surround41.conf
+++ b/src/conf/pcm/surround41.conf
@@ -61,5 +61,6 @@ pcm.!surround41 {
 	hint {
 		description "4.1 Surround output to Front, Rear and Subwoofer speakers"
 		device_output $DEV
+		omit_noargs true
 	}
 }
diff --git a/src/conf/pcm/surround50.conf b/src/conf/pcm/surround50.conf
index 7d9a9e79..70d54069 100644
--- a/src/conf/pcm/surround50.conf
+++ b/src/conf/pcm/surround50.conf
@@ -61,5 +61,6 @@ pcm.!surround50 {
 	hint {
 		description "5.0 Surround output to Front, Center and Rear speakers"
 		device_output $DEV
+		omit_noargs true
 	}
 }
diff --git a/src/conf/pcm/surround51.conf b/src/conf/pcm/surround51.conf
index e67f007e..d0236e42 100644
--- a/src/conf/pcm/surround51.conf
+++ b/src/conf/pcm/surround51.conf
@@ -57,5 +57,6 @@ pcm.!surround51 {
 	hint {
 		description "5.1 Surround output to Front, Center, Rear and Subwoofer speakers"
 		device_output $DEV
+		omit_noargs true
 	}
 }
diff --git a/src/conf/pcm/surround71.conf b/src/conf/pcm/surround71.conf
index a26c3f36..66792dde 100644
--- a/src/conf/pcm/surround71.conf
+++ b/src/conf/pcm/surround71.conf
@@ -59,5 +59,6 @@ pcm.!surround71 {
 	hint {
 		description "7.1 Surround output to Front, Center, Side, Rear and Woofer speakers"
 		device_output $DEV
+		omit_noargs true
 	}
 }
diff --git a/src/control/namehint.c b/src/control/namehint.c
index 60c48ae3..169bd421 100644
--- a/src/control/namehint.c
+++ b/src/control/namehint.c
@@ -287,10 +287,14 @@ static int try_config(snd_config_t *config,
 			err = -EINVAL;
 			goto __cleanup;
 		}
+		if (list->card < 0 &&
+		    snd_config_search(cfg, "omit_noargs", &n) >= 0 &&
+		    snd_config_get_bool(n) > 0)
+			goto __skip_add;
 		if (level == 1 &&
 		    snd_config_search(cfg, "show", &n) >= 0 &&
 		    snd_config_get_bool(n) <= 0)
-		    	goto __skip_add;
+			goto __skip_add;
 		if (buf1 == NULL &&
 		    snd_config_search(cfg, "description", &n) >= 0 &&
 		    snd_config_get_string(n, &str) >= 0) {
-- 
2.25.1


From c7efaef195b92e30efb3049a1c03fa1b50310477 Mon Sep 17 00:00:00 2001
From: be-marc <marcbecker@posteo.de>
Date: Tue, 3 Mar 2020 11:01:09 +0100
Subject: [PATCH 03/14] Change PCM device number of Asus Xonar U5

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/conf/cards/USB-Audio.conf | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/conf/cards/USB-Audio.conf b/src/conf/cards/USB-Audio.conf
index 1c677937..dd99c44d 100644
--- a/src/conf/cards/USB-Audio.conf
+++ b/src/conf/cards/USB-Audio.conf
@@ -39,7 +39,8 @@ USB-Audio.pcm.iec958_device {
 	# "NoiseBlaster 3000" 42
 	"USB Sound Blaster HD" 1
 	"Xonar U7" 1
-
+	"ASUS XONAR U5" 1
+	
 	# The below don't have digital in/out, so prevent them from being opened.
 	"Andrea PureAudio USB-SA Headset" 999
 	"Blue Snowball" 999
-- 
2.25.1


From 1654f38a29e635ce69a30c6c95ec1ca773ecee37 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 4 Mar 2020 11:27:12 +0100
Subject: [PATCH 04/14] configure: add --embed for python3-config (python 3.8)

Fixes: https://github.com/alsa-project/alsa-lib/issues/33

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 configure.ac | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index 0f9fb016..4b5ab662 100644
--- a/configure.ac
+++ b/configure.ac
@@ -423,7 +423,10 @@ if test "$build_python" = "yes" -a "$build_mixer_pymodules" = "yes"; then
   pythonlibs0=
   pythoninc0=
   if test "$build_python2" != "yes"; then
-    pythonlibs0=$(python3-config --libs)
+    pythonlibs0=$(python3-config --libs --embed 2> /dev/null)
+    if test -z "$pythonlibs0"; then
+      pythonlibs0=$(python3-config --libs)
+    fi
     pythoninc0=$(python3-config --includes)
   fi
   if test -z "$pythonlibs0"; then
-- 
2.25.1


From 9ed3c65e1569a0ebbec9af1d04d739db9921e775 Mon Sep 17 00:00:00 2001
From: Tanu Kaskinen <tanuk@iki.fi>
Date: Fri, 13 Mar 2020 09:39:17 +0200
Subject: [PATCH 05/14] conf: USB-Audio: Add C-Media USB Headphone Set to the
 IEC958 blacklist

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/317

Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/conf/cards/USB-Audio.conf | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/conf/cards/USB-Audio.conf b/src/conf/cards/USB-Audio.conf
index dd99c44d..89811086 100644
--- a/src/conf/cards/USB-Audio.conf
+++ b/src/conf/cards/USB-Audio.conf
@@ -44,6 +44,7 @@ USB-Audio.pcm.iec958_device {
 	# The below don't have digital in/out, so prevent them from being opened.
 	"Andrea PureAudio USB-SA Headset" 999
 	"Blue Snowball" 999
+	"C-Media USB Headphone Set" 999
 	"HP Digital Stereo Headset" 999
 	"GN 9330" 999
 	"Logitech Speaker Lapdesk N700" 999
-- 
2.25.1


From caf77a93cef5bda729bc33e0100cc0e769767389 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 13 Mar 2020 17:05:14 +0100
Subject: [PATCH 06/14] topology: add back asrc to widget_map in dapm.c

Fixes: aa1bac2d04bd ("topology: add snd_tplg_save()")
BugLink: https://github.com/thesofproject/sof/issues/2543

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/topology/dapm.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index cb85e667..70645126 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -43,6 +43,7 @@ static const struct map_elem widget_map[] = {
 	{"effect", SND_SOC_TPLG_DAPM_EFFECT},
 	{"siggen", SND_SOC_TPLG_DAPM_SIGGEN},
 	{"src", SND_SOC_TPLG_DAPM_SRC},
+	{"asrc", SND_SOC_TPLG_DAPM_ASRC},
 	{"encoder", SND_SOC_TPLG_DAPM_ENCODER},
 	{"decoder", SND_SOC_TPLG_DAPM_DECODER},
 };
-- 
2.25.1


From 79102bf264f8651692fe9435a4d1bb06aa022d55 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 17 Mar 2020 10:21:10 +0100
Subject: [PATCH 07/14] ucm: clarify the index syntax for the device names

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 include/use-case.h | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/include/use-case.h b/include/use-case.h
index 134303af..27cb3fe1 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -117,7 +117,10 @@ extern "C" {
  *
  * If multiple devices with the same name exists, the number suffixes should
  * be added to these names like HDMI1,HDMI2,HDMI3 etc. No number gaps are
- * allowed. The names with numbers must be continuous.
+ * allowed. The names with numbers must be continuous. It is allowed to put
+ * a whitespace between name and index (like 'Line 1') for the better
+ * readability. The device names 'Line 1' and 'Line1' are equal for
+ * thus purpose.
  *
  * If EnableSequence/DisableSequence controls independent paths in the hardware
  * it is also recommended to split playback and capture UCM devices and use
-- 
2.25.1


From 6137d263f3805c72781ea74b813b0e3754f5fc34 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 17 Mar 2020 16:20:52 +0100
Subject: [PATCH 08/14] ucm: fix uc_mgr_scan_master_configs()

Skip the lookup, if the top level filename does not exist.

Fixes: https://github.com/alsa-project/alsa-ucm-conf/issues/16

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/ucm/parser.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 8d6eea31..0001e595 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1969,6 +1969,9 @@ int uc_mgr_scan_master_configs(const char **_list[])
 
 		configuration_filename2(filename, sizeof(filename), 2,
 					d_name, d_name, ".conf");
+		if (eaccess(filename, R_OK))
+			continue;
+
 		err = uc_mgr_config_load(2, filename, &cfg);
 		if (err < 0)
 			goto __err;
-- 
2.25.1


From d434638a683c01bd6decf8f41863044055237a50 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 27 Mar 2020 11:59:53 +0100
Subject: [PATCH 09/14] namehint: remember the direction from the upper levels

The current code resets the direction info for each level.
Simply remove this code.

Fixes: https://github.com/alsa-project/alsa-lib/issues/39

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/control/namehint.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/control/namehint.c b/src/control/namehint.c
index 169bd421..ecd470f3 100644
--- a/src/control/namehint.c
+++ b/src/control/namehint.c
@@ -270,8 +270,6 @@ static int try_config(snd_config_t *config,
 	if (snd_config_search(cfg1, "type", &cfg) >= 0 &&
 	    snd_config_get_string(cfg, &str) >= 0 &&
 	    strcmp(str, "hw") == 0) {
-		list->device_input = -1;
-		list->device_output = -1;
 		if (snd_config_search(cfg1, "device", &cfg) >= 0) {
 			if (snd_config_get_integer(cfg, &dev) < 0) {
 				SNDERR("(%s) device must be an integer", buf);
-- 
2.25.1


From bca39e99d0c2a270a71dad640983fb739dac8bdd Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 27 Mar 2020 18:14:02 +0100
Subject: [PATCH 10/14] conf: fix namehint for pcm.front and pcm.iec958

As suggested in:

Fixes: https://github.com/alsa-project/alsa-lib/issues/39

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/conf/pcm/front.conf  | 3 ++-
 src/conf/pcm/iec958.conf | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/conf/pcm/front.conf b/src/conf/pcm/front.conf
index 7aff0cbf..0edf6a69 100644
--- a/src/conf/pcm/front.conf
+++ b/src/conf/pcm/front.conf
@@ -53,6 +53,7 @@ pcm.!front {
 			name defaults.namehint.basic
 		}
 		description "Front speakers"
-		device $DEV
+		device_output $DEV
+		omit_noargs true
 	}
 }
diff --git a/src/conf/pcm/iec958.conf b/src/conf/pcm/iec958.conf
index ac139b5e..2b084d6f 100644
--- a/src/conf/pcm/iec958.conf
+++ b/src/conf/pcm/iec958.conf
@@ -78,6 +78,6 @@ pcm.!iec958 {
 			name defaults.namehint.basic
 		}
 		description "IEC958 (S/PDIF) Digital Audio Output"
-		device $DEV
+		device_output $DEV
 	}
 }
-- 
2.25.1


From 3b46b03f099da2f39c205a25b3cc62ec688fe6b3 Mon Sep 17 00:00:00 2001
From: Jonas Holmberg <jonashg@axis.com>
Date: Tue, 31 Mar 2020 17:09:25 +0200
Subject: [PATCH 11/14] pcm: add chmap option to route plugin

Add a config definition "chmap" to override the channel maps in the same
way as in the hw and null plugins.

Signed-off-by: Jonas Holmberg <jonashg@axis.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 src/pcm/pcm_route.c | 57 +++++++++++++++++++++++++++++++++++++--------
 1 file changed, 47 insertions(+), 10 deletions(-)

diff --git a/src/pcm/pcm_route.c b/src/pcm/pcm_route.c
index bbcc6118..d3e5f3ff 100644
--- a/src/pcm/pcm_route.c
+++ b/src/pcm/pcm_route.c
@@ -104,6 +104,7 @@ typedef struct {
 	int schannels;
 	snd_pcm_route_params_t params;
 	snd_pcm_chmap_t *chmap;
+	snd_pcm_chmap_query_t **chmap_override;
 } snd_pcm_route_t;
 
 #endif /* DOC_HIDDEN */
@@ -441,6 +442,7 @@ static int snd_pcm_route_close(snd_pcm_t *pcm)
 		free(params->dsts);
 	}
 	free(route->chmap);
+	snd_pcm_free_chmaps(route->chmap_override);
 	return snd_pcm_generic_close(pcm);
 }
 
@@ -634,6 +636,9 @@ static snd_pcm_chmap_t *snd_pcm_route_get_chmap(snd_pcm_t *pcm)
 	snd_pcm_chmap_t *map, *slave_map;
 	unsigned int src, dst, nsrcs;
 
+	if (route->chmap_override)
+		return _snd_pcm_choose_fixed_chmap(pcm, route->chmap_override);
+
 	slave_map = snd_pcm_generic_get_chmap(pcm);
 	if (!slave_map)
 		return NULL;
@@ -660,8 +665,14 @@ static snd_pcm_chmap_t *snd_pcm_route_get_chmap(snd_pcm_t *pcm)
 
 static snd_pcm_chmap_query_t **snd_pcm_route_query_chmaps(snd_pcm_t *pcm)
 {
+	snd_pcm_route_t *route = pcm->private_data;
 	snd_pcm_chmap_query_t **maps;
-	snd_pcm_chmap_t *map = snd_pcm_route_get_chmap(pcm);
+	snd_pcm_chmap_t *map;
+
+	if (route->chmap_override)
+		return _snd_pcm_copy_chmap_query(route->chmap_override);
+
+	map = snd_pcm_route_get_chmap(pcm);
 	if (!map)
 		return NULL;
 	maps = _snd_pcm_make_single_query_chmaps(map);
@@ -818,10 +829,10 @@ err:
 	return -EINVAL;
 }
 
-static int find_matching_chmap(snd_pcm_t *spcm, snd_pcm_chmap_t *tt_chmap,
+static int find_matching_chmap(snd_pcm_chmap_query_t **chmaps,
+			       snd_pcm_chmap_t *tt_chmap,
 			       snd_pcm_chmap_t **found_chmap, int *schannels)
 {
-	snd_pcm_chmap_query_t** chmaps = snd_pcm_query_chmaps(spcm);
 	int i;
 
 	*found_chmap = NULL;
@@ -854,7 +865,6 @@ static int find_matching_chmap(snd_pcm_t *spcm, snd_pcm_chmap_t *tt_chmap,
 			int size = sizeof(snd_pcm_chmap_t) + c->channels * sizeof(unsigned int);
 			*found_chmap = malloc(size);
 			if (!*found_chmap) {
-				snd_pcm_free_chmaps(chmaps);
 				return -ENOMEM;
 			}
 			memcpy(*found_chmap, c, size);
@@ -863,8 +873,6 @@ static int find_matching_chmap(snd_pcm_t *spcm, snd_pcm_chmap_t *tt_chmap,
 		}
 	}
 
-	snd_pcm_free_chmaps(chmaps);
-
 	if (*found_chmap == NULL) {
 		SNDERR("Found no matching channel map");
 		return -EINVAL;
@@ -1252,6 +1260,7 @@ pcm.name {
                         SCHANNEL REAL   # route value (0.0 - 1.0)
                 }
         }
+        [chmap MAP]             # Override channel maps; MAP is a string array
 }
 \endcode
 
@@ -1292,6 +1301,7 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name,
 	snd_pcm_route_ttable_entry_t *ttable = NULL;
 	unsigned int csize, ssize;
 	unsigned int cused, sused;
+	snd_pcm_chmap_query_t **chmaps = NULL;
 	snd_config_for_each(i, next, conf) {
 		snd_config_t *n = snd_config_iterator_entry(i);
 		const char *id;
@@ -1306,31 +1316,45 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name,
 		if (strcmp(id, "ttable") == 0) {
 			if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) {
 				SNDERR("Invalid type for %s", id);
+				snd_pcm_free_chmaps(chmaps);
 				return -EINVAL;
 			}
 			tt = n;
 			continue;
 		}
+		if (strcmp(id, "chmap") == 0) {
+			chmaps = _snd_pcm_parse_config_chmaps(n);
+			if (!chmaps) {
+				SNDERR("Invalid channel map for %s", id);
+				return -EINVAL;
+			}
+			continue;
+		}
 		SNDERR("Unknown field %s", id);
 		return -EINVAL;
 	}
 	if (!slave) {
 		SNDERR("slave is not defined");
+		snd_pcm_free_chmaps(chmaps);
 		return -EINVAL;
 	}
 	if (!tt) {
 		SNDERR("ttable is not defined");
+		snd_pcm_free_chmaps(chmaps);
 		return -EINVAL;
 	}
 	err = snd_pcm_slave_conf(root, slave, &sconf, 2,
 				 SND_PCM_HW_PARAM_FORMAT, 0, &sformat,
 				 SND_PCM_HW_PARAM_CHANNELS, 0, &schannels);
-	if (err < 0)
+	if (err < 0) {
+		snd_pcm_free_chmaps(chmaps);
 		return err;
+	}
 	if (sformat != SND_PCM_FORMAT_UNKNOWN &&
 	    snd_pcm_format_linear(sformat) != 1) {
 	    	snd_config_delete(sconf);
 		SNDERR("slave format is not linear");
+		snd_pcm_free_chmaps(chmaps);
 		return -EINVAL;
 	}
 
@@ -1345,13 +1369,19 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name,
 	if (err < 0) {
 		free(tt_chmap);
 		free(ttable);
+		snd_pcm_free_chmaps(chmaps);
 		return err;
 	}
 
 	if (tt_chmap) {
-		err = find_matching_chmap(spcm, tt_chmap, &chmap, &schannels);
+		if (!chmaps)
+			chmaps = snd_pcm_query_chmaps(spcm);
+		if (chmaps)
+			err = find_matching_chmap(chmaps, tt_chmap, &chmap,
+						  &schannels);
 		free(tt_chmap);
-		if (err < 0) {
+		if (chmaps && err < 0) {
+			snd_pcm_free_chmaps(chmaps);
 			snd_pcm_close(spcm);
 			return err;
 		}
@@ -1360,12 +1390,14 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name,
 	err = _snd_pcm_route_determine_ttable(tt, &csize, &ssize, chmap);
 	if (err < 0) {
 		free(chmap);
+		snd_pcm_free_chmaps(chmaps);
 		snd_pcm_close(spcm);
 		return err;
 	}
 	ttable = malloc(csize * ssize * sizeof(snd_pcm_route_ttable_entry_t));
 	if (ttable == NULL) {
 		free(chmap);
+		snd_pcm_free_chmaps(chmaps);
 		snd_pcm_close(spcm);
 		return -ENOMEM;
 	}
@@ -1374,6 +1406,7 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name,
 	if (err < 0) {
 		free(chmap);
 		free(ttable);
+		snd_pcm_free_chmaps(chmaps);
 		snd_pcm_close(spcm);
 		return err;
 	}
@@ -1385,9 +1418,13 @@ int _snd_pcm_route_open(snd_pcm_t **pcmp, const char *name,
 	free(ttable);
 	if (err < 0) {
 		free(chmap);
+		snd_pcm_free_chmaps(chmaps);
 		snd_pcm_close(spcm);
 	} else {
-		((snd_pcm_route_t*) (*pcmp)->private_data)->chmap = chmap;
+		snd_pcm_route_t *route = (*pcmp)->private_data;
+
+		route->chmap = chmap;
+		route->chmap_override = chmaps;
 	}
 
 	return err;
-- 
2.25.1


From 341326c21ededb8c768c43ec2c9c7a80e7a26d35 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 3 Apr 2020 18:00:43 +0200
Subject: [PATCH 12/14] usecase: allow indexes also for modifier names

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 include/use-case.h | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/include/use-case.h b/include/use-case.h
index 27cb3fe1..c2ba79a9 100644
--- a/include/use-case.h
+++ b/include/use-case.h
@@ -120,7 +120,7 @@ extern "C" {
  * allowed. The names with numbers must be continuous. It is allowed to put
  * a whitespace between name and index (like 'Line 1') for the better
  * readability. The device names 'Line 1' and 'Line1' are equal for
- * thus purpose.
+ * this purpose.
  *
  * If EnableSequence/DisableSequence controls independent paths in the hardware
  * it is also recommended to split playback and capture UCM devices and use
@@ -149,6 +149,13 @@ extern "C" {
  * The use case modifier allows runtime configuration changes to deal with
  * asynchronous events.
  *
+ * If multiple modifiers with the same name exists, the number suffixes should
+ * be added to these names like 'Echo Reference 1','Echo Reference 2' etc.
+ * No number gaps are allowed. The names with numbers must be continuous.
+ * It is allowed to put a whitespace between name and index for the better
+ * readability. The modifier names 'Something 1' and 'Something1' are equal
+ * for this purpose.
+ *
  * e.g. to record a voice call :-
  *  1. Set verb to SND_USE_CASE_VERB_VOICECALL (for voice call)
  *  2. Set modifier SND_USE_CASE_MOD_CAPTURE_VOICE when capture required.
-- 
2.25.1


From c9605484d165d2b707f78eef14a224b0b47ba322 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 6 Apr 2020 13:25:43 +0200
Subject: [PATCH 13/14] ucm: fix the device remove operation

- allow to remove device only from conflicting lists
- unify the error codes when the device is not found (ENODEV)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/ucm/utils.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/ucm/utils.c b/src/ucm/utils.c
index 50b2a1df..d78ba91c 100644
--- a/src/ucm/utils.c
+++ b/src/ucm/utils.c
@@ -371,7 +371,7 @@ int uc_mgr_rename_in_dev_list(struct dev_list *dev_list, const char *src,
 			return 0;
 		}
 	}
-	return -ENOENT;
+	return -ENODEV;
 }
 
 int uc_mgr_remove_from_dev_list(struct dev_list *dev_list, const char *name)
@@ -528,17 +528,22 @@ int uc_mgr_remove_device(struct use_case_verb *verb, const char *name)
 {
 	struct use_case_device *device;
 	struct list_head *pos, *npos;
+	int err, found = 0;
 
 	list_for_each_safe(pos, npos, &verb->device_list) {
 		device = list_entry(pos, struct use_case_device, list);
 		if (strcmp(device->name, name) == 0) {
 			uc_mgr_free_device(device);
+			found++;
 			continue;
 		}
-		uc_mgr_remove_from_dev_list(&device->dev_list, name);
-		return 0;
+		err = uc_mgr_remove_from_dev_list(&device->dev_list, name);
+		if (err < 0 && err != -ENODEV)
+			return err;
+		if (err == 0)
+			found++;
 	}
-	return -ENOENT;
+	return found == 0 ? -ENODEV : 0;
 }
 
 void uc_mgr_free_verb(snd_use_case_mgr_t *uc_mgr)
-- 
2.25.1


From fb48ad9e4f6b84fd4ade689bd79e3a3c37d3e034 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 6 Apr 2020 17:20:24 +0200
Subject: [PATCH 14/14] ucm: fix copy-n-paste typo (RemoveDevice list)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 src/ucm/parser.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 0001e595..aca5ea8c 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1176,7 +1176,7 @@ static int verb_device_management(struct use_case_verb *verb)
 	}
 
 	/* remove devices */
-	list_for_each(pos, &verb->rename_list) {
+	list_for_each(pos, &verb->remove_list) {
 		dev = list_entry(pos, struct ucm_dev_name, list);
 		err = uc_mgr_remove_device(verb, dev->name2);
 		if (err < 0) {
-- 
2.25.1