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