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