summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlper Nebi Yasak <alpernebiyasak@gmail.com>2021-06-23 22:43:05 +0300
committerAlper Nebi Yasak <alpernebiyasak@gmail.com>2022-06-28 15:11:55 +0300
commit638574c0b7cafe43149a017cf2090b8eda531826 (patch)
treea5e9b531aa4cbeb64b20f4646cffeec73311eae1
parentaa5ced3887e2190ebd0fa459ab652fff4be46252 (diff)
downloadpulseaudio-638574c0b7cafe43149a017cf2090b8eda531826.tar.gz
alsa-ucm: Split profile creation into verb and profile parts
To support having multiple profiles per UCM verb, split the profile creation into two parts based on whether they should run once for each verb or for each profile (maybe multiple times per verb). Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com> Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
-rw-r--r--src/modules/alsa/alsa-ucm.c60
1 files changed, 42 insertions, 18 deletions
diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c
index 16659e6aa..b174ac807 100644
--- a/src/modules/alsa/alsa-ucm.c
+++ b/src/modules/alsa/alsa-ucm.c
@@ -1802,16 +1802,14 @@ static int ucm_create_profile(
pa_alsa_ucm_config *ucm,
pa_alsa_profile_set *ps,
pa_alsa_ucm_verb *verb,
+ pa_idxset *mappings,
const char *profile_name,
- const char *profile_desc) {
+ const char *profile_desc,
+ unsigned int profile_priority) {
pa_alsa_profile *p;
- pa_alsa_ucm_device *dev;
- pa_alsa_ucm_modifier *mod;
- int i = 0;
- const char *name, *sink, *source;
- unsigned int priority;
- const char *verb_name = pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_NAME);
+ pa_alsa_mapping *map;
+ uint32_t idx;
pa_assert(ps);
@@ -1824,6 +1822,7 @@ static int ucm_create_profile(
p->profile_set = ps;
p->name = pa_xstrdup(profile_name);
p->description = pa_xstrdup(profile_desc);
+ p->priority = profile_priority;
p->ucm_context.verb = verb;
p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
@@ -1832,10 +1831,33 @@ static int ucm_create_profile(
p->supported = true;
pa_hashmap_put(ps->profiles, p->name, p);
+ PA_IDXSET_FOREACH(map, mappings, idx)
+ ucm_add_mapping(p, map);
+
+ pa_alsa_profile_dump(p);
+
+ return 0;
+}
+
+static int ucm_create_verb_profiles(
+ pa_alsa_ucm_config *ucm,
+ pa_alsa_profile_set *ps,
+ pa_alsa_ucm_verb *verb,
+ const char *verb_name,
+ const char *verb_desc) {
+
+ pa_idxset *mappings;
+ pa_alsa_ucm_device *dev;
+ pa_alsa_ucm_modifier *mod;
+ int i = 0;
+ int ret = 0;
+ const char *name, *sink, *source;
+ unsigned int verb_priority;
+
/* TODO: get profile priority from policy management */
- priority = verb->priority;
+ verb_priority = verb->priority;
- if (priority == 0) {
+ if (verb_priority == 0) {
char *verb_cmp, *c;
c = verb_cmp = pa_xstrdup(verb_name);
while (*c) {
@@ -1844,14 +1866,14 @@ static int ucm_create_profile(
}
for (i = 0; verb_info[i].id; i++) {
if (strcasecmp(verb_info[i].id, verb_cmp) == 0) {
- priority = verb_info[i].priority;
+ verb_priority = verb_info[i].priority;
break;
}
}
pa_xfree(verb_cmp);
}
- p->priority = priority;
+ mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
PA_LLIST_FOREACH(dev, verb->devices) {
pa_alsa_jack *jack;
@@ -1865,9 +1887,9 @@ static int ucm_create_profile(
ucm_create_mapping(ucm, ps, dev, verb_name, name, sink, source);
if (dev->playback_mapping)
- ucm_add_mapping(p, dev->playback_mapping);
+ pa_idxset_put(mappings, dev->playback_mapping, NULL);
if (dev->capture_mapping)
- ucm_add_mapping(p, dev->capture_mapping);
+ pa_idxset_put(mappings, dev->capture_mapping, NULL);
jack = ucm_get_jack(ucm, dev);
if (jack)
@@ -1923,14 +1945,16 @@ static int ucm_create_profile(
ucm_create_mapping_for_modifier(ucm, ps, mod, verb_name, name, source, false);
if (mod->playback_mapping)
- ucm_add_mapping(p, mod->playback_mapping);
+ pa_idxset_put(mappings, mod->playback_mapping, NULL);
if (mod->capture_mapping)
- ucm_add_mapping(p, mod->capture_mapping);
+ pa_idxset_put(mappings, mod->capture_mapping, NULL);
}
- pa_alsa_profile_dump(p);
+ ret = ucm_create_profile(ucm, ps, verb, mappings, verb_name, verb_desc, verb_priority);
- return 0;
+ pa_idxset_free(mappings, NULL);
+
+ return ret;
}
static void mapping_init_eld(pa_alsa_mapping *m, snd_pcm_t *pcm)
@@ -2138,7 +2162,7 @@ pa_alsa_profile_set* pa_alsa_ucm_add_profile_set(pa_alsa_ucm_config *ucm, pa_cha
continue;
}
- ucm_create_profile(ucm, ps, verb, verb_name, verb_desc);
+ ucm_create_verb_profiles(ucm, ps, verb, verb_name, verb_desc);
}
ucm_probe_profile_set(ucm, ps);