Stellen Sie die Lautstärke über dbus ein

Sep 09 2020

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

superstator Sep 10 2020 at 06:22

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>}"