通过 dbus 调整音量

通过 dbus 调整音量

我正在使用一个应用程序 (VMWare Workstation),它会劫持我键盘上的媒体键,所以我想使用另一个输入设备 (Elgato Stream Deck) 来发送通用媒体命令,如“调高音量”或“暂停”。我能够使用 stream deck 发送 shell 命令,如 ,只要我在 gnome shell 中,这就可以正常工作,但如果我在 VM 中,VMWare 仍然会劫持这些消息。另一方面,使用或xdotool key XF86AudioLowerVolume等工具的低级命令可以正常工作。那么,什么相当于命令?wmctrldbus-senddbus-sendxdotool 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

答案1

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

相关内容