blog.vararu.org

Pause media when unplugging headphones on Linux


I've had a couple of unfortunate accidents where I removed my headphones from my laptop only to have the entire cafe/coworking/airplane cabin rudely introduced to my (patrician) music tastes.

To work around this, you can use a combination of acpid and playerctl or dbus:

$ yay -S acpid playerctl

playerctl is just a convenience wrapper for MPRIS media events. You can skip installing it if you prefer the long dbus-send commands that are listed in the wiki.

acpid is a daemon that outputs messages whenever things happen relating to power or various buttons/lids on your device:

$ acpi_listen
battery PNP0C0A:00 00000080 00000001
cd/play CDPLAY 00000080 00000000 K
cd/play CDPLAY 00000080 00000000 K
jack/headphone HEADPHONE unplug
jack/headphone HEADPHONE plug
jack/headphone HEADPHONE unplug
jack/headphone HEADPHONE plug
button/lid LID close
button/lid LID open
battery PNP0C0A:00 00000080 00000001

To subscribe to these events and run scripts whenever one occurs, you can create a file in /etc/acpi/events, for example:

$ sudo vim /etc/acpi/events/stop-music-when-headphones-unplug
event=jack/headphone HEADPHONE unplug
action=su - USER -c "env DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus playerctl pause"

For a dbus related command like playerctl, you'll have to su - YOUR_USER and also export the display session and the DBUS_SESSION_BUS_ADDRESS.

Start acpid:

$ sudo systemctl enable --now acpid

And that should be it, when you unplug your headphones journalctl -fu acpid should show a message:

Apr 16 16:11:30 fwk su[373192]: (to deity) root on none
Apr 16 16:11:30 fwk su[373192]: pam_unix(su-l:session): session opened for user deity(uid=1000) by (uid=0)
Apr 16 16:11:30 fwk su[373192]: pam_unix(su-l:session): session closed for user deity
Apr 16 16:11:30 fwk root[373220]: ACPI group/action undefined: jack/headphone / HEADPHONE