ปรับระดับเสียงผ่าน dbus
ฉันกำลังใช้แอปพลิเคชัน (VMWare Workstation) ซึ่งจี้แป้นสื่อบนแป้นพิมพ์ของฉันดังนั้นฉันจึงต้องการใช้อุปกรณ์อินพุตอื่น (Elgato Stream Deck) เพื่อส่งคำสั่งสื่อทั่วไปเช่น 'เพิ่มระดับเสียง' หรือ 'หยุดชั่วคราว' ฉันสามารถใช้สตรีมเด็คเพื่อส่งคำสั่งเชลล์xdotool key XF86AudioLowerVolumeได้และใช้งานได้ตราบเท่าที่ฉันอยู่ใน gnome shell แต่ VMWare ยังคงไฮแจ็คข้อความเหล่านั้นหากฉันอยู่ใน VM คำสั่งระดับล่างโดยใช้เครื่องมือเช่น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>}"