diff options
author | Jaroslav Kysela <perex@perex.cz> | 2021-12-09 10:15:29 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2021-12-09 10:15:47 +0100 |
commit | 4b22871ee5a3bbc8eef7039bfc8db5e65ff3895f (patch) | |
tree | afdb5c1f650c053cc6c288a2ccbdaddf94f736f2 | |
parent | f44c94f24c2422c5ee1c4c58253ec17412b248a9 (diff) | |
download | alsa-lib-4b22871ee5a3bbc8eef7039bfc8db5e65ff3895f.tar.gz |
conf: fix the device parsing when arguments has no defaults
The commit bf528b90 sets the value to an empty string which causes
these errors:
pcm_hw.c: Invalid type for device
pcm_hw.c: Invalid type for subdevice
When device arguments (@args) have no default values set,
the field must be skipped to keep the compatibility.
BugLink: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1246
Fixes: https://github.com/alsa-project/alsa-lib/issues/199
Fixes: bf528b90 ("conf: add possibility to evaluate simple integer math expressions")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r-- | src/conf.c | 8 | ||||
-rw-r--r-- | src/confeval.c | 5 |
2 files changed, 11 insertions, 2 deletions
@@ -4994,8 +4994,10 @@ int snd_config_copy(snd_config_t **dst, static int _snd_config_expand_vars(snd_config_t **dst, const char *s, void *private_data) { snd_config_t *val, *vars = private_data; - if (snd_config_search(vars, s, &val) < 0) - return snd_config_make_string(dst, ""); + if (snd_config_search(vars, s, &val) < 0) { + *dst = NULL; + return 0; + } return snd_config_copy(dst, val); } @@ -5060,6 +5062,8 @@ static int _snd_config_expand(snd_config_t *src, err = snd_config_evaluate_string(dst, s, fcn, vars); if (err < 0) return err; + if (*dst == NULL) + return 0; err = snd_config_set_id(*dst, id); if (err < 0) { snd_config_delete(*dst); diff --git a/src/confeval.c b/src/confeval.c index be9ac874..4a6f8c2e 100644 --- a/src/confeval.c +++ b/src/confeval.c @@ -203,6 +203,11 @@ int _snd_eval_string(snd_config_t **dst, const char *s, free(m); if (err < 0) return err; + if (tmp == NULL) { + err = snd_config_imake_integer(&tmp, NULL, 0); + if (err < 0) + return err; + } s = e; } err = _to_integer(op == LEFT ? &left : &right, tmp); |