diff options
author | Jaroslav Kysela <perex@perex.cz> | 2021-04-23 17:24:36 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2021-04-23 21:19:34 +0200 |
commit | 6ddba54a073050ac55f4dd596d71dc3df4f0cb08 (patch) | |
tree | 6b562c38d5ab0eecf9aa0dc37557ced1a8146bd5 | |
parent | 3e731ff51e5b2bc2cc606151bfc17f1763a524a8 (diff) | |
download | alsa-lib-6ddba54a073050ac55f4dd596d71dc3df4f0cb08.tar.gz |
ucm: fix the local ucm control device name caching
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r-- | src/ucm/ucm_local.h | 1 | ||||
-rw-r--r-- | src/ucm/utils.c | 17 |
2 files changed, 14 insertions, 4 deletions
diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h index 79f1e87e..7dfd24b9 100644 --- a/src/ucm/ucm_local.h +++ b/src/ucm/ucm_local.h @@ -120,6 +120,7 @@ struct ctl_list { snd_ctl_t *ctl; snd_ctl_card_info_t *ctl_info; int slave; + int ucm_group; }; struct ucm_dev_name { diff --git a/src/ucm/utils.c b/src/ucm/utils.c index b212422a..560c58dd 100644 --- a/src/ucm/utils.c +++ b/src/ucm/utils.c @@ -266,16 +266,21 @@ int uc_mgr_open_ctl(snd_use_case_mgr_t *uc_mgr, struct ctl_dev *ctl_dev; snd_ctl_card_info_t *info; const char *id; - int err, card; + int err, card, ucm_group, ucm_offset; snd_ctl_card_info_alloca(&info); + ucm_group = _snd_is_ucm_device(device); + ucm_offset = ucm_group ? 8 : 0; + /* cache lookup */ list_for_each(pos1, &uc_mgr->ctl_list) { ctl_list = list_entry(pos1, struct ctl_list, list); + if (ctl_list->ucm_group != ucm_group) + continue; list_for_each(pos2, &ctl_list->dev_list) { ctl_dev = list_entry(pos2, struct ctl_dev, list); - if (strcmp(ctl_dev->device, device) == 0) { + if (strcmp(ctl_dev->device, device + ucm_offset) == 0) { *ctll = ctl_list; if (!slave) ctl_list->slave = 0; @@ -301,22 +306,26 @@ int uc_mgr_open_ctl(snd_use_case_mgr_t *uc_mgr, /* insert to cache, if just name differs */ list_for_each(pos1, &uc_mgr->ctl_list) { ctl_list = list_entry(pos1, struct ctl_list, list); + if (ctl_list->ucm_group != ucm_group) + continue; if (strcmp(id, snd_ctl_card_info_get_id(ctl_list->ctl_info)) == 0) { card = snd_card_get_index(id); - err = uc_mgr_ctl_add(uc_mgr, &ctl_list, ctl, card, info, device, slave); + err = uc_mgr_ctl_add(uc_mgr, &ctl_list, ctl, card, info, device + ucm_offset, slave); if (err < 0) goto __nomem; snd_ctl_close(ctl); + ctl_list->ucm_group = ucm_group; *ctll = ctl_list; return 0; } } ctl_list = NULL; - err = uc_mgr_ctl_add(uc_mgr, &ctl_list, ctl, -1, info, device, slave); + err = uc_mgr_ctl_add(uc_mgr, &ctl_list, ctl, -1, info, device + ucm_offset, slave); if (err < 0) goto __nomem; + ctl_list->ucm_group = ucm_group; *ctll = ctl_list; return 0; |