sink, source: Don't change suspend cause when unlinking
authorTanu Kaskinen <tanuk@iki.fi>
Mon, 10 Jun 2019 11:18:47 +0000 (14:18 +0300)
committerTanu Kaskinen <tanuk@iki.fi>
Mon, 10 Jun 2019 11:21:59 +0000 (14:21 +0300)
See the added comments for why this is necessary.

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/667

src/pulsecore/sink.c
src/pulsecore/source.c

index 9dc9d23..55e9af3 100644 (file)
@@ -767,7 +767,11 @@ void pa_sink_unlink(pa_sink* s) {
     }
 
     if (linked)
-        sink_set_state(s, PA_SINK_UNLINKED, 0);
+        /* It's important to keep the suspend cause unchanged when unlinking,
+         * because if we remove the SESSION suspend cause here, the alsa sink
+         * will sync its volume with the hardware while another user is
+         * active, messing up the volume for that other user. */
+        sink_set_state(s, PA_SINK_UNLINKED, s->suspend_cause);
     else
         s->state = PA_SINK_UNLINKED;
 
index 854b07e..855d3de 100644 (file)
@@ -708,7 +708,11 @@ void pa_source_unlink(pa_source *s) {
     }
 
     if (linked)
-        source_set_state(s, PA_SOURCE_UNLINKED, 0);
+        /* It's important to keep the suspend cause unchanged when unlinking,
+         * because if we remove the SESSION suspend cause here, the alsa
+         * source will sync its volume with the hardware while another user is
+         * active, messing up the volume for that other user. */
+        source_set_state(s, PA_SOURCE_UNLINKED, s->suspend_cause);
     else
         s->state = PA_SOURCE_UNLINKED;