summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2021-04-23 17:24:36 +0200
committerJaroslav Kysela <perex@perex.cz>2021-04-23 21:19:34 +0200
commit6ddba54a073050ac55f4dd596d71dc3df4f0cb08 (patch)
tree6b562c38d5ab0eecf9aa0dc37557ced1a8146bd5
parent3e731ff51e5b2bc2cc606151bfc17f1763a524a8 (diff)
downloadalsa-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.h1
-rw-r--r--src/ucm/utils.c17
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;