summaryrefslogtreecommitdiff
path: root/src/modules/alsa/alsa-mixer.c
diff options
context:
space:
mode:
authorTanu Kaskinen <tanuk@iki.fi>2020-10-04 13:00:58 +0300
committerArun Raghavan <arun@arunraghavan.net>2020-10-30 16:55:39 +0000
commiteee8292ae13dd6f2310153dff9163875f97b2aec (patch)
tree532c22a0fc1a0aaf2f5ccd8b29ac293b7d2459b2 /src/modules/alsa/alsa-mixer.c
parenta9c6d43b7ca3ffceab31bc3819903ee8c5de70c5 (diff)
alsa-mixer: Set availability groups once per card
Previously they were set once per mapping, which caused the numbering to restart from 1 for every mapping, so ports were incorrectly assigned to the same group.
Diffstat (limited to 'src/modules/alsa/alsa-mixer.c')
-rw-r--r--src/modules/alsa/alsa-mixer.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index aa9a57331..345132f57 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -4276,24 +4276,38 @@ fail:
}
/* the logic is simple: if we see the jack in multiple paths */
-/* assign all those jacks to one availability_group */
-static void mapping_group_available(pa_hashmap *paths)
-{
- void *state, *state2;
- pa_alsa_path *p, *p2;
- pa_alsa_jack *j, *j2;
+/* assign all those paths to one availability_group */
+static void profile_set_set_availability_groups(pa_alsa_profile_set *ps) {
+ pa_dynarray *paths;
+ pa_alsa_path *p;
+ void *state;
+ unsigned idx1;
uint32_t num = 1;
- PA_HASHMAP_FOREACH(p, paths, state) {
+ /* Merge ps->input_paths and ps->output_paths into one dynarray. */
+ paths = pa_dynarray_new(NULL);
+ PA_HASHMAP_FOREACH(p, ps->input_paths, state)
+ pa_dynarray_append(paths, p);
+ PA_HASHMAP_FOREACH(p, ps->output_paths, state)
+ pa_dynarray_append(paths, p);
+
+ PA_DYNARRAY_FOREACH(p, paths, idx1) {
+ pa_alsa_jack *j;
const char *found = NULL;
bool has_control = false;
+
PA_LLIST_FOREACH(j, p->jacks) {
+ pa_alsa_path *p2;
+ unsigned idx2;
+
if (!j->has_control || j->state_plugged == PA_AVAILABLE_NO)
continue;
has_control = true;
- PA_HASHMAP_FOREACH(p2, paths, state2) {
+ PA_DYNARRAY_FOREACH(p2, paths, idx2) {
+ pa_alsa_jack *j2;
+
if (p2 == p)
- break;
+ break;
PA_LLIST_FOREACH(j2, p2->jacks) {
if (!j2->has_control || j2->state_plugged == PA_AVAILABLE_NO)
continue;
@@ -4318,6 +4332,8 @@ static void mapping_group_available(pa_hashmap *paths)
if (!found)
num++;
}
+
+ pa_dynarray_free(paths);
}
static void mapping_paths_probe(pa_alsa_mapping *m, pa_alsa_profile *profile,
@@ -4368,8 +4384,6 @@ 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);
}
@@ -5103,6 +5117,8 @@ void pa_alsa_profile_set_probe(
pa_hashmap_free(used_paths);
pa_xfree(probe_order);
+ profile_set_set_availability_groups(ps);
+
ps->probed = true;
}