0

With plain ALSA there is alsa-restore.service which restores soundcard states after system restart (volumes, mute switches, etc.).

I'm interested how to achieve the same with PipeWire/WirePlumber. For some reason after restart my headphone output is muted, and some other settings are reset to some default state.

alsa-restore.service doesn't work, because PipeWire/WirePlumber overwrites the settings when started.

WirePlumber Lua configs are very complex and I'm unable to understand it. I'm asking for help.

1

1 Answer 1

2

Usually, on Linux systems with a graphical desktop user interface, the first program that shows up is the greeter, which renders the login screen. This greeter is executed in a systemd user context, which triggers the startup of user units (services) defined for all users. One of this units is Pipewire, which triggers the startup of WirePlumber.

When WirePlumber starts up, one of the first things it does by default is to restore previously stored routes, which are stored per-user and include volume configuration. If this fails, WirePlumber sets the volume to a default value of 40% for sinks, and 100% for sources.

Therefore, if your greeter is not WirePlumber-aware, it can reset the volume every time the login screen is shown, which is a change that is picked up by the WirePlumber instance for actual users on login, overwriting any previously stored volumes.

It is hard to say without further environment information if this particular problem affects you, but it seems to be a common problem that nevertheless is pretty hard to troubleshoot, so I think it's a possibility worth exploring. In my case, it happened with LightDM. The Debian Wiki has a section on PipeWire dedicated to this problem with SDDM.

Given that a greeter usually does not need to play audio, my preferred solution is to disable PipeWire from running altogether for the greeter user account. To do this, run the following commands on a terminal:

  1. Log in to a systemd session for the greeter user: sudo machinectl shell lightdm@ /bin/sh. Replace lightdm with the user your greeter runs under.
  2. Stop PipeWire and WirePlumber: systemctl --user stop pipewire.service pipewire.socket wireplumber.service wireplumber.socket
  3. Disable PipeWire and WirePlumber: systemctl --user disable pipewire.service pipewire.socket wireplumber.service wireplumber.socket
  4. As an extra safety net, mask PipeWire and WirePlumber: systemctl --user mask pipewire.service pipewire.socket wireplumber.service wireplumber.socket
  5. If all goes well, systemctl --user status wireplumber.service should report that the WirePlumber unit is inactive and masked, and it should not start again even if you repeat step 1. From this point onwards, only actual user logins will cause WirePlumber to start.
2
  • Worked perfectly for me. ALSA volume levels had been reset back to 30% every reboot, so I'd have to fix the volume levels in alsactl, then adjust another in pavucontrol. The hint to check the greeter user's home dir (gdm in my case) led me to be able to fix the greeter's monitor orientation too - sudo cp $HOME/.config/monitors.xml /var/lib/gdm3/.config/monitors.xml. Nice bonus.
    – lyngvi
    Commented Feb 24 at 22:00
  • Worked for me too! My Avantree Leaf had constantly had its volume set to zero after reboot until I followed your instructions to disable pipewire for sddm. Thanks so much for sharing this!
    – 3vi1
    Commented Apr 21 at 17:31

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .