[PATCH] sink, source: update the default sink/source on port switches

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When sinks are compared during the default sink selection, the active
port's availability is inspected. Therefore, the default sink should be
updated when the active port changes, because the new port may have
different availability status than the old port.

For example, let's say that a laptop has an analog sink with a speaker
and a headphone port, and headphones are initially plugged in, so both
ports can be used[1]. The headphone port is initially the active port.
There's also a null sink in the system. When the headphones are
unplugged, the headphone port becomes unavailable, and the null sink
becomes the new default sink. Then module-switch-on-connect changes the
analog sink port to speakers. Now the default sink should change back to
the analog sink, but that doesn't happen without this patch.

[1] Actually we currently mark speakers as unavailable when headphones
are plugged in, but that's not strictly necessary. My example relies on
both ports being available initially, so the bug can't be reproduced
with the current mixer configuration.
---
 src/pulsecore/sink.c   | 3 +++
 src/pulsecore/source.c | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 71121ca0b..43dad516a 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -3375,6 +3375,9 @@ int pa_sink_set_port(pa_sink *s, const char *name, bool save) {
 
     pa_sink_set_port_latency_offset(s, s->active_port->latency_offset);
 
+    /* The active port affects the default sink selection. */
+    pa_core_update_default_sink(s->core);
+
     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_PORT_CHANGED], s);
 
     return 0;
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index 15b1eecda..cfbc62688 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -2650,6 +2650,9 @@ int pa_source_set_port(pa_source *s, const char *name, bool save) {
     s->active_port = port;
     s->save_port = save;
 
+    /* The active port affects the default source selection. */
+    pa_core_update_default_source(s->core);
+
     pa_source_set_port_latency_offset(s, s->active_port->latency_offset);
 
     pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_PORT_CHANGED], s);
-- 
2.11.0



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux