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