ปรับระดับเสียงผ่าน dbus

Sep 09 2020

ฉันกำลังใช้แอปพลิเคชัน (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

คำตอบ

superstator Sep 10 2020 at 06:22

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