Отрегулируйте громкость через dbus
Я использую приложение (VMWare Workstation), которое захватывает мультимедийные клавиши на моей клавиатуре, поэтому я хочу использовать другое устройство ввода (Elgato Stream Deck) для отправки общих мультимедийных команд, таких как «увеличение громкости» или «пауза». Я могу использовать потоковую колоду для отправки таких команд оболочки xdotool key XF86AudioLowerVolume, и это работает, пока я нахожусь в оболочке gnome, но VMWare все еще перехватывает эти сообщения, если я нахожусь в виртуальной машине. Команды нижнего уровня, использующие такие инструменты, как wmctrlили dbus-send, с другой стороны, работают нормально. Итак, что было бы dbus-sendэквивалентом xdotool key XF86Audio*команд?
Я могу использовать dbus-monitorдля просмотра событий при нажатии мультимедийных клавиш и видеть, например:
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"
)
]
для увеличения громкости. Как я могу перевести это в dbus-sendсообщение?
Я давно нашел этот вопрос, но, похоже, он устарел. По крайней мере, в моей системе (Ubuntu 20.04) это не работает:https://stackoverflow.com/questions/2830858/controlling-gnome-volume-using-dbus
Ответы
pulsemixerзакончил делать то, что мне нужно. pactlможет установить громкость, но не будет сообщать уровень, который будет отображаться в экранном меню. Этот скрипт увеличивает / уменьшает громкость или включает отключение звука и показывает соответствующее экранное меню:
#!/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>}"