SHA256
1
0
forked from pool/pulseaudio
pulseaudio/0004-module-alsa-card-Report-available-ports-before-unava.patch
Takashi Iwai 9c5c3888ab Accepting request 340196 from home:tiwai:branches:multimedia:libs
- Fix another alsa-mixer path for dock line out jack (boo#948979):
  0003-alsa-mixer-Add-Dock-Line-Out-jack-handling-to-analog.patch
- Fix the order of ports updates (boo#948979):
  0004-module-alsa-card-Report-available-ports-before-unava.patch

OBS-URL: https://build.opensuse.org/request/show/340196
OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/pulseaudio?expand=0&rev=161
2015-10-21 09:12:10 +00:00

93 lines
3.4 KiB
Diff

From 91313e60a81e96ce976f24c522656c57b4ab94ca Mon Sep 17 00:00:00 2001
From: David Henningsson <david.henningsson@canonical.com>
Date: Tue, 5 May 2015 17:01:13 +0200
Subject: [PATCH] module-alsa-card: Report available ports before unavailable
ones
In case the same jack causes one port to become available and another
one unavailable, the available should be reported first.
This is to avoid unnecessary changes: e g, consider a 'Headphone Jack'
making 'Headphone' available and 'Speaker' unavailable. In case the
unavailable change triggers first, and there is also a currently available
third port (e g 'Digital out'), the routing system might choose to route
to this port because neither of the 'Speaker' and 'Headphone' ports are
available.
Signed-off-by: David Henningsson <david.henningsson@canonical.com>
---
src/modules/alsa/module-alsa-card.c | 31 +++++++++++++++++++++++++------
1 file changed, 25 insertions(+), 6 deletions(-)
--- a/src/modules/alsa/module-alsa-card.c
+++ b/src/modules/alsa/module-alsa-card.c
@@ -304,7 +304,7 @@ static void init_profile(struct userdata
am->source = pa_alsa_source_new(u->module, u->modargs, __FILE__, u->card, am);
}
-static void report_port_state(pa_device_port *p, struct userdata *u) {
+static pa_available_t calc_port_state(pa_device_port *p, struct userdata *u) {
void *state;
pa_alsa_jack *jack;
pa_available_t pa = PA_AVAILABLE_UNKNOWN;
@@ -348,10 +348,14 @@ static void report_port_state(pa_device_
pa = cpa;
}
}
-
- pa_device_port_set_available(p, pa);
+ return pa;
}
+struct temp_port_avail {
+ pa_device_port *port;
+ pa_available_t avail;
+};
+
static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
struct userdata *u = snd_mixer_elem_get_callback_private(melem);
snd_hctl_elem_t *elem = snd_mixer_elem_get_private(melem);
@@ -359,7 +363,7 @@ static int report_jack_state(snd_mixer_e
bool plugged_in;
void *state;
pa_alsa_jack *jack;
- pa_device_port *port;
+ struct temp_port_avail *tp, *tports;
pa_assert(u);
@@ -376,6 +380,8 @@ static int report_jack_state(snd_mixer_e
pa_log_debug("Jack '%s' is now %s", pa_strnull(snd_hctl_elem_get_name(elem)), plugged_in ? "plugged in" : "unplugged");
+ tports = tp = pa_xnew0(struct temp_port_avail, pa_hashmap_size(u->jacks)+1);
+
PA_HASHMAP_FOREACH(jack, u->jacks, state)
if (jack->melem == melem) {
pa_alsa_jack_set_plugged_in(jack, plugged_in);
@@ -388,9 +394,22 @@ static int report_jack_state(snd_mixer_e
/* When not using UCM, we have to do the jack state -> port
* availability mapping ourselves. */
- pa_assert_se(port = jack->path->port);
- report_port_state(port, u);
+ pa_assert_se(tp->port = jack->path->port);
+ tp->avail = calc_port_state(tp->port, u);
+ tp++;
}
+
+ /* Report available ports before unavailable ones: in case port 1 becomes available when port 2 becomes unavailable,
+ this prevents an unnecessary switch port 1 -> port 3 -> port 2 */
+
+ for (tp = tports; tp->port; tp++)
+ if (tp->avail != PA_AVAILABLE_NO)
+ pa_device_port_set_available(tp->port, tp->avail);
+ for (tp = tports; tp->port; tp++)
+ if (tp->avail == PA_AVAILABLE_NO)
+ pa_device_port_set_available(tp->port, tp->avail);
+
+ pa_xfree(tports);
return 0;
}