alsa-ucm: Make combination ports have lower priority

Usually, you want to use one input or output at a time: e g,
you expect your speaker to mute when you plug in headphones.

Therefore, the headphones+speaker port should have lower priority
and both headphones and speaker.

A practical formula to do this is 1/x = 1/xa + 1/xb + .. + 1/xn.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
This commit is contained in:
David Henningsson 2013-07-19 16:38:16 +02:00
parent ce21dc4348
commit 908deb136c

View file

@ -655,6 +655,7 @@ static void ucm_add_port_combination(
pa_device_port *port; pa_device_port *port;
int i; int i;
unsigned priority; unsigned priority;
double prio2;
char *name, *desc; char *name, *desc;
const char *dev_name; const char *dev_name;
const char *direction; const char *direction;
@ -668,6 +669,7 @@ static void ucm_add_port_combination(
: pa_sprintf_malloc("Combination port for %s", dev_name); : pa_sprintf_malloc("Combination port for %s", dev_name);
priority = is_sink ? dev->playback_priority : dev->capture_priority; priority = is_sink ? dev->playback_priority : dev->capture_priority;
prio2 = (priority == 0 ? 0 : 1.0/priority);
for (i = 1; i < num; i++) { for (i = 1; i < num; i++) {
char *tmp; char *tmp;
@ -683,10 +685,19 @@ static void ucm_add_port_combination(
pa_xfree(desc); pa_xfree(desc);
desc = tmp; desc = tmp;
/* FIXME: Is this true? */ priority = is_sink ? dev->playback_priority : dev->capture_priority;
priority += (is_sink ? dev->playback_priority : dev->capture_priority); if (priority != 0 && prio2 > 0)
prio2 += 1.0/priority;
} }
/* Make combination ports always have lower priority, and use the formula
1/p = 1/p1 + 1/p2 + ... 1/pn.
This way, the result will always be less than the individual components,
yet higher components will lead to higher result. */
if (num > 1)
priority = prio2 > 0 ? 1.0/prio2 : 0;
port = pa_hashmap_get(ports, name); port = pa_hashmap_get(ports, name);
if (!port) { if (!port) {
pa_device_port_new_data port_data; pa_device_port_new_data port_data;