Blame SOURCES/0002-sink-source-update-the-default-sink-source-on-port-s.patch

4dfe6a
From 1e13b722545a23699479bb177648f30f7be396ca Mon Sep 17 00:00:00 2001
4dfe6a
From: Tanu Kaskinen <tanuk@iki.fi>
4dfe6a
Date: Sun, 7 May 2017 12:12:39 +0300
4dfe6a
Subject: [PATCH 2/4] sink, source: update the default sink/source on port
4dfe6a
 switches
4dfe6a
4dfe6a
When sinks are compared during the default sink selection, the active
4dfe6a
port's availability is inspected. Therefore, the default sink should be
4dfe6a
updated when the active port changes, because the new port may have
4dfe6a
different availability status than the old port.
4dfe6a
4dfe6a
For example, let's say that a laptop has an analog sink with a speaker
4dfe6a
and a headphone port, and headphones are initially plugged in, so both
4dfe6a
ports can be used[1]. The headphone port is initially the active port.
4dfe6a
There's also a null sink in the system. When the headphones are
4dfe6a
unplugged, the headphone port becomes unavailable, and the null sink
4dfe6a
becomes the new default sink. Then module-switch-on-connect changes the
4dfe6a
analog sink port to speakers. Now the default sink should change back to
4dfe6a
the analog sink, but that doesn't happen without this patch.
4dfe6a
4dfe6a
[1] Actually we currently mark speakers as unavailable when headphones
4dfe6a
are plugged in, but that's not strictly necessary. My example relies on
4dfe6a
both ports being available initially, so the bug can't be reproduced
4dfe6a
with the current mixer configuration.
4dfe6a
---
4dfe6a
 src/pulsecore/sink.c   | 3 +++
4dfe6a
 src/pulsecore/source.c | 3 +++
4dfe6a
 2 files changed, 6 insertions(+)
4dfe6a
4dfe6a
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
4dfe6a
index aa2182220..ebb13c2c9 100644
4dfe6a
--- a/src/pulsecore/sink.c
4dfe6a
+++ b/src/pulsecore/sink.c
4dfe6a
@@ -3355,6 +3355,9 @@ int pa_sink_set_port(pa_sink *s, const char *name, bool save) {
4dfe6a
 
4dfe6a
     pa_sink_set_port_latency_offset(s, s->active_port->latency_offset);
4dfe6a
 
4dfe6a
+    /* The active port affects the default sink selection. */
4dfe6a
+    pa_core_update_default_sink(s->core);
4dfe6a
+
4dfe6a
     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_PORT_CHANGED], s);
4dfe6a
 
4dfe6a
     return 0;
4dfe6a
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
4dfe6a
index 8ce781804..3f0f53b52 100644
4dfe6a
--- a/src/pulsecore/source.c
4dfe6a
+++ b/src/pulsecore/source.c
4dfe6a
@@ -2630,6 +2630,9 @@ int pa_source_set_port(pa_source *s, const char *name, bool save) {
4dfe6a
     s->active_port = port;
4dfe6a
     s->save_port = save;
4dfe6a
 
4dfe6a
+    /* The active port affects the default source selection. */
4dfe6a
+    pa_core_update_default_source(s->core);
4dfe6a
+
4dfe6a
     pa_source_set_port_latency_offset(s, s->active_port->latency_offset);
4dfe6a
 
4dfe6a
     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PORT_CHANGED], s);
4dfe6a
-- 
4dfe6a
2.14.3
4dfe6a