Ajuste o volume via dbus
Estou usando um aplicativo (VMWare Workstation) que sequestra as teclas de mídia no meu teclado, então quero usar outro dispositivo de entrada (Elgato Stream Deck) para enviar comandos de mídia genéricos como 'aumentar o volume' ou 'pausar'. Sou capaz de usar o stream deck para enviar comandos de shell como xdotool key XF86AudioLowerVolume, e isso funciona enquanto estou no shell do gnome, mas o VMWare ainda sequestra essas mensagens se eu estiver em uma VM. Comandos de nível inferior usando ferramentas como wmctrlou dbus-send, por outro lado, funcionam bem. Então, o que seria dbus-sendequivalente a xdotool key XF86Audio*comandos?
Posso usar dbus-monitorpara visualizar eventos ao pressionar as teclas de mídia e ver, por exemplo:
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"
)
]
para aumentar o volume. Como posso traduzir isso em uma dbus-sendmensagem?
Eu encontrei essa pergunta há muito tempo, mas parece estar obsoleta. Pelo menos, não funciona no meu sistema (Ubuntu 20.04):https://stackoverflow.com/questions/2830858/controlling-gnome-volume-using-dbus
Respostas
pulsemixeracabou fazendo o que eu precisava. pactlpode definir o volume, mas não reportará um nível de volta para o OSD exibir. Este script aumenta / diminui o volume ou muda o som e mostra o OSD apropriado:
#!/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>}"