Blame SOURCES/alsa-git.patch

8afdf8
From 78212445de4c8e07873cbc7dff2abcacd031f151 Mon Sep 17 00:00:00 2001
8afdf8
From: Jaroslav Kysela <perex@perex.cz>
8afdf8
Date: Tue, 1 Jun 2021 17:47:42 +0200
ba7b96
Subject: [PATCH 01/16] alsactl: fix the nested iteration
f18a9b
8afdf8
There may be nested iterations for hw: card names.
8afdf8
Handle this card name in snd_card_iterator_sinit().
f18a9b
8afdf8
BugLink: https://github.com/alsa-project/alsa-lib/issues/142
8afdf8
Fixes: eefc2c6 ("alsactl: use card iterator functions for all card loops")
f18a9b
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
f18a9b
---
8afdf8
 alsactl/utils.c | 2 ++
8afdf8
 1 file changed, 2 insertions(+)
8afdf8
8afdf8
diff --git a/alsactl/utils.c b/alsactl/utils.c
8afdf8
index c79fd95..881b505 100644
8afdf8
--- a/alsactl/utils.c
8afdf8
+++ b/alsactl/utils.c
8afdf8
@@ -247,6 +247,8 @@ int snd_card_iterator_sinit(struct snd_card_iterator *iter, const char *cardname
8afdf8
 	int cardno = -1;
f18a9b
 
8afdf8
 	if (cardname) {
8afdf8
+		if (strncmp(cardname, "hw:", 3) == 0)
8afdf8
+			cardname += 3;
8afdf8
 		cardno = snd_card_get_index(cardname);
8afdf8
 		if (cardno < 0) {
8afdf8
 			error("Cannot find soundcard '%s'...", cardname);
f18a9b
-- 
8afdf8
2.30.2
f18a9b
f18a9b
8afdf8
From 3d7a6facd9e1f962eef6c4ba3aa4cdc22477a6ac Mon Sep 17 00:00:00 2001
8afdf8
From: Chao Song <chao.song@linux.intel.com>
8afdf8
Date: Mon, 31 May 2021 10:29:57 +0800
ba7b96
Subject: [PATCH 02/16] topology: fix potential null pointer from strchr
8afdf8
8afdf8
This patch adds check to the return pointer from strchr,
8afdf8
because it may be null and cause segment fault, if component
8afdf8
is not properly constructed.
8afdf8
8afdf8
Fixes: https://github.com/alsa-project/alsa-utils/pull/91
8afdf8
Signed-off-by: Chao Song <chao.song@linux.intel.com>
f18a9b
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
f18a9b
---
8afdf8
 topology/pre-process-dapm.c   | 5 +++++
8afdf8
 topology/pre-process-object.c | 5 +++++
8afdf8
 2 files changed, 10 insertions(+)
8afdf8
8afdf8
diff --git a/topology/pre-process-dapm.c b/topology/pre-process-dapm.c
8afdf8
index 450ca71..dbaf2f1 100644
8afdf8
--- a/topology/pre-process-dapm.c
8afdf8
+++ b/topology/pre-process-dapm.c
8afdf8
@@ -146,6 +146,11 @@ static int tplg_pp_get_widget_name(struct tplg_pre_processor *tplg_pp,
8afdf8
 
8afdf8
 	/* get class name */
8afdf8
 	args = strchr(string, '.');
8afdf8
+	if (!args) {
8afdf8
+		SNDERR("Error getting class name for %s\n", string);
8afdf8
+		return -EINVAL;
8afdf8
+	}
8afdf8
+
8afdf8
 	class_name = calloc(1, strlen(string) - strlen(args) + 1);
8afdf8
 	if (!class_name)
8afdf8
 		return -ENOMEM;
8afdf8
diff --git a/topology/pre-process-object.c b/topology/pre-process-object.c
8afdf8
index 09aa375..ac8caec 100644
8afdf8
--- a/topology/pre-process-object.c
8afdf8
+++ b/topology/pre-process-object.c
8afdf8
@@ -492,6 +492,11 @@ static int tplg_pp_add_object_tuple_section(struct tplg_pre_processor *tplg_pp,
8afdf8
 	}
8afdf8
 
8afdf8
 	type = strchr(token_ref, '.');
8afdf8
+	if(!type) {
8afdf8
+		SNDERR("Error getting type for %s\n", token_ref);
8afdf8
+		return -EINVAL;
f18a9b
+	}
8afdf8
+
8afdf8
 	token = calloc(1, strlen(token_ref) - strlen(type) + 1);
8afdf8
 	if (!token)
8afdf8
 		return -ENOMEM;
f18a9b
-- 
8afdf8
2.30.2
f18a9b
f18a9b
8afdf8
From d6d566a9eebb63dd9d1351b07d385d39cdc33beb Mon Sep 17 00:00:00 2001
f18a9b
From: Jaroslav Kysela <perex@perex.cz>
8afdf8
Date: Fri, 4 Jun 2021 09:53:56 +0200
ba7b96
Subject: [PATCH 03/16] alsactl: return error value in dump_config_tree()
f18a9b
f18a9b
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
f18a9b
---
8afdf8
 alsactl/alsactl.c | 2 +-
8afdf8
 1 file changed, 1 insertion(+), 1 deletion(-)
8afdf8
8afdf8
diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c
8afdf8
index a011284..05738fb 100644
8afdf8
--- a/alsactl/alsactl.c
8afdf8
+++ b/alsactl/alsactl.c
8afdf8
@@ -170,7 +170,7 @@ static int dump_config_tree(snd_config_t *top)
8afdf8
 		return err;
8afdf8
 	err = snd_config_save(top, out);
8afdf8
 	snd_output_close(out);
8afdf8
-	return 0;
8afdf8
+	return err;
f18a9b
 }
f18a9b
 
8afdf8
 static int dump_state(const char *file)
f18a9b
-- 
8afdf8
2.30.2
f18a9b
f18a9b
8afdf8
From 511dd7a597735048f3883ef7883adf853ac2de4a Mon Sep 17 00:00:00 2001
8afdf8
From: Jaroslav Kysela <perex@perex.cz>
8afdf8
Date: Fri, 4 Jun 2021 09:56:20 +0200
ba7b96
Subject: [PATCH 04/16] alsactl: init() - return error value from
8afdf8
 snd_card_iterator_sinit() call
8afdf8
8afdf8
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
8afdf8
---
8afdf8
 alsactl/init_parse.c | 2 ++
8afdf8
 1 file changed, 2 insertions(+)
8afdf8
8afdf8
diff --git a/alsactl/init_parse.c b/alsactl/init_parse.c
8afdf8
index 9d0f473..e439de7 100644
8afdf8
--- a/alsactl/init_parse.c
8afdf8
+++ b/alsactl/init_parse.c
8afdf8
@@ -1751,6 +1751,8 @@ int init(const char *cfgdir, const char *filename, int flags, const char *cardna
8afdf8
 	
8afdf8
 	sysfs_init();
8afdf8
 	err = snd_card_iterator_sinit(&iter, cardname);
8afdf8
+	if (err < 0)
8afdf8
+		goto out;
8afdf8
 	while (snd_card_iterator_next(&iter)) {
8afdf8
 		err = snd_card_clean_cfgdir(cfgdir, iter.card);
8afdf8
 		if (err < 0) {
8afdf8
-- 
8afdf8
2.30.2
f18a9b
f18a9b
8afdf8
From 2bc595e7bd9a9b8f8605104cfdb8f40a07c2655b Mon Sep 17 00:00:00 2001
8afdf8
From: Jaroslav Kysela <perex@perex.cz>
8afdf8
Date: Fri, 4 Jun 2021 09:58:46 +0200
ba7b96
Subject: [PATCH 05/16] alsactl: check for error values from
ba7b96
 snd_config_get...()
8afdf8
8afdf8
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
f18a9b
---
8afdf8
 alsactl/state.c | 41 ++++++++++++++++++++++++++++-------------
8afdf8
 1 file changed, 28 insertions(+), 13 deletions(-)
8afdf8
8afdf8
diff --git a/alsactl/state.c b/alsactl/state.c
8afdf8
index 44fda3f..b3a3f4d 100644
8afdf8
--- a/alsactl/state.c
8afdf8
+++ b/alsactl/state.c
8afdf8
@@ -655,13 +655,16 @@ static long config_iface(snd_config_t *n)
8afdf8
 	const char *str;
8afdf8
 	switch (snd_config_get_type(n)) {
8afdf8
 	case SND_CONFIG_TYPE_INTEGER:
8afdf8
-		snd_config_get_integer(n, &i);
8afdf8
+		if (snd_config_get_integer(n, &i) < 0)
8afdf8
+			return -1;
8afdf8
 		return i;
8afdf8
 	case SND_CONFIG_TYPE_INTEGER64:
8afdf8
-		snd_config_get_integer64(n, &li;;
8afdf8
+		if (snd_config_get_integer64(n, &li) < 0)
8afdf8
+			return -1;
8afdf8
 		return li;
8afdf8
 	case SND_CONFIG_TYPE_STRING:
8afdf8
-		snd_config_get_string(n, &str);
8afdf8
+		if (snd_config_get_string(n, &str) < 0)
8afdf8
+			return -1;
8afdf8
 		break;
8afdf8
 	default:
8afdf8
 		return -1;
8afdf8
@@ -681,17 +684,20 @@ static int config_bool(snd_config_t *n, int doit)
f18a9b
 
8afdf8
 	switch (snd_config_get_type(n)) {
8afdf8
 	case SND_CONFIG_TYPE_INTEGER:
8afdf8
-		snd_config_get_integer(n, &val;;
8afdf8
+		if (snd_config_get_integer(n, &val) < 0)
8afdf8
+			return -1;
8afdf8
 		if (val < 0 || val > 1)
8afdf8
 			return -1;
8afdf8
 		return val;
8afdf8
 	case SND_CONFIG_TYPE_INTEGER64:
8afdf8
-		snd_config_get_integer64(n, &lval);
8afdf8
+		if (snd_config_get_integer64(n, &lval) < 0)
8afdf8
+			return -1;
8afdf8
 		if (lval < 0 || lval > 1)
8afdf8
 			return -1;
8afdf8
 		return (int) lval;
8afdf8
 	case SND_CONFIG_TYPE_STRING:
8afdf8
-		snd_config_get_string(n, &str);
8afdf8
+		if (snd_config_get_string(n, &str) < 0)
8afdf8
+			return -1;
8afdf8
 		break;
8afdf8
 	case SND_CONFIG_TYPE_COMPOUND:
8afdf8
 		if (!force_restore || !doit)
8afdf8
@@ -718,13 +724,16 @@ static int config_enumerated(snd_config_t *n, snd_ctl_t *handle,
f18a9b
 
8afdf8
 	switch (snd_config_get_type(n)) {
8afdf8
 	case SND_CONFIG_TYPE_INTEGER:
8afdf8
-		snd_config_get_integer(n, &val;;
8afdf8
+		if (snd_config_get_integer(n, &val) < 0)
8afdf8
+			return -1;
8afdf8
 		return val;
8afdf8
 	case SND_CONFIG_TYPE_INTEGER64:
8afdf8
-		snd_config_get_integer64(n, &lval);
8afdf8
+		if (snd_config_get_integer64(n, &lval) < 0)
8afdf8
+			return -1;
8afdf8
 		return (int) lval;
8afdf8
 	case SND_CONFIG_TYPE_STRING:
8afdf8
-		snd_config_get_string(n, &str);
8afdf8
+		if (snd_config_get_string(n, &str) < 0)
8afdf8
+			return -1;
8afdf8
 		break;
8afdf8
 	case SND_CONFIG_TYPE_COMPOUND:
8afdf8
 		if (!force_restore || !doit)
8afdf8
@@ -1247,6 +1256,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
8afdf8
 		}
8afdf8
 		if (strcmp(fld, "iface") == 0) {
8afdf8
 			iface = (snd_ctl_elem_iface_t)config_iface(n);
8afdf8
+			if (iface < 0)
8afdf8
+				return -EINVAL;
8afdf8
 			continue;
8afdf8
 		}
8afdf8
 		if (strcmp(fld, "device") == 0) {
8afdf8
@@ -1254,7 +1265,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
8afdf8
 				cerror(doit, "control.%d.%s is invalid", numid, fld);
8afdf8
 				return -EINVAL;
8afdf8
 			}
8afdf8
-			snd_config_get_integer(n, &device);
8afdf8
+			if (snd_config_get_integer(n, &device) < 0)
8afdf8
+				return -EINVAL;
8afdf8
 			continue;
8afdf8
 		}
8afdf8
 		if (strcmp(fld, "subdevice") == 0) {
8afdf8
@@ -1262,7 +1274,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
8afdf8
 				cerror(doit, "control.%d.%s is invalid", numid, fld);
8afdf8
 				return -EINVAL;
8afdf8
 			}
8afdf8
-			snd_config_get_integer(n, &subdevice);
8afdf8
+			if (snd_config_get_integer(n, &subdevice) < 0)
8afdf8
+				return -EINVAL;
8afdf8
 			continue;
8afdf8
 		}
8afdf8
 		if (strcmp(fld, "name") == 0) {
8afdf8
@@ -1270,7 +1283,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
8afdf8
 				cerror(doit, "control.%d.%s is invalid", numid, fld);
8afdf8
 				return -EINVAL;
8afdf8
 			}
8afdf8
-			snd_config_get_string(n, &name);
8afdf8
+			if (snd_config_get_string(n, &name) < 0)
8afdf8
+				return -EINVAL;
8afdf8
 			continue;
8afdf8
 		}
8afdf8
 		if (strcmp(fld, "index") == 0) {
8afdf8
@@ -1278,7 +1292,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
8afdf8
 				cerror(doit, "control.%d.%s is invalid", numid, fld);
8afdf8
 				return -EINVAL;
8afdf8
 			}
8afdf8
-			snd_config_get_integer(n, &index);
8afdf8
+			if (snd_config_get_integer(n, &index) < 0)
8afdf8
+				return -EINVAL;
8afdf8
 			continue;
8afdf8
 		}
8afdf8
 		if (strcmp(fld, "value") == 0) {
f18a9b
-- 
8afdf8
2.30.2
f18a9b
f18a9b
8afdf8
From 646d6ff094a82153db49af176cba3aacbde46cf6 Mon Sep 17 00:00:00 2001
8afdf8
From: Jaroslav Kysela <perex@perex.cz>
8afdf8
Date: Fri, 4 Jun 2021 10:04:50 +0200
ba7b96
Subject: [PATCH 06/16] =?UTF-8?q?alsactl:=20state=20-=20fix=20=E2=80=98ite?=
ba7b96
 =?UTF-8?q?m=E2=80=99=20may=20be=20used=20uninitialized=20gcc=20warning?=
8afdf8
MIME-Version: 1.0
8afdf8
Content-Type: text/plain; charset=UTF-8
8afdf8
Content-Transfer-Encoding: 8bit
f18a9b
8afdf8
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
f18a9b
---
8afdf8
 alsactl/state.c | 2 +-
8afdf8
 1 file changed, 1 insertion(+), 1 deletion(-)
f18a9b
8afdf8
diff --git a/alsactl/state.c b/alsactl/state.c
8afdf8
index b3a3f4d..9c75688 100644
8afdf8
--- a/alsactl/state.c
8afdf8
+++ b/alsactl/state.c
8afdf8
@@ -229,7 +229,7 @@ static int get_control(snd_ctl_t *handle, snd_ctl_elem_id_t *id, snd_config_t *t
8afdf8
 {
8afdf8
 	snd_ctl_elem_value_t *ctl;
8afdf8
 	snd_ctl_elem_info_t *info;
8afdf8
-	snd_config_t *control, *comment, *item, *value;
8afdf8
+	snd_config_t *control, *comment, *item = NULL, *value;
8afdf8
 	const char *s;
8afdf8
 	char buf[256];
8afdf8
 	unsigned int idx;
8afdf8
-- 
8afdf8
2.30.2
f18a9b
f18a9b
8afdf8
From cd2f779b8d6439479b9802e9fd2c8af86f8702fb Mon Sep 17 00:00:00 2001
8afdf8
From: Jaroslav Kysela <perex@perex.cz>
8afdf8
Date: Fri, 4 Jun 2021 10:08:18 +0200
ba7b96
Subject: [PATCH 07/16] alsactl: fix lock_fd unlock in load_configuration() -
8afdf8
 error path
f18a9b
8afdf8
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
f18a9b
---
8afdf8
 alsactl/utils.c | 6 ++++--
8afdf8
 1 file changed, 4 insertions(+), 2 deletions(-)
8afdf8
8afdf8
diff --git a/alsactl/utils.c b/alsactl/utils.c
8afdf8
index 881b505..fd4a108 100644
8afdf8
--- a/alsactl/utils.c
8afdf8
+++ b/alsactl/utils.c
8afdf8
@@ -220,15 +220,17 @@ int load_configuration(const char *file, snd_config_t **top, int *open_failed)
8afdf8
 	}
8afdf8
 	err = snd_config_load(config, in);
8afdf8
 	snd_input_close(in);
8afdf8
-	if (lock_fd >= 0)
8afdf8
-		state_unlock(lock_fd, file);
8afdf8
 	if (err < 0) {
8afdf8
 		error("snd_config_load error: %s", snd_strerror(err));
8afdf8
 out:
8afdf8
+		if (lock_fd >= 0)
8afdf8
+			state_unlock(lock_fd, file);
8afdf8
 		snd_config_delete(config);
8afdf8
 		snd_config_update_free_global();
8afdf8
 		return err;
8afdf8
 	} else {
8afdf8
+		if (lock_fd >= 0)
8afdf8
+			state_unlock(lock_fd, file);
8afdf8
 		*top = config;
8afdf8
 		return 0;
f18a9b
 	}
f18a9b
-- 
8afdf8
2.30.2
f18a9b
f18a9b
8afdf8
From 74ad91245f8257e242cf5b5b6b809f94321f197a Mon Sep 17 00:00:00 2001
8afdf8
From: Jaroslav Kysela <perex@perex.cz>
8afdf8
Date: Fri, 4 Jun 2021 10:12:06 +0200
ba7b96
Subject: [PATCH 08/16] axfer: fix wrong calloc() item size in
8afdf8
 allocate_containers()
f18a9b
8afdf8
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
f18a9b
---
8afdf8
 axfer/subcmd-transfer.c | 2 +-
8afdf8
 1 file changed, 1 insertion(+), 1 deletion(-)
8afdf8
8afdf8
diff --git a/axfer/subcmd-transfer.c b/axfer/subcmd-transfer.c
8afdf8
index 27d2cc5..839215a 100644
8afdf8
--- a/axfer/subcmd-transfer.c
8afdf8
+++ b/axfer/subcmd-transfer.c
8afdf8
@@ -155,7 +155,7 @@ static int allocate_containers(struct context *ctx, unsigned int count)
8afdf8
 		return -ENOMEM;
8afdf8
 	ctx->cntr_count = count;
8afdf8
 
8afdf8
-	ctx->cntr_fds = calloc(count, sizeof(*ctx->cntrs));
8afdf8
+	ctx->cntr_fds = calloc(count, sizeof(*ctx->cntr_fds));
8afdf8
 	if (ctx->cntr_fds == NULL)
8afdf8
 		return -ENOMEM;
f18a9b
 
f18a9b
-- 
8afdf8
2.30.2
f18a9b
f18a9b
8afdf8
From c58f981e1530557835461b17b92eac6c475e5f68 Mon Sep 17 00:00:00 2001
f18a9b
From: Jaroslav Kysela <perex@perex.cz>
8afdf8
Date: Fri, 4 Jun 2021 10:19:22 +0200
ba7b96
Subject: [PATCH 09/16] topology: fix few coverity detected defects
f18a9b
f18a9b
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
f18a9b
---
8afdf8
 topology/pre-process-dapm.c   |  3 ++-
8afdf8
 topology/pre-process-object.c | 15 ++++++++++-----
8afdf8
 topology/pre-processor.c      |  2 +-
8afdf8
 3 files changed, 13 insertions(+), 7 deletions(-)
8afdf8
8afdf8
diff --git a/topology/pre-process-dapm.c b/topology/pre-process-dapm.c
8afdf8
index dbaf2f1..dc510e1 100644
8afdf8
--- a/topology/pre-process-dapm.c
8afdf8
+++ b/topology/pre-process-dapm.c
8afdf8
@@ -203,7 +203,8 @@ static int tplg_pp_get_widget_name(struct tplg_pre_processor *tplg_pp,
f18a9b
 
8afdf8
 		if (!args) {
8afdf8
 			SNDERR("insufficient arugments for widget %s\n", string);
8afdf8
-			return -EINVAL;
8afdf8
+			ret = -EINVAL;
8afdf8
+			goto err;
f18a9b
 		}
8afdf8
 
8afdf8
 		remaining = strchr(args + 1, '.');
8afdf8
diff --git a/topology/pre-process-object.c b/topology/pre-process-object.c
8afdf8
index ac8caec..7565091 100644
8afdf8
--- a/topology/pre-process-object.c
8afdf8
+++ b/topology/pre-process-object.c
8afdf8
@@ -463,7 +463,8 @@ static snd_config_t *tplg_object_lookup_in_config(struct tplg_pre_processor *tpl
8afdf8
 	if (!config_id)
8afdf8
 		return NULL;
8afdf8
 
8afdf8
-	snd_config_search(class, config_id, &obj_cfg);
8afdf8
+	if (snd_config_search(class, config_id, &obj_cfg) < 0)
8afdf8
+		return NULL;
8afdf8
 	free(config_id);
8afdf8
 	return obj_cfg;
8afdf8
 }
8afdf8
@@ -704,11 +705,12 @@ static int tplg_add_object_data(struct tplg_pre_processor *tplg_pp, snd_config_t
8afdf8
 
8afdf8
 		ret = tplg_pp_add_object_tuple_section(tplg_pp, class_cfg, n, data_cfg_name,
8afdf8
 						       token);
8afdf8
-		free(data_cfg_name);
8afdf8
 		if (ret < 0) {
8afdf8
 			SNDERR("Failed to add data section %s\n", data_cfg_name);
8afdf8
+			free(data_cfg_name);
8afdf8
 			return ret;
f18a9b
 		}
8afdf8
+		free(data_cfg_name);
f18a9b
 	}
f18a9b
 
8afdf8
 	return 0;
8afdf8
@@ -1215,8 +1217,10 @@ static int tplg_construct_object_name(struct tplg_pre_processor *tplg_pp, snd_co
8afdf8
 		return 0;
8afdf8
 
8afdf8
 	/* set class name as the name prefix for the object */
8afdf8
-	snd_config_get_id(obj, &obj_id);
8afdf8
-	snd_config_get_id(class_cfg, &class_id);
8afdf8
+	if (snd_config_get_id(obj, &obj_id) < 0)
8afdf8
+		return -EINVAL;
8afdf8
+	if (snd_config_get_id(class_cfg, &class_id) < 0)
8afdf8
+		return -EINVAL;
8afdf8
 	new_name = strdup(class_id);
8afdf8
 	if (!new_name)
8afdf8
 		return -ENOMEM;
8afdf8
@@ -1280,7 +1284,8 @@ static int tplg_construct_object_name(struct tplg_pre_processor *tplg_pp, snd_co
8afdf8
 		default:
8afdf8
 			SNDERR("Argument '%s' in object '%s.%s' is not an integer or a string\n",
8afdf8
 			       s, class_id, obj_id);
8afdf8
-			return -EINVAL;
8afdf8
+			ret = -EINVAL;
8afdf8
+			goto err;
8afdf8
 		}
8afdf8
 
8afdf8
 		/* alloc and concat arg value to the name */
8afdf8
diff --git a/topology/pre-processor.c b/topology/pre-processor.c
8afdf8
index 0458c3c..442dcc4 100644
8afdf8
--- a/topology/pre-processor.c
8afdf8
+++ b/topology/pre-processor.c
8afdf8
@@ -183,7 +183,7 @@ int init_pre_precessor(struct tplg_pre_processor **tplg_pp, snd_output_type_t ty
8afdf8
 
8afdf8
 	_tplg_pp = calloc(1, sizeof(struct tplg_pre_processor));
8afdf8
 	if (!_tplg_pp)
8afdf8
-		ret = -ENOMEM;
8afdf8
+		return -ENOMEM;
8afdf8
 
8afdf8
 	*tplg_pp = _tplg_pp;
8afdf8
 
f18a9b
-- 
8afdf8
2.30.2
f18a9b
ba7b96
ba7b96
From f138117a457944ca73776bd752693d64ec207e55 Mon Sep 17 00:00:00 2001
ba7b96
From: Jaroslav Kysela <perex@perex.cz>
ba7b96
Date: Mon, 7 Jun 2021 17:21:56 +0200
ba7b96
Subject: [PATCH 10/16] alsactl: load_state() - initialize config variable for
ba7b96
 the open_failed case
ba7b96
ba7b96
Fixes: https://github.com/alsa-project/alsa-utils/issues/93
ba7b96
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
ba7b96
---
ba7b96
 alsactl/state.c | 1 +
ba7b96
 1 file changed, 1 insertion(+)
ba7b96
ba7b96
diff --git a/alsactl/state.c b/alsactl/state.c
ba7b96
index 9c75688..439e1f8 100644
ba7b96
--- a/alsactl/state.c
ba7b96
+++ b/alsactl/state.c
ba7b96
@@ -1642,6 +1642,7 @@ int load_state(const char *cfgdir, const char *file,
ba7b96
 	snd_config_t *config;
ba7b96
 	const char *cardname1;
ba7b96
 
ba7b96
+	config = NULL;
ba7b96
 	err = load_configuration(file, &config, &open_failed);
ba7b96
 	if (err < 0 && !open_failed)
ba7b96
 		return err;
ba7b96
-- 
ba7b96
2.30.2
ba7b96
ba7b96
ba7b96
From 6018c2014ac24877b2aa58c2c57f2fd901e6c7b1 Mon Sep 17 00:00:00 2001
ba7b96
From: =?UTF-8?q?S=C3=B6ren=20Tempel?= <soeren+git@soeren-tempel.net>
ba7b96
Date: Sun, 6 Jun 2021 03:14:19 +0200
ba7b96
Subject: [PATCH 11/16] alsactl: load_state: Only delete config if one was
ba7b96
 loaded
ba7b96
MIME-Version: 1.0
ba7b96
Content-Type: text/plain; charset=UTF-8
ba7b96
Content-Transfer-Encoding: 8bit
ba7b96
ba7b96
If load_configuration fails with open_failed == true, load_state will
ba7b96
jump to the out label without config being initialized and pass this
ba7b96
uninitialized config value to snd_config_delete. This commit fixes this
ba7b96
issue by initializing config with NULL and checking if it is non-null
ba7b96
before invoking snd_config_delete.
ba7b96
ba7b96
Fixes: https://github.com/alsa-project/alsa-utils/pull/94
ba7b96
Fixes: f138117 ("alsactl: load_state() - initialize config variable for the open_failed case")
ba7b96
BugLink: https://github.com/alsa-project/alsa-utils/issues/93
ba7b96
Signed-off-by: Sören Tempel <soeren+git@soeren-tempel.net>
ba7b96
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
ba7b96
---
ba7b96
 alsactl/state.c | 3 ++-
ba7b96
 1 file changed, 2 insertions(+), 1 deletion(-)
ba7b96
ba7b96
diff --git a/alsactl/state.c b/alsactl/state.c
ba7b96
index 439e1f8..adbd13f 100644
ba7b96
--- a/alsactl/state.c
ba7b96
+++ b/alsactl/state.c
ba7b96
@@ -1692,7 +1692,8 @@ int load_state(const char *cfgdir, const char *file,
ba7b96
 	}
ba7b96
 	err = finalerr ? finalerr : snd_card_iterator_error(&iter);
ba7b96
 out:
ba7b96
-	snd_config_delete(config);
ba7b96
+	if (config)
ba7b96
+		snd_config_delete(config);
ba7b96
 	snd_config_update_free_global();
ba7b96
 	return err;
ba7b96
 }
ba7b96
-- 
ba7b96
2.30.2
ba7b96
ba7b96
ba7b96
From 6a0d13ddb2b2afb450f3404d3cbaa56253bdcab2 Mon Sep 17 00:00:00 2001
ba7b96
From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@gmail.com>
ba7b96
Date: Thu, 3 Jun 2021 16:07:10 +0200
ba7b96
Subject: [PATCH 12/16] utils.c: Include limits.h explicitly to fix build on
ba7b96
 musl
ba7b96
MIME-Version: 1.0
ba7b96
Content-Type: text/plain; charset=UTF-8
ba7b96
Content-Transfer-Encoding: 8bit
ba7b96
ba7b96
Fixes:
ba7b96
| ../../alsa-utils-1.2.5/alsactl/utils.c: In function 'snd_card_clean_cfgdir':
ba7b96
| ../../alsa-utils-1.2.5/alsactl/utils.c:309:19: error: 'PATH_MAX' undeclared (first use in this function)
ba7b96
|   309 |         char path[PATH_MAX];
ba7b96
|       |                   ^~~~~~~~
ba7b96
| ../../alsa-utils-1.2.5/alsactl/utils.c:309:19: note: each undeclared identifier is reported only once for each function it appears in
ba7b96
ba7b96
Fixes: https://github.com/alsa-project/alsa-utils/pull/92
ba7b96
Signed-off-by: Andreas Müller <schnitzeltony@gmail.com>
ba7b96
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
ba7b96
---
ba7b96
 alsactl/utils.c | 1 +
ba7b96
 1 file changed, 1 insertion(+)
ba7b96
ba7b96
diff --git a/alsactl/utils.c b/alsactl/utils.c
ba7b96
index fd4a108..a507972 100644
ba7b96
--- a/alsactl/utils.c
ba7b96
+++ b/alsactl/utils.c
ba7b96
@@ -30,6 +30,7 @@
ba7b96
 #include <syslog.h>
ba7b96
 #include <sys/stat.h>
ba7b96
 #include <sys/mman.h>
ba7b96
+#include <limits.h>
ba7b96
 #include "alsactl.h"
ba7b96
 
ba7b96
 int file_map(const char *filename, char **buf, size_t *bufsize)
ba7b96
-- 
ba7b96
2.30.2
ba7b96
ba7b96
ba7b96
From 0e21f4d8643db547dcca1375a4265fce1edc4d51 Mon Sep 17 00:00:00 2001
ba7b96
From: Andrea Piras <andrea.piras.85@gmail.com>
ba7b96
Date: Fri, 29 Nov 2019 03:13:21 +0100
ba7b96
Subject: [PATCH 13/16] added an option to aseqnet to optionally set the midi
ba7b96
 process name
ba7b96
ba7b96
This option allows to run multiple instances of aseqnet without having
ba7b96
to double check the assigned port number, since each one can get spawned
ba7b96
with a unique name.
ba7b96
ba7b96
Fixes: https://github.com/alsa-project/alsa-utils/pull/95
ba7b96
Signed-off-by: Andrea Piras <andrea.piras.85@gmail.com>
ba7b96
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
ba7b96
---
ba7b96
 seq/aseqnet/README.aseqnet |  2 ++
ba7b96
 seq/aseqnet/aseqnet.1      |  3 +++
ba7b96
 seq/aseqnet/aseqnet.c      | 26 ++++++++++++++++++--------
ba7b96
 3 files changed, 23 insertions(+), 8 deletions(-)
ba7b96
ba7b96
diff --git a/seq/aseqnet/README.aseqnet b/seq/aseqnet/README.aseqnet
ba7b96
index bd0b68e..6a627f4 100644
ba7b96
--- a/seq/aseqnet/README.aseqnet
ba7b96
+++ b/seq/aseqnet/README.aseqnet
ba7b96
@@ -50,4 +50,6 @@ The available options are:
ba7b96
   -s addr : explicit read-subscription to the given address
ba7b96
             (client:addr).
ba7b96
   -d addr : explicit write-subscription to the given address.
ba7b96
+  -n name : specify the midi name of the process.
ba7b96
+            Default value is either 'Net Client' or 'Net Server'.
ba7b96
   -v      : verbose mode.
ba7b96
diff --git a/seq/aseqnet/aseqnet.1 b/seq/aseqnet/aseqnet.1
ba7b96
index 2cb6eb7..6ed3911 100644
ba7b96
--- a/seq/aseqnet/aseqnet.1
ba7b96
+++ b/seq/aseqnet/aseqnet.1
ba7b96
@@ -70,6 +70,9 @@ Subscribe to the given address for read automatically.
ba7b96
 .B \-d addr
ba7b96
 Subscribe to the given address for write automatically.
ba7b96
 .TP
ba7b96
+.B \-n name
ba7b96
+Specify the midi name of the process.
ba7b96
+.TP
ba7b96
 .B \-v
ba7b96
 Verbose mode.
ba7b96
 
ba7b96
diff --git a/seq/aseqnet/aseqnet.c b/seq/aseqnet/aseqnet.c
ba7b96
index ebdea0b..e756e82 100644
ba7b96
--- a/seq/aseqnet/aseqnet.c
ba7b96
+++ b/seq/aseqnet/aseqnet.c
ba7b96
@@ -37,7 +37,7 @@ static void usage(void);
ba7b96
 static void init_buf(void);
ba7b96
 static void init_pollfds(void);
ba7b96
 static void close_files(void);
ba7b96
-static void init_seq(char *source, char *dest);
ba7b96
+static void init_seq(char *source, char *dest, char *name);
ba7b96
 static int get_port(char *service);
ba7b96
 static void sigterm_exit(int sig);
ba7b96
 static void init_server(int port);
ba7b96
@@ -87,6 +87,7 @@ static const struct option long_option[] = {
ba7b96
 	{"port", 1, NULL, 'p'},
ba7b96
 	{"source", 1, NULL, 's'},
ba7b96
 	{"dest", 1, NULL, 'd'},
ba7b96
+	{"name", 1, NULL, 'n'},
ba7b96
 	{"help", 0, NULL, 'h'},
ba7b96
 	{"verbose", 0, NULL, 'v'},
ba7b96
 	{"info", 0, NULL, 'i'},
ba7b96
@@ -98,13 +99,14 @@ int main(int argc, char **argv)
ba7b96
 	int c;
ba7b96
 	int port = DEFAULT_PORT;
ba7b96
 	char *source = NULL, *dest = NULL;
ba7b96
+	char *name = NULL;
ba7b96
 
ba7b96
 #ifdef ENABLE_NLS
ba7b96
 	setlocale(LC_ALL, "");
ba7b96
 	textdomain(PACKAGE);
ba7b96
 #endif
ba7b96
 
ba7b96
-	while ((c = getopt_long(argc, argv, "p:s:d:vi", long_option, NULL)) != -1) {
ba7b96
+	while ((c = getopt_long(argc, argv, "p:s:d:n:,vi", long_option, NULL)) != -1) {
ba7b96
 		switch (c) {
ba7b96
 		case 'p':
ba7b96
 			if (isdigit(*optarg))
ba7b96
@@ -118,6 +120,9 @@ int main(int argc, char **argv)
ba7b96
 		case 'd':
ba7b96
 			dest = optarg;
ba7b96
 			break;
ba7b96
+		case 'n':
ba7b96
+			name = optarg;
ba7b96
+			break;
ba7b96
 		case 'v':
ba7b96
 			verbose++;
ba7b96
 			break;
ba7b96
@@ -134,7 +139,7 @@ int main(int argc, char **argv)
ba7b96
 	signal(SIGTERM, sigterm_exit);
ba7b96
 
ba7b96
 	init_buf();
ba7b96
-	init_seq(source, dest);
ba7b96
+	init_seq(source, dest, name);
ba7b96
 
ba7b96
 	if (optind >= argc) {
ba7b96
 		server_mode = 1;
ba7b96
@@ -170,6 +175,7 @@ static void usage(void)
ba7b96
 	printf(_("  -p,--port # : specify TCP port (digit or service name)\n"));
ba7b96
 	printf(_("  -s,--source addr : read from given addr (client:port)\n"));
ba7b96
 	printf(_("  -d,--dest addr : write to given addr (client:port)\n"));
ba7b96
+	printf(_("  -n,--name value : use a specific midi process name\n"));
ba7b96
 	printf(_("  -v, --verbose : print verbose messages\n"));
ba7b96
 	printf(_("  -i, --info : print certain received events\n"));
ba7b96
 }
ba7b96
@@ -223,7 +229,7 @@ static void close_files(void)
ba7b96
 /*
ba7b96
  * initialize sequencer
ba7b96
  */
ba7b96
-static void init_seq(char *source, char *dest)
ba7b96
+static void init_seq(char *source, char *dest, char* name)
ba7b96
 {
ba7b96
 	snd_seq_addr_t addr;
ba7b96
 	int err, counti, counto;
ba7b96
@@ -252,10 +258,14 @@ static void init_seq(char *source, char *dest)
ba7b96
 	snd_seq_nonblock(handle, 1);
ba7b96
 
ba7b96
 	/* set client info */
ba7b96
-	if (server_mode)
ba7b96
-		snd_seq_set_client_name(handle, "Net Server");
ba7b96
-	else
ba7b96
-		snd_seq_set_client_name(handle, "Net Client");
ba7b96
+	if (name)
ba7b96
+		snd_seq_set_client_name(handle, name);
ba7b96
+	else {
ba7b96
+		if (server_mode)
ba7b96
+			snd_seq_set_client_name(handle, "Net Server");
ba7b96
+		else
ba7b96
+			snd_seq_set_client_name(handle, "Net Client");
ba7b96
+	}
ba7b96
 
ba7b96
 	/* create a port */
ba7b96
 	seq_port = snd_seq_create_simple_port(handle, "Network",
ba7b96
-- 
ba7b96
2.30.2
ba7b96
ba7b96
ba7b96
From f35b66d8f1c5e3c551981723ed242e48c62ad97f Mon Sep 17 00:00:00 2001
ba7b96
From: Jaroslav Kysela <perex@perex.cz>
ba7b96
Date: Mon, 14 Jun 2021 12:02:35 +0200
ba7b96
Subject: [PATCH 14/16] Revert "aplay: try to use 16-bit format to increase
ba7b96
 capture quality"
ba7b96
ba7b96
This reverts commit 0c5948e98a6a8535c89b7bcab13017d7732181c6.
ba7b96
ba7b96
Link: https://github.com/alsa-project/alsa-utils/issues/96
ba7b96
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
ba7b96
---
ba7b96
 aplay/aplay.c | 43 +++++++++----------------------------------
ba7b96
 1 file changed, 9 insertions(+), 34 deletions(-)
ba7b96
ba7b96
diff --git a/aplay/aplay.c b/aplay/aplay.c
ba7b96
index 0b7884e..d89b7df 100644
ba7b96
--- a/aplay/aplay.c
ba7b96
+++ b/aplay/aplay.c
ba7b96
@@ -32,7 +32,6 @@
ba7b96
 #include <malloc.h>
ba7b96
 #include <unistd.h>
ba7b96
 #include <stdlib.h>
ba7b96
-#include <stdbool.h>
ba7b96
 #include <string.h>
ba7b96
 #include <getopt.h>
ba7b96
 #include <fcntl.h>
ba7b96
@@ -95,7 +94,6 @@ enum {
ba7b96
 	VUMETER_STEREO
ba7b96
 };
ba7b96
 
ba7b96
-static snd_pcm_format_t default_format = DEFAULT_FORMAT;
ba7b96
 static char *command;
ba7b96
 static snd_pcm_t *handle;
ba7b96
 static struct {
ba7b96
@@ -470,24 +468,6 @@ static long parse_long(const char *str, int *err)
ba7b96
 	return val;
ba7b96
 }
ba7b96
 
ba7b96
-static void try_to_adjust_default_format_16bit(void)
ba7b96
-{
ba7b96
-	snd_pcm_hw_params_t *params;
ba7b96
-	int err;
ba7b96
-
ba7b96
-	snd_pcm_hw_params_alloca(&params);
ba7b96
-	err = snd_pcm_hw_params_any(handle, params);
ba7b96
-	if (err < 0) {
ba7b96
-		error(_("Broken configuration for this PCM: no configurations available"));
ba7b96
-		prg_exit(EXIT_FAILURE);
ba7b96
-	}
ba7b96
-
ba7b96
-	if (file_type != FORMAT_AU && snd_pcm_hw_params_test_format(handle, params, SND_PCM_FORMAT_S16_LE) == 0)
ba7b96
-		rhwparams.format = default_format = SND_PCM_FORMAT_S16_LE;
ba7b96
-	else if (file_type == FORMAT_AU && snd_pcm_hw_params_test_format(handle, params, SND_PCM_FORMAT_S16_BE) == 0)
ba7b96
-		rhwparams.format = default_format = SND_PCM_FORMAT_S16_BE;
ba7b96
-}
ba7b96
-
ba7b96
 int main(int argc, char *argv[])
ba7b96
 {
ba7b96
 	int duration_or_sample = 0;
ba7b96
@@ -548,7 +528,6 @@ int main(int argc, char *argv[])
ba7b96
 	int do_device_list = 0, do_pcm_list = 0;
ba7b96
 	snd_pcm_info_t *info;
ba7b96
 	FILE *direction;
ba7b96
-	bool user_set_fmt = false;
ba7b96
 
ba7b96
 #ifdef ENABLE_NLS
ba7b96
 	setlocale(LC_ALL, "");
ba7b96
@@ -583,7 +562,7 @@ int main(int argc, char *argv[])
ba7b96
 	}
ba7b96
 
ba7b96
 	chunk_size = -1;
ba7b96
-	rhwparams.format = default_format;
ba7b96
+	rhwparams.format = DEFAULT_FORMAT;
ba7b96
 	rhwparams.rate = DEFAULT_SPEED;
ba7b96
 	rhwparams.channels = 1;
ba7b96
 
ba7b96
@@ -633,7 +612,6 @@ int main(int argc, char *argv[])
ba7b96
 			}
ba7b96
 			break;
ba7b96
 		case 'f':
ba7b96
-			user_set_fmt = true;
ba7b96
 			if (strcasecmp(optarg, "cd") == 0 || strcasecmp(optarg, "cdr") == 0) {
ba7b96
 				if (strcasecmp(optarg, "cdr") == 0)
ba7b96
 					rhwparams.format = SND_PCM_FORMAT_S16_BE;
ba7b96
@@ -866,9 +844,6 @@ int main(int argc, char *argv[])
ba7b96
 		}
ba7b96
 	}
ba7b96
 
ba7b96
-	if (!user_set_fmt)
ba7b96
-		try_to_adjust_default_format_16bit();
ba7b96
-
ba7b96
 	chunk_size = 1024;
ba7b96
 	hwparams = rhwparams;
ba7b96
 
ba7b96
@@ -1089,7 +1064,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size)
ba7b96
 	hwparams.channels = channels;
ba7b96
 	switch (TO_CPU_SHORT(f->bit_p_spl, big_endian)) {
ba7b96
 	case 8:
ba7b96
-		if (hwparams.format != default_format &&
ba7b96
+		if (hwparams.format != DEFAULT_FORMAT &&
ba7b96
 		    hwparams.format != SND_PCM_FORMAT_U8)
ba7b96
 			fprintf(stderr, _("Warning: format is changed to U8\n"));
ba7b96
 		hwparams.format = SND_PCM_FORMAT_U8;
ba7b96
@@ -1099,7 +1074,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size)
ba7b96
 			native_format = SND_PCM_FORMAT_S16_BE;
ba7b96
 		else
ba7b96
 			native_format = SND_PCM_FORMAT_S16_LE;
ba7b96
-		if (hwparams.format != default_format &&
ba7b96
+		if (hwparams.format != DEFAULT_FORMAT &&
ba7b96
 		    hwparams.format != native_format)
ba7b96
 			fprintf(stderr, _("Warning: format is changed to %s\n"),
ba7b96
 				snd_pcm_format_name(native_format));
ba7b96
@@ -1112,7 +1087,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size)
ba7b96
 				native_format = SND_PCM_FORMAT_S24_3BE;
ba7b96
 			else
ba7b96
 				native_format = SND_PCM_FORMAT_S24_3LE;
ba7b96
-			if (hwparams.format != default_format &&
ba7b96
+			if (hwparams.format != DEFAULT_FORMAT &&
ba7b96
 			    hwparams.format != native_format)
ba7b96
 				fprintf(stderr, _("Warning: format is changed to %s\n"),
ba7b96
 					snd_pcm_format_name(native_format));
ba7b96
@@ -1123,7 +1098,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size)
ba7b96
 				native_format = SND_PCM_FORMAT_S24_BE;
ba7b96
 			else
ba7b96
 				native_format = SND_PCM_FORMAT_S24_LE;
ba7b96
-			if (hwparams.format != default_format &&
ba7b96
+			if (hwparams.format != DEFAULT_FORMAT &&
ba7b96
 			    hwparams.format != native_format)
ba7b96
 				fprintf(stderr, _("Warning: format is changed to %s\n"),
ba7b96
 					snd_pcm_format_name(native_format));
ba7b96
@@ -1209,19 +1184,19 @@ static int test_au(int fd, void *buffer)
ba7b96
 	pbrec_count = BE_INT(ap->data_size);
ba7b96
 	switch (BE_INT(ap->encoding)) {
ba7b96
 	case AU_FMT_ULAW:
ba7b96
-		if (hwparams.format != default_format &&
ba7b96
+		if (hwparams.format != DEFAULT_FORMAT &&
ba7b96
 		    hwparams.format != SND_PCM_FORMAT_MU_LAW)
ba7b96
 			fprintf(stderr, _("Warning: format is changed to MU_LAW\n"));
ba7b96
 		hwparams.format = SND_PCM_FORMAT_MU_LAW;
ba7b96
 		break;
ba7b96
 	case AU_FMT_LIN8:
ba7b96
-		if (hwparams.format != default_format &&
ba7b96
+		if (hwparams.format != DEFAULT_FORMAT &&
ba7b96
 		    hwparams.format != SND_PCM_FORMAT_U8)
ba7b96
 			fprintf(stderr, _("Warning: format is changed to U8\n"));
ba7b96
 		hwparams.format = SND_PCM_FORMAT_U8;
ba7b96
 		break;
ba7b96
 	case AU_FMT_LIN16:
ba7b96
-		if (hwparams.format != default_format &&
ba7b96
+		if (hwparams.format != DEFAULT_FORMAT &&
ba7b96
 		    hwparams.format != SND_PCM_FORMAT_S16_BE)
ba7b96
 			fprintf(stderr, _("Warning: format is changed to S16_BE\n"));
ba7b96
 		hwparams.format = SND_PCM_FORMAT_S16_BE;
ba7b96
@@ -2390,7 +2365,7 @@ static void voc_play(int fd, int ofs, char *name)
ba7b96
 			prg_exit(EXIT_FAILURE);
ba7b96
 		}
ba7b96
 	}
ba7b96
-	hwparams.format = default_format;
ba7b96
+	hwparams.format = DEFAULT_FORMAT;
ba7b96
 	hwparams.channels = 1;
ba7b96
 	hwparams.rate = DEFAULT_SPEED;
ba7b96
 	set_params();
ba7b96
-- 
ba7b96
2.30.2
ba7b96
ba7b96
ba7b96
From fc7500c3c7a7d6bfb975a87e23b7544a84da3186 Mon Sep 17 00:00:00 2001
ba7b96
From: Jaroslav Kysela <perex@perex.cz>
ba7b96
Date: Mon, 14 Jun 2021 12:22:08 +0200
ba7b96
Subject: [PATCH 15/16] arecord: Inform users when 8-bit sampling is used on
ba7b96
 tty
ba7b96
ba7b96
When we reverted 0c5948e ("aplay: try to use 16-bit format to
ba7b96
increase capture quality"), we should also handle the original
ba7b96
problem somehow. This code shows a warning with a hint to
ba7b96
the right parameter.
ba7b96
ba7b96
Fixes: https://github.com/alsa-project/alsa-utils/issues/96
ba7b96
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
ba7b96
---
ba7b96
 aplay/aplay.c | 11 ++++++++++-
ba7b96
 1 file changed, 10 insertions(+), 1 deletion(-)
ba7b96
ba7b96
diff --git a/aplay/aplay.c b/aplay/aplay.c
ba7b96
index d89b7df..cc51dcb 100644
ba7b96
--- a/aplay/aplay.c
ba7b96
+++ b/aplay/aplay.c
ba7b96
@@ -525,7 +525,7 @@ int main(int argc, char *argv[])
ba7b96
 	};
ba7b96
 	char *pcm_name = "default";
ba7b96
 	int tmp, err, c;
ba7b96
-	int do_device_list = 0, do_pcm_list = 0;
ba7b96
+	int do_device_list = 0, do_pcm_list = 0, force_sample_format = 0;
ba7b96
 	snd_pcm_info_t *info;
ba7b96
 	FILE *direction;
ba7b96
 
ba7b96
@@ -612,6 +612,7 @@ int main(int argc, char *argv[])
ba7b96
 			}
ba7b96
 			break;
ba7b96
 		case 'f':
ba7b96
+			force_sample_format = 1;
ba7b96
 			if (strcasecmp(optarg, "cd") == 0 || strcasecmp(optarg, "cdr") == 0) {
ba7b96
 				if (strcasecmp(optarg, "cdr") == 0)
ba7b96
 					rhwparams.format = SND_PCM_FORMAT_S16_BE;
ba7b96
@@ -844,6 +845,14 @@ int main(int argc, char *argv[])
ba7b96
 		}
ba7b96
 	}
ba7b96
 
ba7b96
+	if (!force_sample_format &&
ba7b96
+	    isatty(fileno(stdin)) &&
ba7b96
+	    stream == SND_PCM_STREAM_CAPTURE &&
ba7b96
+	    snd_pcm_format_width(rhwparams.format) <= 8)
ba7b96
+		fprintf(stderr, "Warning: Some sources (like microphones) may produce inaudiable results\n"
ba7b96
+				"         with 8-bit sampling. Use '-f' argument to increase resolution\n"
ba7b96
+				"         e.g. '-f S16_LE'.\n");
ba7b96
+
ba7b96
 	chunk_size = 1024;
ba7b96
 	hwparams = rhwparams;
ba7b96
 
ba7b96
-- 
ba7b96
2.30.2
ba7b96
ba7b96