diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 9dc9d23b0..55e9af3e7 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -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; diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index 854b07e74..855d3de0e 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -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;