#!/usr/bin/env bash
#sinks=($(pacmd list-sinks | grep index | \
# awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
sinks=($(pacmd list-sinks | grep index | \
awk '{ if ($1 == "*") print "1"; else print "0" }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
#find active sink
active=0
for i in ${sinks[*]}
do
if [ $i -eq 0 ]
then active=$((active+1))
else break
fi
done
#switch to next sink
swap=$(((active+1)%${#sinks[@]}))
pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done
我所做的不同是 a) 在 for 循环中找到活动接收器。b) 通过将索引增加 1 来切换到下一个接收器。然后我将结果与接收器的数量取模。这确保了例如当有 3 个接收器时,(2+1)%3=0。因此,从接收器索引 2 我们将切换到接收器索引 0。
#!/bin/bash
declare -i sinks=(`pacmd list-sinks | sed -n -e 's/\**[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`)
declare -i sinks_count=${#sinks[*]}
declare -i active_sink_index=`pacmd list-sinks | sed -n -e 's/\*[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`
declare -i next_sink_index=${sinks[0]}
#find the next sink (not always the next index number)
declare -i ord=0
while [ $ord -lt $sinks_count ];
do
echo ${sinks[$ord]}
if [ ${sinks[$ord]} -gt $active_sink_index ] ; then
next_sink_index=${sinks[$ord]}
break
fi
let ord++
done
#change the default sink
pacmd "set-default-sink ${next_sink_index}"
#move all inputs to the new sink
for app in $(pacmd list-sink-inputs | sed -n -e 's/index:[[:space:]]\([[:digit:]]\)/\1/p');
do
pacmd "move-sink-input $app $next_sink_index"
done
#display notification
declare -i ndx=0
pacmd list-sinks | sed -n -e 's/device.description[[:space:]]=[[:space:]]"\(.*\)"/\1/p' | while read line;
do
if [ $(( $ord % $sinks_count )) -eq $ndx ] ; then
notify-send -i notification-audio-volume-high --hint=string:x-canonical-private- synchronous: "Sound output switched to" "$line"
exit
fi
let ndx++
done;
为了从命令行更改默认音频输出设备,您可以使用
pacmd
Pulse Audio 命令行实用程序。我发现今天需要做类似的事情,想要在耳机和扬声器之间切换,两者都插入单独的声卡。这是我为此编写的 shell 脚本:
笔记:
pacmd
这会在实用程序列出的前两个音频输出设备之间进行交换。如果您有两个以上的音频设备并且想换一个不同的设备,您需要将第 7 行的逻辑替换为一些条件。好吧,您可以安装
pavucontrol
,它会在第一个选项卡上显示带有声音设备选择的应用程序,它会为您节省一些精力。但是我认为您真正想要的是将USB耳机标记为默认设备,然后每次插入时,所有声音都会重定向到它,而当您将其拔出时-它会回到扬声器。毫不费力,真的。当然,使用 Applet 切换设备也可以正常工作。但是编写脚本很酷的地方在于它非常快。例如,我将我的放在键盘快捷键 alt+s 上。因此,当我想从耳机切换到扬声器时,我只需要按 alt+s。
反正。安德鲁说:
这就是我所做的。我分享它,以防有人遇到问题:
我所做的不同是 a) 在 for 循环中找到活动接收器。b) 通过将索引增加 1 来切换到下一个接收器。然后我将结果与接收器的数量取模。这确保了例如当有 3 个接收器时,(2+1)%3=0。因此,从接收器索引 2 我们将切换到接收器索引 0。
以这种方式,开关允许向上移动通过可用的接收器。
这个问题已经很老了,但我的回答可能对 GNOME 2 用户仍然有用。我使用PulseAudio Mixer Applet来解决此处描述的确切问题。您可以直接在面板菜单中更改输入和输出设备。这是我找到的最方便的方式。
要循环浏览您的声音设备列表,请使用以下脚本:
所有功劳都来自Ubuntu 论坛的 tsvetan 。
感谢您的脚本!我还添加了一个输入部分(麦克风),以防有人想使用它:
我一直在寻找一种方法来在笔记本电脑上的内置扬声器和插入立体声音响的苹果机场基站之间切换。我决定分配热键来切换。我希望音频首选项窗口弹出一秒钟以直观地确认开关,然后使用 wmctrl 关闭窗口。
(我使用 ctrl+F8 和 ctrl+F9 作为热键,因为我的笔记本电脑上这些键的 Fn 功能是增加和减少音量,所以很明显让 ctrl 功能改变音频输出。)
我使用了以下 2 个(几乎相同)脚本:
第一个更改为苹果基站(我分配给 ctrl+F9),第二个切换回内部扬声器(ctrl+F8)。这假设这些是仅安装的 2 个输出设备。
我在 Andrews 脚本的基础上使用 notify-osd 来宣布它刚刚做了什么。根据您的需要编辑带有名称的行。
我遇到了同样的问题,并为 Ubuntu Unity 桌面编写了一个小指标小程序:
https://github.com/lkettenb/sound-output-switcher
http://www.capslockblog.com/images/misc/Screenshot.png
这是一个小脚本,用于循环当前聚焦窗口的音频接收器:https ://gist.github.com/rif/01ffb5e3eb45d2e4e6ebb4652b3b19ce
需要 pacmd 和 xdotool