summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2012-03-19 16:42:10 +0100
committerDavid Henningsson <david.henningsson@canonical.com>2012-03-21 10:35:09 +0100
commit1f97db720bd533a7b367a7d3123a493196125828 (patch)
treedee0eaae0a0726d5508ed49a701e2866f473d475
parent00c3a4958e543a98ae05988b104129d02b596194 (diff)
module-switch-on-port-available: Do not switch profile if current port is available
For switching profiles, we are a little more cautious, only switch from an unavailable port to an available one. Profile switching is mainly used for HDMI/DisplayPort, and this is to avoid switching from analog to HDMI/DP when it becomes available. See http://lists.freedesktop.org/archives/pulseaudio-discuss/2012-March/012991.html and replies for more information. Signed-off-by: David Henningsson <david.henningsson@canonical.com>
-rw-r--r--src/modules/module-switch-on-port-available.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c
index 0a115d32e..f198e4427 100644
--- a/src/modules/module-switch-on-port-available.c
+++ b/src/modules/module-switch-on-port-available.c
@@ -60,8 +60,13 @@ static pa_bool_t try_to_switch_profile(pa_card *card, pa_device_port *port) {
if (best_profile && best_profile->priority >= profile->priority)
continue;
+ if (!card->active_profile) {
+ best_profile = profile;
+ continue;
+ }
+
/* We make a best effort to keep other direction unchanged */
- if (card->active_profile && !port->is_input) {
+ if (!port->is_input) {
if (card->active_profile->n_sources != profile->n_sources)
continue;
@@ -69,7 +74,7 @@ static pa_bool_t try_to_switch_profile(pa_card *card, pa_device_port *port) {
continue;
}
- if (card->active_profile && !port->is_output) {
+ if (!port->is_output) {
if (card->active_profile->n_sinks != profile->n_sinks)
continue;
@@ -77,6 +82,21 @@ static pa_bool_t try_to_switch_profile(pa_card *card, pa_device_port *port) {
continue;
}
+ if (port->is_output) {
+ /* Try not to switch to HDMI sinks from analog when HDMI is becoming available */
+ uint32_t state2;
+ pa_sink *sink;
+ pa_bool_t found_active_port = FALSE;
+ PA_IDXSET_FOREACH(sink, card->sinks, state2) {
+ if (!sink->active_port)
+ continue;
+ if (sink->active_port->available != PA_PORT_AVAILABLE_NO)
+ found_active_port = TRUE;
+ }
+ if (found_active_port)
+ continue;
+ }
+
best_profile = profile;
}