Ajuster le volume via dbus

Sep 09 2020

J'utilise une application (VMWare Workstation) qui détourne les touches multimédias de mon clavier, je souhaite donc utiliser un autre périphérique d'entrée (Elgato Stream Deck) pour envoyer des commandes multimédias génériques telles que `` augmenter le volume '' ou `` pause ''. Je suis capable d'utiliser le stream deck pour envoyer des commandes shell comme xdotool key XF86AudioLowerVolume, et cela fonctionne tant que je suis dans le shell gnome, mais VMWare détourne toujours ces messages si je suis dans une VM. Les commandes de niveau inférieur utilisant des outils tels que wmctrlou dbus-send, d'un autre côté, fonctionnent correctement. Alors, quel serait l' dbus-sendéquivalent des xdotool key XF86Audio*commandes?

Je peux utiliser dbus-monitorpour afficher les événements en appuyant sur les touches multimédias et voir, par exemple:

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"
      )
   ]

pour augmenter le volume. Comment puis-je traduire cela en dbus-sendmessage?

J'ai trouvé cette question il y a longtemps, mais elle semble obsolète. Au moins, cela ne fonctionne pas sur mon système (Ubuntu 20.04):https://stackoverflow.com/questions/2830858/controlling-gnome-volume-using-dbus

Réponses

superstator Sep 10 2020 at 06:22

pulsemixera fini par faire ce dont j'avais besoin. pactlpeut régler le volume, mais ne rapportera pas un niveau en arrière pour l'affichage OSD. Ce script augmente / diminue le volume ou active le son et affiche l'OSD approprié:

#!/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>}"