mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-02 09:01:46 -05:00
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:
parent
ce21dc4348
commit
908deb136c
1 changed files with 13 additions and 2 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue