我正在尝试配置 Openboxrc.xml文件以便一键操作我的声卡。因为我的系统上有多个声卡,所以我必须同时操作多个接收器,所以我使用多个命令分隔&像这样:
<keybind key="XF86AudioRaiseVolumen">
<action name="Execute">
<command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5% & pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5% & pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%</command>
</action>
</keybind>
由于某种原因,这在 rc.xml 中不起作用。谁能帮我?
答案1
您需要将命令放入 shell 脚本中,使该脚本可执行,然后使用该脚本作为命令。
<command>/usr/local/bin/volume_up</command>
的内容/usr/local/bin/volume_up
#!/bin/sh
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5% &
pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5% &
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%
并使其可执行
chmod +x /usr/local/bin/volume_up
原因是 Openbox 没有在 shell 中执行命令元素的内容,而是尝试直接执行它。
来自的文档<command>
:
一个字符串,它是要执行的命令以及要传递给它的任何参数。 “~”波浪号字符将扩展到您的主目录,但命令中不能使用其他 shell 扩展或脚本语法,除非将它们传递给 sh 命令。另外,& 字符必须写成 & 才能正确解析。是 的已弃用名称。
另一个好处是您可以重写脚本来降低音量
#!/bin/sh
change_volume() {
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output "$1"
pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo "$1"
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 "$1"
}
main() {
case "$1" in
up)
change_volume +5%
;;
down)
change_volume -5%
;;
*)
printf "volume <command>\n"
printf " up \n"
printf " down\n"
esac
}
main "$@"
这将保存在下面/usr/local/bin/volume
并像这样使用
<command>/usr/local/bin/volume up</command>
<command>/usr/local/bin/volume down</command>
答案2
如果您不介意顺序以及所有这些或多或少会同时执行的事实,您可以执行以下操作:
<keybind key="XF86AudioRaiseVolumen">
<action name="Execute">
<command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5%</command>
</action>
<action name="Execute">
<command>pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5%</command>
</action>
<action name="Execute">
<command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%</command>
</action>
</keybind>
答案3
我创建了一个绑定,可以增加/减少所有组件的音量,这样您就可以确保所需的组件会受到影响,如果想要禁用某些组件,只需将其静音即可。
<keybind key="XF86AudioRaiseVolume">
<action name="Execute">
<command>bash -c "pactl list | grep -oP 'Sink #\K([0-9]+)' | while read -r i ; do pactl -- set-sink-volume $i +3% ; done"</command>
</action>
</keybind>
<!-- decrease volume -->
<keybind key="XF86AudioLowerVolume">
<action name="Execute">
<command>bash -c "pactl list | grep -oP 'Sink #\K([0-9]+)' | while read -r i ; do pactl -- set-sink-volume $i -3% ; done"</command>
</action>
</keybind>
答案4
我想这对于您的用例来说会更干净、更短:
<keybind key="XF86AudioLowerVolume">
<action name="Execute">
<command>sh -c "pactl list sinks | grep 'Sink #' | cut -d'#' -f2 | xargs -I@ pactl -- set-sink-volume @ -2000"</command>
</action>
</keybind>
<keybind key="XF86AudioRaiseVolume">
<action name="Execute">
<command>sh -c "pactl list sinks | grep 'Sink #' | cut -d'#' -f2 | xargs -I@ pactl -- set-sink-volume @ +2000"</command>
</action>
</keybind>
它将列出所有水槽以及每个增加/减少的音量。例如,当您连接了插孔或蓝牙扬声器时,将会有多个。这正是我正在使用的设置。