Regola il volume tramite dbus
Sto utilizzando un'applicazione (VMWare Workstation) che dirotta i tasti multimediali sulla mia tastiera, quindi desidero utilizzare un altro dispositivo di input (Elgato Stream Deck) per inviare comandi multimediali generici come "volume su" o "pausa". Sono in grado di utilizzare lo stream deck per inviare comandi di shell come xdotool key XF86AudioLowerVolume, e questo funziona finché sono nella shell di gnome, ma VMWare dirotta ancora quei messaggi se sono in una VM. I comandi di livello inferiore che utilizzano strumenti come wmctrlo dbus-send, d'altra parte, funzionano bene. Allora, quale sarebbe l' dbus-sendequivalente dei xdotool key XF86Audio*comandi?
Posso utilizzare dbus-monitorper visualizzare gli eventi quando si premono i tasti multimediali e vedere, ad esempio:
signal time=1599582032.226007 sender=:1.66 -> destination=:1.96 serial=18241 path=/org/gnome/Shell; interface=org.gnome.Shell; member=AcceleratorActivated
uint32 140
array [
dict entry(
string "device-id"
variant uint32 12
)
dict entry(
string "timestamp"
variant uint32 504924437
)
dict entry(
string "action-mode"
variant uint32 1
)
dict entry(
string "device-node"
variant string "/dev/input/event7"
)
]
per aumentare il volume. Come posso tradurlo in un dbus-sendmessaggio?
Ho trovato questa domanda molto tempo fa, ma sembra obsoleta. Almeno, non funziona sul mio sistema (Ubuntu 20.04):https://stackoverflow.com/questions/2830858/controlling-gnome-volume-using-dbus
Risposte
pulsemixerho finito per fare ciò di cui avevo bisogno. pactlpuò impostare il volume, ma non riporterà un livello indietro per la visualizzazione dell'OSD. Questo script alza / abbassa il volume o attiva / disattiva l'audio e mostra l'OSD appropriato:
#!/usr/bin/env bash
# must be set correctly for pactl to connect
uid=$(id -u) export XDG_RUNTIME_DIR=/run/user/$uid
case "$1" in up ) pulsemixer --change-volume +5 --max-volume 100 ;; down ) pulsemixer --change-volume -5 ;; mute ) pulsemixer --toggle-mute ;; esac # get active levels sink=$(pulsemixer --list-sinks | grep -e "Default$" | cut -d',' -f2 | cut -c8-) vol=$(pulsemixer --get-volume | cut -d' ' -f1)
mute=$(pulsemixer --get-mute) # set osd icon if [ $mute -eq 1 ]; then
icon="audio-volume-muted"
elif [ $vol -lt 33 ]; then icon="audio-volume-low" elif [ $vol -lt 66 ]; then
icon="audio-volume-medium"
else
icon="audio-volume-high"
fi
# format as decimal
if [ $vol -eq 100 ]; then vol="1.0" else vol="0.$vol"
fi
gdbus call --session --dest 'org.gnome.Shell' --object-path '/org/gnome/Shell' --method 'org.gnome.Shell.ShowOSD' "{'icon': <'$icon'>, 'label': <'$sink'>, 'level': <$vol>}"