summaryrefslogtreecommitdiff
path: root/src/modules/alsa/alsa-mixer.c
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2020-04-17 14:38:38 +0200
committerTanu Kaskinen <tanuk@iki.fi>2020-06-17 06:06:12 +0000
commit66185274510a079563f30e80109229ede14677bd (patch)
treebfda2344e3b9aa3cfbc3f617dc634c0d4e4f04f2 /src/modules/alsa/alsa-mixer.c
parent1fb449213f30cd40949c010f9a2a4e9d32aef9ec (diff)
alsa: legacy card - set available_group
Create automatically the groups per paths where the similar jacks are used. Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'src/modules/alsa/alsa-mixer.c')
-rw-r--r--src/modules/alsa/alsa-mixer.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index f2fe20057..611e8067b 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -739,6 +739,7 @@ void pa_alsa_path_free(pa_alsa_path *p) {
}
pa_proplist_free(p->proplist);
+ pa_xfree(p->available_group);
pa_xfree(p->name);
pa_xfree(p->description);
pa_xfree(p->description_key);
@@ -4180,6 +4181,51 @@ fail:
return -1;
}
+/* the logic is simple: if we see the jack in multiple paths */
+/* assign all those jacks to one available_group */
+static void mapping_group_available(pa_hashmap *paths)
+{
+ void *state, *state2;
+ pa_alsa_path *p, *p2;
+ pa_alsa_jack *j, *j2;
+ uint32_t num = 1;
+
+ PA_HASHMAP_FOREACH(p, paths, state) {
+ const char *found = NULL;
+ bool has_control = false;
+ PA_LLIST_FOREACH(j, p->jacks) {
+ if (!j->has_control || j->state_plugged == PA_AVAILABLE_NO)
+ continue;
+ has_control = true;
+ j->state_plugged = PA_AVAILABLE_UNKNOWN;
+ PA_HASHMAP_FOREACH(p2, paths, state2) {
+ if (p2 == p)
+ break;
+ PA_LLIST_FOREACH(j2, p->jacks) {
+ if (!j2->has_control || j->state_plugged == PA_AVAILABLE_NO)
+ continue;
+ if (pa_streq(j->name, j2->name)) {
+ j2->state_plugged = PA_AVAILABLE_UNKNOWN;
+ found = p2->available_group;
+ break;
+ }
+ }
+ }
+ if (found)
+ break;
+ }
+ if (!has_control)
+ continue;
+ if (!found) {
+ p->available_group = pa_sprintf_malloc("Legacy %d", num);
+ } else {
+ p->available_group = pa_xstrdup(found);
+ }
+ if (!found)
+ num++;
+ }
+}
+
static void mapping_paths_probe(pa_alsa_mapping *m, pa_alsa_profile *profile,
pa_alsa_direction_t direction, pa_hashmap *used_paths,
pa_hashmap *mixers) {
@@ -4228,6 +4274,8 @@ static void mapping_paths_probe(pa_alsa_mapping *m, pa_alsa_profile *profile,
PA_HASHMAP_FOREACH(p, ps->paths, state)
pa_hashmap_put(used_paths, p, p);
+ mapping_group_available(ps->paths);
+
pa_log_debug("Available mixer paths (after tidying):");
pa_alsa_path_set_dump(ps);
}
@@ -5026,6 +5074,7 @@ static pa_device_port* device_port_alsa_init(pa_hashmap *ports, /* card ports */
pa_device_port_new_data_set_name(&port_data, name);
pa_device_port_new_data_set_description(&port_data, description);
pa_device_port_new_data_set_direction(&port_data, path->direction == PA_ALSA_DIRECTION_OUTPUT ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT);
+ pa_device_port_new_data_set_available_group(&port_data, path->available_group);
p = pa_device_port_new(core, &port_data, sizeof(pa_alsa_port_data));
pa_device_port_new_data_done(&port_data);