diff options
author | Jaroslav Kysela <perex@perex.cz> | 2022-06-16 18:03:03 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2022-06-16 18:03:03 +0200 |
commit | 2d56ff8ded18d387c094e0e3b83d68ae3a133101 (patch) | |
tree | 33aab354e53f5e58e78a42397be5c29d3c6c5fa7 | |
parent | 89ee61914756a6f8bcafbad7fb1eca674b0a012f (diff) | |
download | alsa-lib-2d56ff8ded18d387c094e0e3b83d68ae3a133101.tar.gz |
ucm: list also hardware configs (hw:X) in uc_mgr_scan_master_configs() fcn
BugLink: https://github.com/alsa-project/alsa-ucm-conf/issues/168
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r-- | src/ucm/parser.c | 71 |
1 files changed, 58 insertions, 13 deletions
diff --git a/src/ucm/parser.c b/src/ucm/parser.c index 70123068..351b7c40 100644 --- a/src/ucm/parser.c +++ b/src/ucm/parser.c @@ -2880,13 +2880,27 @@ int uc_mgr_scan_master_configs(const char **_list[]) { char filename[PATH_MAX], dfl[PATH_MAX], fn[FILENAME_MAX]; char *env = getenv(ALSA_CONFIG_UCM2_VAR); + snd_use_case_mgr_t *uc_mgr; const char **list, *d_name; + char *s; snd_config_t *cfg, *c; - int i, j, cnt, err; + int i, j, cnt, err, cards; long l; ssize_t ss; struct dirent64 **namelist; + i = -1; + cards = 0; + while (1) { + err = snd_card_next(&i); + if (err < 0) + return err; + if (i < 0) + break; + cards++; + } + cards += 4; /* plug-and-play */ + if (env) snprintf(filename, sizeof(filename), "%s/conf.virt.d", env); else @@ -2921,13 +2935,46 @@ int uc_mgr_scan_master_configs(const char **_list[]) } } - list = calloc(1, cnt * 2 * sizeof(char *)); + j = 0; + list = calloc(1, (cards + cnt) * 2 * sizeof(char *)); if (list == NULL) { err = -ENOMEM; goto __err; } - for (i = j = 0; i < cnt; i++) { + i = -1; + while (j / 2 < cards) { + err = snd_card_next(&i); + if (err < 0) + goto __err; + if (i < 0) + break; + snprintf(fn, sizeof(fn), "-hw:%d", i); + err = snd_use_case_mgr_open(&uc_mgr, fn); + if (err == -ENOENT || err == -ENXIO) + continue; + if (err < 0) { + uc_error("Unable to open '%s': %s", fn, snd_strerror(err)); + goto __err; + } + err = snd_use_case_get(uc_mgr, "comment", (const char **)&s); + if (err < 0) { + err = snd_card_get_longname(i, &s); + if (err < 0) + goto __err; + } + snd_use_case_mgr_close(uc_mgr); + list[j] = strdup(fn + 1); + if (list[j] == NULL) { + free(s); + err = -ENOMEM; + goto __err; + } + list[j + 1] = s; + j += 2; + } + + for (i = 0; i < cnt; i++) { d_name = namelist[i]->d_name; @@ -2984,23 +3031,21 @@ int uc_mgr_scan_master_configs(const char **_list[]) } j += 2; } - err = j; + err = 0; __err: - for (i = 0; i < cnt; i++) { + for (i = 0; i < cnt; i++) free(namelist[i]); - if (err < 0) { + free(namelist); + if (err < 0) { + for (i = 0; i < j; i++) { free((void *)list[i * 2]); free((void *)list[i * 2 + 1]); } - } - free(namelist); - - if (err >= 0) { - *_list = list; - } else { free(list); + return err; } - return err; + *_list = list; + return j; } |