conf: fix load_for_all_cards() - do not merge the card specific contents
Some checks are pending
Build alsa-lib / fedora_latest_build (push) Waiting to run
Build alsa-lib / ubuntu_last_build (push) Waiting to run

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2025-09-18 11:49:37 +02:00
parent eeca04741d
commit eda76146c5

View file

@ -4109,14 +4109,17 @@ static int config_filename_filter(const struct dirent64 *dirent)
return 0; return 0;
} }
static int config_file_open(snd_config_t *root, const char *filename) static int config_file_open(snd_config_t *root, const char *filename, int merge)
{ {
snd_input_t *in; snd_input_t *in;
int err; int err;
err = snd_input_stdio_open(&in, filename, "r"); err = snd_input_stdio_open(&in, filename, "r");
if (err >= 0) { if (err >= 0) {
err = snd_config_load(root, in); if (merge)
err = snd_config_load(root, in);
else
err = snd_config_load_override(root, in);
snd_input_close(in); snd_input_close(in);
if (err < 0) if (err < 0)
SNDERR("%s may be old or corrupted: consider to remove or fix it", filename); SNDERR("%s may be old or corrupted: consider to remove or fix it", filename);
@ -4126,7 +4129,7 @@ static int config_file_open(snd_config_t *root, const char *filename)
return err; return err;
} }
static int config_file_load(snd_config_t *root, const char *fn, int errors) static int config_file_load(snd_config_t *root, const char *fn, int errors, int merge)
{ {
struct stat64 st; struct stat64 st;
struct dirent64 **namelist; struct dirent64 **namelist;
@ -4139,7 +4142,7 @@ static int config_file_load(snd_config_t *root, const char *fn, int errors)
return 1; return 1;
} }
if (!S_ISDIR(st.st_mode)) if (!S_ISDIR(st.st_mode))
return config_file_open(root, fn); return config_file_open(root, fn, merge);
#ifndef DOC_HIDDEN #ifndef DOC_HIDDEN
#if defined(_GNU_SOURCE) && \ #if defined(_GNU_SOURCE) && \
!defined(__NetBSD__) && \ !defined(__NetBSD__) && \
@ -4165,7 +4168,7 @@ static int config_file_load(snd_config_t *root, const char *fn, int errors)
snprintf(filename, sl, "%s/%s", fn, namelist[j]->d_name); snprintf(filename, sl, "%s/%s", fn, namelist[j]->d_name);
filename[sl-1] = '\0'; filename[sl-1] = '\0';
err = config_file_open(root, filename); err = config_file_open(root, filename, merge);
free(filename); free(filename);
} }
free(namelist[j]); free(namelist[j]);
@ -4177,20 +4180,20 @@ static int config_file_load(snd_config_t *root, const char *fn, int errors)
return 0; return 0;
} }
static int config_file_load_user(snd_config_t *root, const char *fn, int errors) static int config_file_load_user(snd_config_t *root, const char *fn, int errors, int merge)
{ {
char *fn2; char *fn2;
int err; int err;
err = snd_user_file(fn, &fn2); err = snd_user_file(fn, &fn2);
if (err < 0) if (err < 0)
return config_file_load(root, fn, errors); return config_file_load(root, fn, errors, merge);
err = config_file_load(root, fn2, errors); err = config_file_load(root, fn2, errors, merge);
free(fn2); free(fn2);
return err; return err;
} }
static int config_file_load_user_all(snd_config_t *_root, snd_config_t *_file, int errors) static int config_file_load_user_all(snd_config_t *_root, snd_config_t *_file, int errors, int merge)
{ {
snd_config_t *file = _file, *root = _root, *n; snd_config_t *file = _file, *root = _root, *n;
char *name, *name2, *remain, *rname = NULL; char *name, *name2, *remain, *rname = NULL;
@ -4221,7 +4224,7 @@ static int config_file_load_user_all(snd_config_t *_root, snd_config_t *_file, i
*remain = '\0'; *remain = '\0';
remain += 3; remain += 3;
} }
err = config_file_load_user(root, name2, errors); err = config_file_load_user(root, name2, errors, merge);
if (err < 0) if (err < 0)
goto _err; goto _err;
if (err == 0) /* first hit wins */ if (err == 0) /* first hit wins */
@ -4270,7 +4273,7 @@ int snd_config_hook_load(snd_config_t *root, snd_config_t *config, snd_config_t
{ {
snd_config_t *n; snd_config_t *n;
snd_config_iterator_t i, next; snd_config_iterator_t i, next;
int err, idx = 0, errors = 1, hit; int err, idx = 0, errors = 1, merge = 1, hit;
assert(root && dst); assert(root && dst);
if ((err = snd_config_search(config, "errors", &n)) >= 0) { if ((err = snd_config_search(config, "errors", &n)) >= 0) {
@ -4280,6 +4283,10 @@ int snd_config_hook_load(snd_config_t *root, snd_config_t *config, snd_config_t
return errors; return errors;
} }
} }
/* special case, we know the card number (may be multiple times) */
if (private_data && snd_config_search(private_data, "integer", &n) >= 0) {
merge = 0;
}
if ((err = snd_config_search(config, "files", &n)) < 0) { if ((err = snd_config_search(config, "files", &n)) < 0) {
SNDERR("Unable to find field files in the pre-load section"); SNDERR("Unable to find field files in the pre-load section");
return -EINVAL; return -EINVAL;
@ -4292,6 +4299,7 @@ int snd_config_hook_load(snd_config_t *root, snd_config_t *config, snd_config_t
SNDERR("Invalid type for field filenames"); SNDERR("Invalid type for field filenames");
goto _err; goto _err;
} }
do { do {
hit = 0; hit = 0;
snd_config_for_each(i, next, n) { snd_config_for_each(i, next, n) {
@ -4305,7 +4313,7 @@ int snd_config_hook_load(snd_config_t *root, snd_config_t *config, snd_config_t
goto _err; goto _err;
} }
if (i == idx) { if (i == idx) {
err = config_file_load_user_all(root, n, errors); err = config_file_load_user_all(root, n, errors, merge);
if (err < 0) if (err < 0)
goto _err; goto _err;
idx++; idx++;