dbusで音量を調整する
キーボードのメディアキーを乗っ取るアプリケーション(VMWare Workstation)を使用しているので、別の入力デバイス(Elgato Stream Deck)を使用して、「音量を上げる」や「一時停止」などの一般的なメディアコマンドを送信したいと思います。ストリームデッキを使用して、のようなシェルコマンドを送信できます。xdotool key XF86AudioLowerVolumeこれは、gnomeシェルにいる限り機能しますが、VMにいる場合は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音量を設定できますが、OSDが表示するレベルを報告しません。このスクリプトは、音量を上げたり下げたり、ミュートを切り替えたりして、適切なOSDを表示します。
#!/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>}"