Stellen Sie die Lautstärke über dbus ein
Ich verwende eine Anwendung (VMWare Workstation), die die Medientasten auf meiner Tastatur missbraucht. Daher möchte ich ein anderes Eingabegerät (Elgato Stream Deck) verwenden, um allgemeine Medienbefehle wie "Lautstärke erhöhen" oder "Pause" zu senden. Ich kann das Stream-Deck verwenden, um Shell-Befehle wie zu senden xdotool key XF86AudioLowerVolume, und dies funktioniert, solange ich in der Gnome-Shell bin, aber VMWare entführt diese Nachrichten immer noch, wenn ich in einer VM bin. Befehle auf niedrigerer Ebene, die Tools wie wmctrloder verwenden dbus-send, funktionieren einwandfrei. Was wäre also das dbus-sendÄquivalent zu xdotool key XF86Audio*Befehlen?
Ich kann dbus-monitorEreignisse anzeigen, wenn ich die Medientasten drücke, und zum Beispiel sehen:
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"
)
]
zum Erhöhen der Lautstärke. Wie kann ich das in eine dbus-sendNachricht übersetzen?
Ich habe diese Frage vor langer Zeit gefunden, aber sie scheint veraltet zu sein. Zumindest funktioniert es auf meinem System nicht (Ubuntu 20.04):https://stackoverflow.com/questions/2830858/controlling-gnome-volume-using-dbus
Antworten
pulsemixerAm Ende tat ich, was ich brauchte. pactlkann die Lautstärke einstellen, meldet jedoch keinen Pegel zurück, den das OSD anzeigen soll. Dieses Skript erhöht / verringert die Lautstärke oder schaltet die Stummschaltung um und zeigt das entsprechende OSD an:
#!/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>}"