mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-31 22:25:35 -04:00
ucm: compound_merge - use snd_config_merge()
It's useful to do the full tree merge (append). Fixes: https://github.com/alsa-project/alsa-ucm-conf/pull/92 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
b623b5dfed
commit
6b72840569
1 changed files with 30 additions and 7 deletions
|
|
@ -108,6 +108,24 @@ static int find_position_node(snd_config_t **res, snd_config_t *dst,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int merge_it(snd_config_t *dst, snd_config_t *n)
|
||||||
|
{
|
||||||
|
snd_config_t *dn;
|
||||||
|
const char *id;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = snd_config_get_id(n, &id);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
err = snd_config_search(dst, id, &dn);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
err = snd_config_merge(dn, n, 0); /* merge / append mode */
|
||||||
|
if (err < 0)
|
||||||
|
snd_config_delete(n);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int compound_merge(const char *id,
|
static int compound_merge(const char *id,
|
||||||
snd_config_t *dst, snd_config_t *src,
|
snd_config_t *dst, snd_config_t *src,
|
||||||
snd_config_t *before, snd_config_t *after)
|
snd_config_t *before, snd_config_t *after)
|
||||||
|
|
@ -133,6 +151,10 @@ static int compound_merge(const char *id,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* direct merge? */
|
||||||
|
if (!_before && !_after)
|
||||||
|
return snd_config_merge(dst, src, 0); /* merge / append mode */
|
||||||
|
|
||||||
if (_before && _after) {
|
if (_before && _after) {
|
||||||
uc_error("defined both before and after identifiers in the If or Include block");
|
uc_error("defined both before and after identifiers in the If or Include block");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
@ -175,19 +197,19 @@ static int compound_merge(const char *id,
|
||||||
}
|
}
|
||||||
if (_before) {
|
if (_before) {
|
||||||
err = snd_config_add_before(_before, n);
|
err = snd_config_add_before(_before, n);
|
||||||
|
if (err == -EEXIST)
|
||||||
|
err = merge_it(dst, n);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
_before = NULL;
|
_before = NULL;
|
||||||
_after = n;
|
_after = n;
|
||||||
} else if (_after) {
|
} else if (_after) {
|
||||||
err = snd_config_add_after(_after, n);
|
err = snd_config_add_after(_after, n);
|
||||||
|
if (err == -EEXIST)
|
||||||
|
err = merge_it(dst, n);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
_after = n;
|
_after = n;
|
||||||
} else {
|
|
||||||
err = snd_config_add(dst, n);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -203,6 +225,7 @@ static int compound_merge(const char *id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
snd_config_delete(src);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -230,16 +253,16 @@ __add:
|
||||||
err = snd_config_add(parent, n);
|
err = snd_config_add(parent, n);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
continue;
|
|
||||||
} else {
|
} else {
|
||||||
err = snd_config_search(parent, id, &parent2);
|
err = snd_config_search(parent, id, &parent2);
|
||||||
if (err == -ENOENT)
|
if (err == -ENOENT)
|
||||||
goto __add;
|
goto __add;
|
||||||
err = compound_merge(id, parent2, n, before, after);
|
err = compound_merge(id, parent2, n, before, after);
|
||||||
if (err < 0)
|
if (err < 0) {
|
||||||
|
snd_config_delete(n);
|
||||||
return err;
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
snd_config_delete(n);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue