de94b2
From c79f09e1f5e8b559b58dacdb00708d995b2e3aa5 Mon Sep 17 00:00:00 2001
de94b2
From: paulhsia <paulhsia@chromium.org>
de94b2
Date: Sat, 30 Nov 2019 03:35:30 +0800
de94b2
Subject: [PATCH 01/16] ucm: Use strncmp to avoid access-out-of-boundary
de94b2
de94b2
If the length of the identifier is less than the length of the prefix,
de94b2
access-out-of-boundary will occur in memcmp().
de94b2
de94b2
Signed-off-by: paulhsia <paulhsia@chromium.org>
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 src/ucm/main.c | 8 +++++---
de94b2
 1 file changed, 5 insertions(+), 3 deletions(-)
de94b2
de94b2
diff --git a/src/ucm/main.c b/src/ucm/main.c
de94b2
index b0b6ffb3..252e50d9 100644
de94b2
--- a/src/ucm/main.c
de94b2
+++ b/src/ucm/main.c
de94b2
@@ -61,11 +61,13 @@ static int check_identifier(const char *identifier, const char *prefix)
de94b2
 {
de94b2
 	int len;
de94b2
 
de94b2
-	if (strcmp(identifier, prefix) == 0)
de94b2
-		return 1;
de94b2
 	len = strlen(prefix);
de94b2
-	if (memcmp(identifier, prefix, len) == 0 && identifier[len] == '/')
de94b2
+	if (strncmp(identifier, prefix, len) != 0)
de94b2
+		return 0;
de94b2
+
de94b2
+	if (identifier[len] == 0 || identifier[len] == '/')
de94b2
 		return 1;
de94b2
+
de94b2
 	return 0;
de94b2
 }
de94b2
 
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 9baf64da2f26844434ecea4825052937a3abe06c Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Fri, 29 Nov 2019 22:28:26 +0100
de94b2
Subject: [PATCH 02/16] ucm: return always at least NULL if no list is
de94b2
 available in snd_use_case_get_list()
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 src/ucm/main.c | 8 ++++++--
de94b2
 1 file changed, 6 insertions(+), 2 deletions(-)
de94b2
de94b2
diff --git a/src/ucm/main.c b/src/ucm/main.c
de94b2
index 252e50d9..b80db65f 100644
de94b2
--- a/src/ucm/main.c
de94b2
+++ b/src/ucm/main.c
de94b2
@@ -1160,8 +1160,10 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
de94b2
 
de94b2
 	modifier = find_modifier(uc_mgr, verb, name, 0);
de94b2
 	if (modifier) {
de94b2
-		if (modifier->dev_list.type != type)
de94b2
+		if (modifier->dev_list.type != type) {
de94b2
+			*list = NULL;
de94b2
 			return 0;
de94b2
+		}
de94b2
 		return get_list(&modifier->dev_list.list, list,
de94b2
 				struct dev_list_node, list,
de94b2
 				name);
de94b2
@@ -1169,8 +1171,10 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
de94b2
 
de94b2
 	device = find_device(uc_mgr, verb, name, 0);
de94b2
 	if (device) {
de94b2
-		if (device->dev_list.type != type)
de94b2
+		if (device->dev_list.type != type) {
de94b2
+			*list = NULL;
de94b2
 			return 0;
de94b2
+		}
de94b2
 		return get_list(&device->dev_list.list, list,
de94b2
 				struct dev_list_node, list,
de94b2
 				name);
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From ebdd2b6cdb8119cf75f0dd0a3b283d271b3a547e Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Sat, 30 Nov 2019 20:31:55 +0100
de94b2
Subject: [PATCH 03/16] ucm: add _identifiers list
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h |   1 +
de94b2
 src/ucm/main.c     | 268 ++++++++++++++++++++++++++++++++++-----------
de94b2
 2 files changed, 208 insertions(+), 61 deletions(-)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index 8e7e838c..85c58ac0 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -206,6 +206,7 @@ int snd_use_case_free_list(const char *list[], int items);
de94b2
  *   - _enadevs			- get list of enabled devices
de94b2
  *   - _enamods			- get list of enabled modifiers
de94b2
  *
de94b2
+ *   - _identifiers/{modifier}|{device}[/{verb}]     - list of value identifiers
de94b2
  *   - _supporteddevs/{modifier}|{device}[/{verb}]   - list of supported devices
de94b2
  *   - _conflictingdevs/{modifier}|{device}[/{verb}] - list of conflicting devices
de94b2
  *
de94b2
diff --git a/src/ucm/main.c b/src/ucm/main.c
de94b2
index b80db65f..d2078a23 100644
de94b2
--- a/src/ucm/main.c
de94b2
+++ b/src/ucm/main.c
de94b2
@@ -1072,7 +1072,6 @@ int snd_use_case_mgr_reset(snd_use_case_mgr_t *uc_mgr)
de94b2
 /**
de94b2
  * \brief Get list of verbs in pair verbname+comment
de94b2
  * \param list Returned list
de94b2
- * \param verbname For verb (NULL = current)
de94b2
  * \return Number of list entries if success, otherwise a negative error code
de94b2
  */
de94b2
 static int get_verb_list(snd_use_case_mgr_t *uc_mgr, const char **list[])
de94b2
@@ -1181,7 +1180,6 @@ static int get_supcon_device_list(snd_use_case_mgr_t *uc_mgr,
de94b2
 	}
de94b2
 
de94b2
 	return -ENOENT;
de94b2
-
de94b2
 }
de94b2
 
de94b2
 /**
de94b2
@@ -1210,41 +1208,201 @@ static int get_conflicting_device_list(snd_use_case_mgr_t *uc_mgr,
de94b2
 
de94b2
 #ifndef DOC_HIDDEN
de94b2
 struct myvalue {
de94b2
-        struct list_head list;
de94b2
-        char *value;
de94b2
+	struct list_head list;
de94b2
+	const char *text;
de94b2
 };
de94b2
 #endif
de94b2
 
de94b2
+/**
de94b2
+ * \brief Convert myvalue list string list
de94b2
+ * \param list myvalue list
de94b2
+ * \param res string list
de94b2
+ * \retval Number of list entries if success, otherwise a negativer error code
de94b2
+ */
de94b2
+static int myvalue_to_str_list(struct list_head *list, char ***res)
de94b2
+{
de94b2
+	struct list_head *pos;
de94b2
+	struct myvalue *value;
de94b2
+	char **p;
de94b2
+	int cnt;
de94b2
+
de94b2
+	cnt = alloc_str_list(list, 1, res);
de94b2
+	if (cnt < 0)
de94b2
+		return cnt;
de94b2
+	p = *res;
de94b2
+	list_for_each(pos, list) {
de94b2
+		value = list_entry(pos, struct myvalue, list);
de94b2
+		*p = strdup(value->text);
de94b2
+		if (*p == NULL) {
de94b2
+			snd_use_case_free_list((const char **)p, cnt);
de94b2
+			return -ENOMEM;
de94b2
+		}
de94b2
+		p++;
de94b2
+	}
de94b2
+	return cnt;
de94b2
+}
de94b2
+
de94b2
+/**
de94b2
+ * \brief Free myvalue list
de94b2
+ * \param list myvalue list
de94b2
+ */
de94b2
+static void myvalue_list_free(struct list_head *list)
de94b2
+{
de94b2
+	struct list_head *pos, *npos;
de94b2
+	struct myvalue *value;
de94b2
+
de94b2
+	list_for_each_safe(pos, npos, list) {
de94b2
+		value = list_entry(pos, struct myvalue, list);
de94b2
+		list_del(&value->list);
de94b2
+		free(value);
de94b2
+	}
de94b2
+}
de94b2
+
de94b2
+/**
de94b2
+ * \brief Merge one value to the myvalue list
de94b2
+ * \param list The list with values
de94b2
+ * \param value The value to be merged (without duplicates)
de94b2
+ * \return 1 if dup, 0 if success, otherwise a negative error code
de94b2
+ */
de94b2
+static int merge_value(struct list_head *list, const char *text)
de94b2
+{
de94b2
+	struct list_head *pos;
de94b2
+	struct myvalue *value;
de94b2
+
de94b2
+	list_for_each(pos, list) {
de94b2
+		value = list_entry(pos, struct myvalue, list);
de94b2
+		if (strcmp(value->text, text) == 0)
de94b2
+			return 1;
de94b2
+	}
de94b2
+	value = malloc(sizeof(*value));
de94b2
+	if (value == NULL)
de94b2
+		return -ENOMEM;
de94b2
+	value->text = text;
de94b2
+	list_add_tail(&value->list, list);
de94b2
+	return 0;
de94b2
+}
de94b2
+
de94b2
+/**
de94b2
+ * \brief Find all values for given identifier
de94b2
+ * \param list Returned list
de94b2
+ * \param source Source list with ucm_value structures
de94b2
+ * \return Zero if success, otherwise a negative error code
de94b2
+ */
de94b2
+static int add_identifiers(struct list_head *list,
de94b2
+			   struct list_head *source)
de94b2
+{
de94b2
+	struct ucm_value *v;
de94b2
+	struct list_head *pos;
de94b2
+	int err;
de94b2
+
de94b2
+	list_for_each(pos, source) {
de94b2
+		v = list_entry(pos, struct ucm_value, list);
de94b2
+		err = merge_value(list, v->name);
de94b2
+		if (err < 0)
de94b2
+			return err;
de94b2
+	}
de94b2
+	return 0;
de94b2
+}
de94b2
+
de94b2
+/**
de94b2
+ * \brief Find all values for given identifier
de94b2
+ * \param list Returned list
de94b2
+ * \param identifier Identifier
de94b2
+ * \param source Source list with ucm_value structures
de94b2
+ */
de94b2
 static int add_values(struct list_head *list,
de94b2
                       const char *identifier,
de94b2
                       struct list_head *source)
de94b2
 {
de94b2
-        struct ucm_value *v;
de94b2
-        struct myvalue *val;
de94b2
-        struct list_head *pos, *pos1;
de94b2
-        int match;
de94b2
+	struct ucm_value *v;
de94b2
+	struct list_head *pos;
de94b2
+	int err;
de94b2
         
de94b2
-        list_for_each(pos, source) {
de94b2
-                v = list_entry(pos, struct ucm_value, list);
de94b2
-                if (check_identifier(identifier, v->name)) {
de94b2
-                        match = 0;
de94b2
-                        list_for_each(pos1, list) {
de94b2
-                                val = list_entry(pos1, struct myvalue, list);
de94b2
-                                if (strcmp(val->value, v->data) == 0) {
de94b2
-                                        match = 1;
de94b2
-                                        break;
de94b2
-                                }
de94b2
-                        }
de94b2
-                        if (!match) {
de94b2
-                                val = malloc(sizeof(struct myvalue));
de94b2
-                                if (val == NULL)
de94b2
-                                        return -ENOMEM;
de94b2
-				val->value = v->data;
de94b2
-                                list_add_tail(&val->list, list);
de94b2
-                        }
de94b2
-                }
de94b2
-        }
de94b2
-        return 0;
de94b2
+	list_for_each(pos, source) {
de94b2
+		v = list_entry(pos, struct ucm_value, list);
de94b2
+		if (check_identifier(identifier, v->name)) {
de94b2
+			err = merge_value(list, v->data);
de94b2
+			if (err < 0)
de94b2
+				return err;
de94b2
+		}
de94b2
+	}
de94b2
+	return 0;
de94b2
+}
de94b2
+
de94b2
+/**
de94b2
+ * \brief compare two identifiers
de94b2
+ */
de94b2
+static int identifier_cmp(const void *_a, const void *_b)
de94b2
+{
de94b2
+	const char * const *a = _a;
de94b2
+	const char * const *b = _b;
de94b2
+	return strcmp(*a, *b);
de94b2
+}
de94b2
+
de94b2
+/**
de94b2
+ * \brief Get list of available identifiers
de94b2
+ * \param list Returned list
de94b2
+ * \param name Name of verb or modifier to query
de94b2
+ * \return Number of list entries if success, otherwise a negative error code
de94b2
+ */
de94b2
+static int get_identifiers_list(snd_use_case_mgr_t *uc_mgr,
de94b2
+				const char **list[], char *name)
de94b2
+{
de94b2
+	struct use_case_verb *verb;
de94b2
+	struct use_case_modifier *modifier;
de94b2
+	struct use_case_device *device;
de94b2
+	struct list_head mylist;
de94b2
+	struct list_head *value_list;
de94b2
+	char *str, **res;
de94b2
+	int err;
de94b2
+
de94b2
+	if (!name)
de94b2
+		return -ENOENT;
de94b2
+
de94b2
+	str = strchr(name, '/');
de94b2
+	if (str) {
de94b2
+		*str = '\0';
de94b2
+		verb = find_verb(uc_mgr, str + 1);
de94b2
+	}
de94b2
+	else {
de94b2
+		verb = uc_mgr->active_verb;
de94b2
+	}
de94b2
+	if (!verb)
de94b2
+		return -ENOENT;
de94b2
+
de94b2
+	value_list = NULL;
de94b2
+	modifier = find_modifier(uc_mgr, verb, name, 0);
de94b2
+	if (modifier) {
de94b2
+		value_list = &modifier->value_list;
de94b2
+	} else {
de94b2
+		device = find_device(uc_mgr, verb, name, 0);
de94b2
+		if (device)
de94b2
+			value_list = &device->value_list;
de94b2
+	}
de94b2
+	if (value_list == NULL)
de94b2
+		return -ENOENT;
de94b2
+
de94b2
+	INIT_LIST_HEAD(&mylist);
de94b2
+	err = add_identifiers(&mylist, &uc_mgr->value_list);
de94b2
+	if (err < 0)
de94b2
+		goto __fail;
de94b2
+	err = add_identifiers(&mylist, &verb->value_list);
de94b2
+	if (err < 0)
de94b2
+		goto __fail;
de94b2
+	err = add_identifiers(&mylist, value_list);
de94b2
+	if (err < 0)
de94b2
+		goto __fail;
de94b2
+	err = myvalue_to_str_list(&mylist, &res;;
de94b2
+	if (err > 0)
de94b2
+		*list = (const char **)res;
de94b2
+	else if (err == 0)
de94b2
+		*list = NULL;
de94b2
+__fail:
de94b2
+	myvalue_list_free(&mylist);
de94b2
+	if (err <= 0)
de94b2
+		return err;
de94b2
+	qsort(*list, err, sizeof(char *), identifier_cmp);
de94b2
+	return err;
de94b2
 }
de94b2
 
de94b2
 /**
de94b2
@@ -1258,8 +1416,7 @@ static int get_value_list(snd_use_case_mgr_t *uc_mgr,
de94b2
                           const char **list[],
de94b2
                           char *verbname)
de94b2
 {
de94b2
-        struct list_head mylist, *pos, *npos;
de94b2
-        struct myvalue *val;
de94b2
+	struct list_head mylist, *pos;
de94b2
         struct use_case_verb *verb;
de94b2
         struct use_case_device *dev;
de94b2
         struct use_case_modifier *mod;
de94b2
@@ -1292,26 +1449,13 @@ static int get_value_list(snd_use_case_mgr_t *uc_mgr,
de94b2
                 if (err < 0)
de94b2
                         goto __fail;
de94b2
         }
de94b2
-        err = alloc_str_list(&mylist, 1, &res;;
de94b2
-        if (err >= 0) {
de94b2
+	err = myvalue_to_str_list(&mylist, &res;;
de94b2
+	if (err > 0)
de94b2
 	        *list = (const char **)res;
de94b2
-                list_for_each(pos, &mylist) {
de94b2
-                        val = list_entry(pos, struct myvalue, list);
de94b2
-                        *res = strdup(val->value);
de94b2
-                        if (*res == NULL) {
de94b2
-                                snd_use_case_free_list((const char **)res, err);
de94b2
-                                err = -ENOMEM;
de94b2
-                                goto __fail;
de94b2
-                        }
de94b2
-                        res++;
de94b2
-                }
de94b2
-        }
de94b2
+	else if (err == 0)
de94b2
+		*list = NULL;
de94b2
       __fail:
de94b2
-        list_for_each_safe(pos, npos, &mylist) {
de94b2
-                val = list_entry(pos, struct myvalue, list);
de94b2
-                list_del(&val->list);
de94b2
-                free(val);
de94b2
-        }
de94b2
+	myvalue_list_free(&mylist);
de94b2
         return err;
de94b2
 }
de94b2
 
de94b2
@@ -1381,21 +1525,23 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
                 } else {
de94b2
                         str = NULL;
de94b2
                 }
de94b2
-        	if (check_identifier(identifier, "_devices"))
de94b2
-          		err = get_device_list(uc_mgr, list, str);
de94b2
+		if (check_identifier(identifier, "_devices"))
de94b2
+			err = get_device_list(uc_mgr, list, str);
de94b2
                 else if (check_identifier(identifier, "_modifiers"))
de94b2
-                        err = get_modifier_list(uc_mgr, list, str);
de94b2
-                else if (check_identifier(identifier, "_supporteddevs"))
de94b2
-                        err = get_supported_device_list(uc_mgr, list, str);
de94b2
-                else if (check_identifier(identifier, "_conflictingdevs"))
de94b2
-                        err = get_conflicting_device_list(uc_mgr, list, str);
de94b2
+			err = get_modifier_list(uc_mgr, list, str);
de94b2
+		else if (check_identifier(identifier, "_identifiers"))
de94b2
+			err = get_identifiers_list(uc_mgr, list, str);
de94b2
+		else if (check_identifier(identifier, "_supporteddevs"))
de94b2
+			err = get_supported_device_list(uc_mgr, list, str);
de94b2
+		else if (check_identifier(identifier, "_conflictingdevs"))
de94b2
+			err = get_conflicting_device_list(uc_mgr, list, str);
de94b2
 		else if (identifier[0] == '_')
de94b2
 			err = -ENOENT;
de94b2
-                else
de94b2
-                        err = get_value_list(uc_mgr, identifier, list, str);
de94b2
-        	if (str)
de94b2
-        		free(str);
de94b2
-        }
de94b2
+		else
de94b2
+			err = get_value_list(uc_mgr, identifier, list, str);
de94b2
+		if (str)
de94b2
+			free(str);
de94b2
+	}
de94b2
       __end:
de94b2
 	pthread_mutex_unlock(&uc_mgr->mutex);
de94b2
 	return err;
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 5ee5ef31b5ff3fb7c904054cb9cac7478a727f7c Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Sun, 1 Dec 2019 14:26:40 +0100
de94b2
Subject: [PATCH 04/16] namehint: correct the @args check
de94b2
de94b2
BugLink: https://github.com/alsa-project/alsa-plugins/issues/3
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 src/control/namehint.c | 6 ++++++
de94b2
 1 file changed, 6 insertions(+)
de94b2
de94b2
diff --git a/src/control/namehint.c b/src/control/namehint.c
de94b2
index 808df6b5..4927ef97 100644
de94b2
--- a/src/control/namehint.c
de94b2
+++ b/src/control/namehint.c
de94b2
@@ -348,6 +348,12 @@ static int try_config(snd_config_t *config,
de94b2
 		goto __cleanup;
de94b2
 	if (snd_config_search(res, "@args", &cfg) >= 0) {
de94b2
 		snd_config_for_each(i, next, cfg) {
de94b2
+			/* skip the argument list */
de94b2
+			snd_config_get_id(snd_config_iterator_entry(i), &str);
de94b2
+			while (*str && *str >= '0' && *str <= '9') str++;
de94b2
+			if (*str == '\0')
de94b2
+				continue;
de94b2
+			/* the argument definition must have the default */
de94b2
 			if (snd_config_search(snd_config_iterator_entry(i),
de94b2
 					      "default", NULL) < 0) {
de94b2
 				err = -EINVAL;
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 6055f8a584296abfc0cec0439ceb708f0eddcc9d Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Sun, 1 Dec 2019 14:30:54 +0100
de94b2
Subject: [PATCH 05/16] namehint: improve the previous patch (check the
de94b2
 returned value)
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 src/control/namehint.c | 3 ++-
de94b2
 1 file changed, 2 insertions(+), 1 deletion(-)
de94b2
de94b2
diff --git a/src/control/namehint.c b/src/control/namehint.c
de94b2
index 4927ef97..60c48ae3 100644
de94b2
--- a/src/control/namehint.c
de94b2
+++ b/src/control/namehint.c
de94b2
@@ -349,7 +349,8 @@ static int try_config(snd_config_t *config,
de94b2
 	if (snd_config_search(res, "@args", &cfg) >= 0) {
de94b2
 		snd_config_for_each(i, next, cfg) {
de94b2
 			/* skip the argument list */
de94b2
-			snd_config_get_id(snd_config_iterator_entry(i), &str);
de94b2
+			if (snd_config_get_id(snd_config_iterator_entry(i), &str) < 0)
de94b2
+				continue;
de94b2
 			while (*str && *str >= '0' && *str <= '9') str++;
de94b2
 			if (*str == '\0')
de94b2
 				continue;
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 4dddcf733d56a13f4d042fefa1fb6230c09f1f65 Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Mon, 2 Dec 2019 11:56:30 +0100
de94b2
Subject: [PATCH 06/16] ucm: docs - allow spaces in device names for JackHWMute
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h | 25 +++++++++++++------------
de94b2
 1 file changed, 13 insertions(+), 12 deletions(-)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index 85c58ac0..e1f58027 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -326,7 +326,7 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  *      - Valid values: "soft" (software attenuation)
de94b2
  *   - EDIDFile
de94b2
  *      - Path to EDID file for HDMI devices
de94b2
- *   - JackControl, JackDev, JackHWMute
de94b2
+ *   - JackControl, JackDev
de94b2
  *      - Jack information for a device. The jack status can be reported via
de94b2
  *        a kcontrol and/or via an input device. **JackControl** is the
de94b2
  *        kcontrol name of the jack, and **JackDev** is the input device id of
de94b2
@@ -334,17 +334,18 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  *        JackDev value should be "foo"). UCM configuration files should
de94b2
  *        contain both JackControl and JackDev when possible, because
de94b2
  *        applications are likely to support only one or the other.
de94b2
- *
de94b2
- *        If **JackHWMute** is set, it indicates that when the jack is plugged
de94b2
- *        in, the hardware automatically mutes some other device(s). The
de94b2
- *        JackHWMute value is a space-separated list of device names (this
de94b2
- *        isn't compatible with device names with spaces in them, so don't use
de94b2
- *        such device names!). Note that JackHWMute should be used only when
de94b2
- *        the hardware enforces the automatic muting. If the hardware doesn't
de94b2
- *        enforce any muting, it may still be tempting to set JackHWMute to
de94b2
- *        trick upper software layers to e.g. automatically mute speakers when
de94b2
- *        headphones are plugged in, but that's application policy
de94b2
- *        configuration that doesn't belong to UCM configuration files.
de94b2
+ *   - JackHWMute
de94b2
+ *	  If this value is set, it indicates that when the jack is plugged
de94b2
+ *	  in, the hardware automatically mutes some other device(s). The
de94b2
+ *	  value is a space-separated list of device names. If the device
de94b2
+ *	  name contains space, it must be enclosed to ' or ", e.g.:
de94b2
+ *		JackHWMute "'Dock Headphone' Headphone"
de94b2
+ *        Note that JackHWMute should be used only when the hardware enforces
de94b2
+ *        the automatic muting. If the hardware doesn't enforce any muting, it
de94b2
+ *        may still be tempting to set JackHWMute to trick upper software layers
de94b2
+ *        to e.g. automatically mute speakers when headphones are plugged in,
de94b2
+ *        but that's application policy configuration that doesn't belong
de94b2
+ *        to UCM configuration files.
de94b2
  *   - MinBufferLevel
de94b2
  *	- This is used on platform where reported buffer level is not accurate.
de94b2
  *	  E.g. "512", which holds 512 samples in device buffer. Note: this will
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 2a286ca9a8415571181ce58027686ec332a834e9 Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Mon, 2 Dec 2019 11:57:18 +0100
de94b2
Subject: [PATCH 07/16] use-case: docs - add PlaybackMixerCopy and
de94b2
 CaptureMixerCopy
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h | 12 ++++++++++++
de94b2
 1 file changed, 12 insertions(+)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index e1f58027..71fcc949 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -309,8 +309,14 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  *   - PlaybackMixerElem
de94b2
  *      - mixer element playback identifier
de94b2
  *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
+ *   - PlaybackMixerCopy
de94b2
+ *      - additional mixer element playback identifier
de94b2
+ *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
+ *      - those elements should copy the volume and switch settings
de94b2
+ *      - element identifiers are separated using the | character
de94b2
  *   - PlaybackMasterElem
de94b2
  *      - mixer element playback identifier for the master control
de94b2
+ *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
  *   - PlaybackMasterType
de94b2
  *      - type of the master volume control
de94b2
  *      - Valid values: "soft" (software attenuation)
de94b2
@@ -319,8 +325,14 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  *   - CaptureMixerElem
de94b2
  *      - mixer element capture identifier
de94b2
  *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
+ *   - CaptureMixerCopy
de94b2
+ *      - additional mixer element capture identifier
de94b2
+ *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
+ *      - those elements should copy the volume and switch settings
de94b2
+ *      - element identifiers are separated using the | character
de94b2
  *   - CaptureMasterElem
de94b2
  *      - mixer element playback identifier for the master control
de94b2
+ *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
  *   - CaptureMasterType
de94b2
  *      - type of the master volume control
de94b2
  *      - Valid values: "soft" (software attenuation)
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From a0fc4447bb7c7f9a850a0a85f3a5a32c1509caf4 Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Tue, 3 Dec 2019 15:01:04 +0100
de94b2
Subject: [PATCH 08/16] ucm: docs - add JackCTL, rearrange JackControl and
de94b2
 JackDev
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h | 22 ++++++++++++++--------
de94b2
 1 file changed, 14 insertions(+), 8 deletions(-)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index 71fcc949..25998cb9 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -338,14 +338,20 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  *      - Valid values: "soft" (software attenuation)
de94b2
  *   - EDIDFile
de94b2
  *      - Path to EDID file for HDMI devices
de94b2
- *   - JackControl, JackDev
de94b2
- *      - Jack information for a device. The jack status can be reported via
de94b2
- *        a kcontrol and/or via an input device. **JackControl** is the
de94b2
- *        kcontrol name of the jack, and **JackDev** is the input device id of
de94b2
- *        the jack (if the full input device path is /dev/input/by-id/foo, the
de94b2
- *        JackDev value should be "foo"). UCM configuration files should
de94b2
- *        contain both JackControl and JackDev when possible, because
de94b2
- *        applications are likely to support only one or the other.
de94b2
+ *   - JackCTL
de94b2
+ *      - jack control device name
de94b2
+ *   - JackControl
de94b2
+ *      - jack control identificator
de94b2
+ *      - can be parsed using snd_use_case_parse_ctl_elem_id()
de94b2
+ *      - UCM configuration files should contain both JackControl and JackDev
de94b2
+ *        when possible, because applications are likely to support only one
de94b2
+ *        or the other
de94b2
+ *   - JackDev
de94b2
+ *      - the input device id of the jack (if the full input device path is
de94b2
+ *        /dev/input/by-id/foo, the JackDev value should be "foo")
de94b2
+ *      - UCM configuration files should contain both JackControl and JackDev
de94b2
+ *        when possible, because applications are likely to support only one
de94b2
+ *        or the other
de94b2
  *   - JackHWMute
de94b2
  *	  If this value is set, it indicates that when the jack is plugged
de94b2
  *	  in, the hardware automatically mutes some other device(s). The
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From e59034a0bec257cc7422a1e9436d936be8696a6f Mon Sep 17 00:00:00 2001
de94b2
From: Hans de Goede <hdegoede@redhat.com>
de94b2
Date: Tue, 3 Dec 2019 18:27:39 +0100
de94b2
Subject: [PATCH 09/16] ucm: Do not fail to parse configs on cards with an
de94b2
 empty CardComponents lists
de94b2
de94b2
Since the UCM profiles for all Bay- and Cherry-Trail SST cards have been
de94b2
moved over to UCM2, parsing them fails with:
de94b2
de94b2
ALSA lib ucm_subs.c:220:(uc_mgr_get_substituted_value) variable '${CardComponents}' is not defined in this context!
de94b2
de94b2
This completely breaks audio support on all Bay- and Cherry-Trail devices.
de94b2
de94b2
This is caused by these non-SOF ASoC using cards having an empty
de94b2
CardComponents list. Which in itself is fine, but is rejected by
de94b2
the ucm_subs.c code. This commit changes the ucm_subs code to accept
de94b2
an empty string as a valid value for CardComponents restoring audio
de94b2
functionality on these boards.
de94b2
de94b2
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 src/ucm/ucm_subs.c | 20 ++++++++++++--------
de94b2
 1 file changed, 12 insertions(+), 8 deletions(-)
de94b2
de94b2
diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
de94b2
index 00afa9e3..90e395f0 100644
de94b2
--- a/src/ucm/ucm_subs.c
de94b2
+++ b/src/ucm/ucm_subs.c
de94b2
@@ -25,6 +25,7 @@
de94b2
  */
de94b2
 
de94b2
 #include "ucm_local.h"
de94b2
+#include <stdbool.h>
de94b2
 #include <sys/stat.h>
de94b2
 #include <limits.h>
de94b2
 
de94b2
@@ -145,10 +146,11 @@ static char *rval_sysfs(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, const char
de94b2
 	return strdup(path);
de94b2
 }
de94b2
 
de94b2
-#define MATCH_VARIABLE(name, id, fcn)					\
de94b2
+#define MATCH_VARIABLE(name, id, fcn, empty_ok)				\
de94b2
 	if (strncmp((name), (id), sizeof(id) - 1) == 0) { 		\
de94b2
 		rval = fcn(uc_mgr);					\
de94b2
 		idsize = sizeof(id) - 1;				\
de94b2
+		allow_empty = (empty_ok);				\
de94b2
 		goto __rval;						\
de94b2
 	}
de94b2
 
de94b2
@@ -189,12 +191,14 @@ int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr,
de94b2
 
de94b2
 	while (*value) {
de94b2
 		if (*value == '$' && *(value+1) == '{') {
de94b2
-			MATCH_VARIABLE(value, "${ConfName}", rval_conf_name);
de94b2
-			MATCH_VARIABLE(value, "${CardId}", rval_card_id);
de94b2
-			MATCH_VARIABLE(value, "${CardDriver}", rval_card_driver);
de94b2
-			MATCH_VARIABLE(value, "${CardName}", rval_card_name);
de94b2
-			MATCH_VARIABLE(value, "${CardLongName}", rval_card_longname);
de94b2
-			MATCH_VARIABLE(value, "${CardComponents}", rval_card_components);
de94b2
+			bool allow_empty = false;
de94b2
+
de94b2
+			MATCH_VARIABLE(value, "${ConfName}", rval_conf_name, false);
de94b2
+			MATCH_VARIABLE(value, "${CardId}", rval_card_id, false);
de94b2
+			MATCH_VARIABLE(value, "${CardDriver}", rval_card_driver, false);
de94b2
+			MATCH_VARIABLE(value, "${CardName}", rval_card_name, false);
de94b2
+			MATCH_VARIABLE(value, "${CardLongName}", rval_card_longname, false);
de94b2
+			MATCH_VARIABLE(value, "${CardComponents}", rval_card_components, true);
de94b2
 			MATCH_VARIABLE2(value, "${env:", rval_env);
de94b2
 			MATCH_VARIABLE2(value, "${sys:", rval_sysfs);
de94b2
 			err = -EINVAL;
de94b2
@@ -208,7 +212,7 @@ int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr,
de94b2
 			}
de94b2
 			goto __error;
de94b2
 __rval:
de94b2
-			if (rval == NULL || rval[0] == '\0') {
de94b2
+			if (rval == NULL || (!allow_empty && rval[0] == '\0')) {
de94b2
 				free(rval);
de94b2
 				strncpy(r, value, idsize);
de94b2
 				r[idsize] = '\0';
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 8e2c70add782f997f7c269ed3f722888e56ff024 Mon Sep 17 00:00:00 2001
de94b2
From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
de94b2
Date: Tue, 3 Dec 2019 18:56:40 +0100
de94b2
Subject: [PATCH 10/16] src/ucm/main.c: fix build without mixer
de94b2
de94b2
Commit 4ce38a5ff466d18039b2606938f866ea3a6c9f3c breaks the build without
de94b2
mixer on:
de94b2
de94b2
  CCLD     libasound.la
de94b2
/home/buildroot/autobuild/instance-1/output-1/host/lib/gcc/xtensa-buildroot-linux-uclibc/8.3.0/../../../../xtensa-buildroot-linux-uclibc/bin/ld: ucm/.libs/libucm.a(main.o): in function `snd_use_case_set':
de94b2
main.c:(.text+0x185c): undefined reference to `snd_mixer_selem_id_parse'
de94b2
de94b2
Fixes: http://autobuild.buildroot.org/results/4d91c9f82a2a61c50c457a851073b85cc09ea345
de94b2
de94b2
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 src/ucm/main.c | 2 ++
de94b2
 1 file changed, 2 insertions(+)
de94b2
de94b2
diff --git a/src/ucm/main.c b/src/ucm/main.c
de94b2
index d2078a23..61922f10 100644
de94b2
--- a/src/ucm/main.c
de94b2
+++ b/src/ucm/main.c
de94b2
@@ -2115,8 +2115,10 @@ int snd_use_case_parse_selem_id(snd_mixer_selem_id_t *dst,
de94b2
 				const char *ucm_id,
de94b2
 				const char *value)
de94b2
 {
de94b2
+#ifdef BUILD_MIXER
de94b2
 	if (strcmp(ucm_id, "PlaybackMixerId") == 0 ||
de94b2
 	    strcmp(ucm_id, "CaptureMixerId") == 0)
de94b2
 		return snd_mixer_selem_id_parse(dst, value);
de94b2
+#endif
de94b2
 	return -EINVAL;
de94b2
 }
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From ad8527d81b09c4d0edd054b5b1468ce1c50b23cb Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Wed, 4 Dec 2019 09:49:40 +0100
de94b2
Subject: [PATCH 11/16] alsa.m4: another try to fix the libatopology detection
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 utils/alsa.m4 | 11 +++++++++--
de94b2
 1 file changed, 9 insertions(+), 2 deletions(-)
de94b2
de94b2
diff --git a/utils/alsa.m4 b/utils/alsa.m4
de94b2
index 4c457f0d..320e4336 100644
de94b2
--- a/utils/alsa.m4
de94b2
+++ b/utils/alsa.m4
de94b2
@@ -22,6 +22,7 @@ alsa_save_CFLAGS="$CFLAGS"
de94b2
 alsa_save_LDFLAGS="$LDFLAGS"
de94b2
 alsa_save_LIBS="$LIBS"
de94b2
 alsa_found=yes
de94b2
+alsa_topology_found=no
de94b2
 
de94b2
 dnl
de94b2
 dnl Get the cflags and libraries for alsa
de94b2
@@ -158,11 +159,17 @@ AC_CHECK_LIB([asound], [snd_ctl_open],,
de94b2
 	 alsa_found=no]
de94b2
 )
de94b2
 if test "x$enable_atopology" = "xyes"; then
de94b2
+alsa_topology_found=yes
de94b2
 AC_CHECK_LIB([atopology], [snd_tplg_new],,
de94b2
 	[ifelse([$3], , [AC_MSG_ERROR(No linkable libatopology was found.)])
de94b2
-	 alsa_found=no]
de94b2
+	 alsa_topology_found=no,
de94b2
+]
de94b2
 )
de94b2
 fi
de94b2
+else
de94b2
+if test "x$enable_atopology" = "xyes"; then
de94b2
+  alsa_topology_found=yes
de94b2
+fi
de94b2
 fi
de94b2
 
de94b2
 if test "x$alsa_found" = "xyes" ; then
de94b2
@@ -183,7 +190,7 @@ fi
de94b2
 
de94b2
 dnl add the alsa topology library; must be at the end
de94b2
 AC_MSG_CHECKING(for ALSA topology LDFLAGS)
de94b2
-if test "x$enable_atopology" = "xyes"; then
de94b2
+if test "x$alsa_topology_found" = "xyes"; then
de94b2
   ALSA_TOPOLOGY_LIBS="$ALSA_TOPOLOGY_LIBS -latopology"
de94b2
 fi
de94b2
 AC_MSG_RESULT($ALSA_TOPOLOGY_LIBS)
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 555a5dbdabc5ed3be1ca81865abdb997bc3a6082 Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Thu, 5 Dec 2019 16:59:05 +0100
de94b2
Subject: [PATCH 12/16] ucm: docs - add Mic/DigitalMic and multiple devices
de94b2
 comments
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h | 8 ++++++++
de94b2
 1 file changed, 8 insertions(+)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index 25998cb9..1736da25 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -114,10 +114,18 @@ extern "C" {
de94b2
  *
de94b2
  * Physical system devices the render and capture audio. Devices can be OR'ed
de94b2
  * together to support audio on simultaneous devices.
de94b2
+ *
de94b2
+ * If multiple devices with the same name exists, the number suffixes should
de94b2
+ * be added to these names like HDMI1,HDMI2,HDMI3 etc. No number gaps are
de94b2
+ * allowed. The names with numbers must be continuous.
de94b2
+ *
de94b2
+ * The preference of the devices is determined by the priority value.
de94b2
  */
de94b2
 #define SND_USE_CASE_DEV_NONE		"None"		/**< None Device */
de94b2
 #define SND_USE_CASE_DEV_SPEAKER	"Speaker"	/**< Speaker Device */
de94b2
 #define SND_USE_CASE_DEV_LINE		"Line"		/**< Line Device */
de94b2
+#define SND_USE_CASE_DEV_MIC            "Mic"           /**< Integrated Analog Microphone */
de94b2
+#define SND_USE_CASE_DEV_DIGITAL_MIC    "DigitalMic"    /**< Integrated Digital Microphone */
de94b2
 #define SND_USE_CASE_DEV_HEADPHONES	"Headphones"	/**< Headphones Device */
de94b2
 #define SND_USE_CASE_DEV_HEADSET	"Headset"	/**< Headset Device */
de94b2
 #define SND_USE_CASE_DEV_HANDSET	"Handset"	/**< Handset Device */
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 1ad660ddeecb2a364f1ca62aa60f256f7029cfdc Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Thu, 5 Dec 2019 17:01:31 +0100
de94b2
Subject: [PATCH 13/16] ucm: docs - remove DigitalMic, it does not have sense
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h | 3 +--
de94b2
 1 file changed, 1 insertion(+), 2 deletions(-)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index 1736da25..214a2a4c 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -124,8 +124,7 @@ extern "C" {
de94b2
 #define SND_USE_CASE_DEV_NONE		"None"		/**< None Device */
de94b2
 #define SND_USE_CASE_DEV_SPEAKER	"Speaker"	/**< Speaker Device */
de94b2
 #define SND_USE_CASE_DEV_LINE		"Line"		/**< Line Device */
de94b2
-#define SND_USE_CASE_DEV_MIC            "Mic"           /**< Integrated Analog Microphone */
de94b2
-#define SND_USE_CASE_DEV_DIGITAL_MIC    "DigitalMic"    /**< Integrated Digital Microphone */
de94b2
+#define SND_USE_CASE_DEV_MIC            "Mic"           /**< Integrated Microphone */
de94b2
 #define SND_USE_CASE_DEV_HEADPHONES	"Headphones"	/**< Headphones Device */
de94b2
 #define SND_USE_CASE_DEV_HEADSET	"Headset"	/**< Headset Device */
de94b2
 #define SND_USE_CASE_DEV_HANDSET	"Handset"	/**< Handset Device */
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From 5473c5d677915b88d5c93d5bcc6cd16bb6a40342 Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Thu, 5 Dec 2019 17:19:06 +0100
de94b2
Subject: [PATCH 14/16] ucm: docs - change the Mic description to simple
de94b2
 Microphone Device
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h | 2 +-
de94b2
 1 file changed, 1 insertion(+), 1 deletion(-)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index 214a2a4c..b04f7b9d 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -124,7 +124,7 @@ extern "C" {
de94b2
 #define SND_USE_CASE_DEV_NONE		"None"		/**< None Device */
de94b2
 #define SND_USE_CASE_DEV_SPEAKER	"Speaker"	/**< Speaker Device */
de94b2
 #define SND_USE_CASE_DEV_LINE		"Line"		/**< Line Device */
de94b2
-#define SND_USE_CASE_DEV_MIC            "Mic"           /**< Integrated Microphone */
de94b2
+#define SND_USE_CASE_DEV_MIC            "Mic"           /**< Microphone Device */
de94b2
 #define SND_USE_CASE_DEV_HEADPHONES	"Headphones"	/**< Headphones Device */
de94b2
 #define SND_USE_CASE_DEV_HEADSET	"Headset"	/**< Headset Device */
de94b2
 #define SND_USE_CASE_DEV_HANDSET	"Handset"	/**< Handset Device */
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From ca67e823833213e140a09ce43b6399b7676616df Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Fri, 6 Dec 2019 11:11:54 +0100
de94b2
Subject: [PATCH 15/16] ucm: docs - add note about the sequences and device
de94b2
 split
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h | 5 +++++
de94b2
 1 file changed, 5 insertions(+)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index b04f7b9d..2efcb4d8 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -119,6 +119,11 @@ extern "C" {
de94b2
  * be added to these names like HDMI1,HDMI2,HDMI3 etc. No number gaps are
de94b2
  * allowed. The names with numbers must be continuous.
de94b2
  *
de94b2
+ * If EnableSequence/DisableSequence controls independent paths in the hardware
de94b2
+ * it is also recommended to split playback and capture UCM devices and use
de94b2
+ * the number suffixes. Example use case: Use the integrated microphone
de94b2
+ * in the laptop instead the microphone in headphones.
de94b2
+ *
de94b2
  * The preference of the devices is determined by the priority value.
de94b2
  */
de94b2
 #define SND_USE_CASE_DEV_NONE		"None"		/**< None Device */
de94b2
-- 
de94b2
2.20.1
de94b2
de94b2
de94b2
From f828dfe549fbab0a920768c63ebd3478272954eb Mon Sep 17 00:00:00 2001
de94b2
From: Jaroslav Kysela <perex@perex.cz>
de94b2
Date: Tue, 10 Dec 2019 11:48:06 +0100
de94b2
Subject: [PATCH 16/16] ucm: docs - remove MixerCopy values, add Priority for
de94b2
 verb, improve priority docs
de94b2
de94b2
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
de94b2
---
de94b2
 include/use-case.h | 18 ++++++------------
de94b2
 1 file changed, 6 insertions(+), 12 deletions(-)
de94b2
de94b2
diff --git a/include/use-case.h b/include/use-case.h
de94b2
index 2efcb4d8..134303af 100644
de94b2
--- a/include/use-case.h
de94b2
+++ b/include/use-case.h
de94b2
@@ -274,6 +274,10 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  * Recommended names for values:
de94b2
  *   - TQ
de94b2
  *      - Tone Quality
de94b2
+ *   - Priority
de94b2
+ *      - priority value (1-10000), higher value means higher priority
de94b2
+ *      - valid only for verbs
de94b2
+ *      - for devices - PlaybackPriority and CapturePriority
de94b2
  *   - PlaybackPCM
de94b2
  *      - full PCM playback device name
de94b2
  *   - PlaybackPCMIsDummy
de94b2
@@ -301,7 +305,7 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  *      - playback control switch identifier string
de94b2
  *	- can be parsed using snd_use_case_parse_ctl_elem_id()
de94b2
  *   - PlaybackPriority
de94b2
- *      - priority value (1-10000), default value is 100, higher value means lower priority
de94b2
+ *      - priority value (1-10000), higher value means higher priority
de94b2
  *   - CaptureRate
de94b2
  *      - capture device sample rate
de94b2
  *   - CaptureChannels
de94b2
@@ -315,17 +319,12 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  *      - capture control switch identifier string
de94b2
  *	- can be parsed using snd_use_case_parse_ctl_elem_id()
de94b2
  *   - CapturePriority
de94b2
- *      - priority value (1-10000), default value is 100, higher value means lower priority
de94b2
+ *      - priority value (1-10000), higher value means higher priority
de94b2
  *   - PlaybackMixer
de94b2
  *      - name of playback mixer
de94b2
  *   - PlaybackMixerElem
de94b2
  *      - mixer element playback identifier
de94b2
  *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
- *   - PlaybackMixerCopy
de94b2
- *      - additional mixer element playback identifier
de94b2
- *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
- *      - those elements should copy the volume and switch settings
de94b2
- *      - element identifiers are separated using the | character
de94b2
  *   - PlaybackMasterElem
de94b2
  *      - mixer element playback identifier for the master control
de94b2
  *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
@@ -337,11 +336,6 @@ int snd_use_case_get_list(snd_use_case_mgr_t *uc_mgr,
de94b2
  *   - CaptureMixerElem
de94b2
  *      - mixer element capture identifier
de94b2
  *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
- *   - CaptureMixerCopy
de94b2
- *      - additional mixer element capture identifier
de94b2
- *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
- *      - those elements should copy the volume and switch settings
de94b2
- *      - element identifiers are separated using the | character
de94b2
  *   - CaptureMasterElem
de94b2
  *      - mixer element playback identifier for the master control
de94b2
  *	- can be parsed using snd_use_case_parse_selem_id()
de94b2
-- 
de94b2
2.20.1
de94b2