diff options
author | Jaroslav Kysela <perex@perex.cz> | 2019-11-26 17:35:15 +0100 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2019-11-26 17:35:18 +0100 |
commit | 4c89f4eb905a075971537a11798dea37cf723bdf (patch) | |
tree | 76e2d8fc719339ae0997d87655f2d936462019b4 | |
parent | cf630e4e5478af674fa94d90b6f1971f25babe44 (diff) | |
download | alsa-lib-4c89f4eb905a075971537a11798dea37cf723bdf.tar.gz |
ucm: fix the cdev initialization sequence
The default values must be set before the defaults
UCM sequence is executed.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r-- | src/ucm/main.c | 85 |
1 files changed, 42 insertions, 43 deletions
diff --git a/src/ucm/main.c b/src/ucm/main.c index 078f1fbe..b0b6ffb3 100644 --- a/src/ucm/main.c +++ b/src/ucm/main.c @@ -489,6 +489,45 @@ static int execute_component_seq(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 Import master config and execute the default sequence * \param uc_mgr Use case manager @@ -501,6 +540,9 @@ static int import_master_config(snd_use_case_mgr_t *uc_mgr) err = uc_mgr_import_master_config(uc_mgr); if (err < 0) return err; + err = add_auto_values(uc_mgr); + if (err < 0) + return err; err = execute_sequence(uc_mgr, &uc_mgr->default_list, &uc_mgr->value_list, NULL, NULL); if (err < 0) @@ -882,45 +924,6 @@ 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 @@ -959,10 +962,6 @@ 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; |