From 680501c6b4416dc8ed1733b9673974cda56dd625 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 5 Nov 2019 14:21:07 +0100 Subject: [PATCH] ucm: add PlaybackCTL and CaptureCTL default values when they are not set Signed-off-by: Jaroslav Kysela --- src/ucm/main.c | 43 +++++++++++++++++++++++++++++++++ src/ucm/parser.c | 59 ++++++++++++++++++++++++--------------------- src/ucm/ucm_local.h | 2 ++ 3 files changed, 76 insertions(+), 28 deletions(-) diff --git a/src/ucm/main.c b/src/ucm/main.c index 7aaf8588..25c02e1e 100644 --- a/src/ucm/main.c +++ b/src/ucm/main.c @@ -882,6 +882,45 @@ static int set_device(snd_use_case_mgr_t *uc_mgr, return err; } +static int add_auto_value(snd_use_case_mgr_t *uc_mgr, const char *key, char *value) +{ + char *s; + int err; + + err = get_value1(uc_mgr, &value, &uc_mgr->value_list, key); + if (err == -ENOENT) { + s = strdup(value); + if (s == NULL) + return -ENOMEM; + return uc_mgr_add_value(&uc_mgr->value_list, key, s); + } else if (err < 0) { + return err; + } + free(value); + return 0; +} + +static int add_auto_values(snd_use_case_mgr_t *uc_mgr) +{ + struct ctl_list *ctl_list; + const char *id; + char buf[40]; + int err; + + ctl_list = uc_mgr_get_one_ctl(uc_mgr); + if (ctl_list) { + id = snd_ctl_card_info_get_id(ctl_list->ctl_info); + snprintf(buf, sizeof(buf), "hw:%s", id); + err = add_auto_value(uc_mgr, "PlaybackCTL", buf); + if (err < 0) + return err; + err = add_auto_value(uc_mgr, "CaptureCTL", buf); + if (err < 0) + return err; + } + return 0; +} + /** * \brief Init sound card use case manager. * \param uc_mgr Returned use case manager pointer @@ -920,6 +959,10 @@ int snd_use_case_mgr_open(snd_use_case_mgr_t **uc_mgr, goto err; } + err = add_auto_values(mgr); + if (err < 0) + goto err; + *uc_mgr = mgr; return 0; diff --git a/src/ucm/parser.c b/src/ucm/parser.c index 5fbde4d9..ef308868 100644 --- a/src/ucm/parser.c +++ b/src/ucm/parser.c @@ -548,6 +548,26 @@ static int parse_sequence(snd_use_case_mgr_t *uc_mgr, return 0; } +/* + * + */ +int uc_mgr_add_value(struct list_head *base, const char *key, char *val) +{ + struct ucm_value *curr; + + curr = calloc(1, sizeof(struct ucm_value)); + if (curr == NULL) + return -ENOMEM; + curr->name = strdup(key); + if (curr->name == NULL) { + free(curr); + return -ENOMEM; + } + list_add_tail(&curr->list, base); + curr->data = val; + return 0; +} + /* * Parse values. * @@ -564,13 +584,9 @@ static int parse_value(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, struct list_head *base, snd_config_t *cfg) { - struct ucm_value *curr; snd_config_iterator_t i; snd_config_t *n; - char buf[64]; - long l; - long long ll; - double d; + char *s; snd_config_type_t type; int err; @@ -593,35 +609,19 @@ static int parse_value(snd_use_case_mgr_t *uc_mgr ATTRIBUTE_UNUSED, continue; } - /* alloc new value */ - curr = calloc(1, sizeof(struct ucm_value)); - if (curr == NULL) - return -ENOMEM; - list_add_tail(&curr->list, base); - curr->name = strdup(id); - if (curr->name == NULL) - return -ENOMEM; type = snd_config_get_type(n); switch (type) { case SND_CONFIG_TYPE_INTEGER: - snd_config_get_integer(n, &l); - snprintf(buf, sizeof(buf), "%li", l); -__buf: - curr->data = malloc(strlen(buf) + 1); - if (curr->data == NULL) - return -ENOMEM; - strcpy(curr->data, buf); - break; case SND_CONFIG_TYPE_INTEGER64: - snd_config_get_integer64(n, &ll); - snprintf(buf, sizeof(buf), "%lli", ll); - goto __buf; case SND_CONFIG_TYPE_REAL: - snd_config_get_real(n, &d); - snprintf(buf, sizeof(buf), "%-16g", d); - goto __buf; + err = snd_config_get_ascii(n, &s); + if (err < 0) { + uc_error("error: unable to parse value for id '%s': %s!", id, snd_strerror(err)); + return err; + } + break; case SND_CONFIG_TYPE_STRING: - err = parse_string(n, &curr->data); + err = parse_string(n, &s); if (err < 0) { uc_error("error: unable to parse a string for id '%s'!", id); return err; @@ -631,6 +631,9 @@ __buf: uc_error("error: invalid type %i in Value compound '%s'", type, id); return -EINVAL; } + err = uc_mgr_add_value(base, id, s); + if (err < 0) + return err; } return 0; diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h index c0301e62..ba961507 100644 --- a/src/ucm/ucm_local.h +++ b/src/ucm/ucm_local.h @@ -266,6 +266,8 @@ struct ctl_list *uc_mgr_get_one_ctl(snd_use_case_mgr_t *uc_mgr); snd_ctl_t *uc_mgr_get_ctl(snd_use_case_mgr_t *uc_mgr); void uc_mgr_free_ctl_list(snd_use_case_mgr_t *uc_mgr); +int uc_mgr_add_value(struct list_head *base, const char *key, char *val); + int uc_mgr_get_substituted_value(snd_use_case_mgr_t *uc_mgr, char **_rvalue, const char *value); -- 2.47.1