Setup: Dell S3221QS over DisplayPort, audio goes to the monitor from the GPU. KDE's volume keys only touched the PipeWire sink, which is digital attenuation applied before the signal ever leaves the PC. The monitor's own amp gain (DDC/CI VCP 0x62) sat wherever the OSD left it, so pressing volume down did way less than expected.
This daemon listens for kmix's media key events on D-Bus and copies the sink level to the monitor via ddcutil after every press. Plasma keeps ownership of the keys, so the OSD popup and applet slider work like normal -- I did try stealing the bindings outright and fighting kglobalaccel over them, and it loses that fight every time plasmashell restarts. Riding along on the signals is the only approach that survived a relogin.
Works fine on Plasma 6.7 Wayland, should be fine anywhere kmix + PipeWire + ddcutil exist.
monitor-volume-daemon.py->~/.local/bin/, chmod +xmonitor-volume.service->~/.config/systemd/user/monitor-volume->~/.local/bin/, chmod +x (standalone up/down/mute if you ever need it outside the daemon)
needs ddcutil, pactl, and python3-gi.
systemctl --user daemon-reload
systemctl --user enable --now monitor-volume.service
journalctl --user -u monitor-volume.service -f # watch it syncIf your monitor isn't ddcutil display 1, edit DISPLAY_NUM in the daemon.
Every press waits ~350ms first, because plasma-pa applies its own change async and reading the sink any earlier mirrors the previous value (learned that one the hard way: mute set the monitor to 50 and unmute to 0). Rapid keypresses get debounced since a ddcutil write takes about a second anyway. Mute maps to VCP volume 0, unmute restores whatever the sink says.
systemctl --user disable --now monitor-volume.service
rm ~/.local/bin/monitor-volume{,-daemon.py} ~/.config/systemd/user/monitor-volume.service