diff options
author | Jaroslav Kysela <perex@perex.cz> | 2021-05-24 09:37:13 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2021-05-24 12:14:45 +0200 |
commit | 6a944d1b2a83b02b52c4910571bf894731aa824a (patch) | |
tree | 604bc38a583820f18ccbb0551717ceaace842be8 | |
parent | e3edbf6e3b664aa39215171f562a4cb9dea6ed97 (diff) | |
download | alsa-lib-6a944d1b2a83b02b52c4910571bf894731aa824a.tar.gz |
conf: snd_config_merge() - merge (concat) correctly arrays
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r-- | src/conf.c | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -2176,6 +2176,31 @@ int snd_config_add_before(snd_config_t *before, snd_config_t *child) return 0; } +/* + * append all src items to the end of dst arrray + */ +static int _snd_config_array_merge(snd_config_t *dst, snd_config_t *src, int index) +{ + snd_config_iterator_t si, snext; + int err; + + snd_config_for_each(si, snext, src) { + snd_config_t *sn = snd_config_iterator_entry(si); + char id[16]; + snd_config_remove(sn); + snprintf(id, sizeof(id), "%d", index++); + err = snd_config_set_id(sn, id); + if (err < 0) { + snd_config_delete(sn); + return err; + } + sn->parent = dst; + list_add_tail(&sn->list, &dst->u.compound.fields); + } + snd_config_delete(src); + return 0; +} + /** * \brief In-place merge of two compounds * \param dst[out] Compound handle for the merged contents @@ -2201,13 +2226,16 @@ int snd_config_merge(snd_config_t *dst, snd_config_t *src, int override) { snd_config_iterator_t di, si, dnext, snext; bool found; - int err; + int err, array; assert(dst); if (src == NULL) return 0; if (dst->type != SND_CONFIG_TYPE_COMPOUND || src->type != SND_CONFIG_TYPE_COMPOUND) return -EINVAL; + array = snd_config_is_array(dst); + if (array && snd_config_is_array(src)) + return _snd_config_array_merge(dst, src, array); snd_config_for_each(si, snext, src) { snd_config_t *sn = snd_config_iterator_entry(si); found = false; |