有时我的 USB 耳机麦克风会从输入设备列表中消失。重新连接耳机不起作用,但关闭 Pulseaudio 可以:
pulseaudio -k
当 Pulseaudio 重新启动时,我的 USB 耳机会同时显示在输入和输出设备下并且运行正常。
问题是,关闭 Pulseaudio 也会导致所有使用它的应用程序崩溃,或使它们没有声音。这意味着我必须重新启动 Skype、Steam、XChat、任何正在运行的视频播放器(SMPlayer 崩溃)、任何正在运行的游戏等。
有没有办法强制重新加载所有设备而不终止 Pulseaudio 的正在运行的实例?
有趣的是,当我通过重新启动 Pulseaudio 使 USB 耳机工作时,重新连接耳机将只显示输出设备。我必须在连接耳机的情况下再次重新启动 Pulseaudio 才能显示输入设备。
编辑:pavuvontrol
在“配置”下检查:
重新启动 Pulseaudio 后,列表中会出现一个以“+ 数字立体声输入”(或类似名称)结尾的附加配置文件,并且默认被选中。
答案1
我已经为同样的问题苦恼了一段时间,终于有机会研究一下了。事实证明,卸载并重新加载负责音频设备的 Pulseaudio 模块对我来说是可行的。
手动卸载并重新加载模块
在终端窗口中输入命令
pacmd list-cards
并从输出中找到缺少配置文件的音频设备。您可能会得到几张卡,需要找到正确的卡。我的卡如下所示:
[...]
index: 8
name: <alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset>
driver: <module-alsa-card.c>
owner module: 27
properties:
alsa.card = "1"
alsa.card_name = "Logitech USB Headset"
[... more output ...]
[...]
从输出中,查找行“所有者模块“。这是您需要卸载的模块,但您需要先查看它的参数,然后才能重新加载它。输入命令
pacmd list-modules
并找到驱动卡的模块。同样,我的情况中输出的相关部分如下所示(指数火柴所有者模块从输出pacmd 列表卡):
[...]
index: 27
name: <module-alsa-card>
argument: <device_id="1" name="usb-Logitech_Logitech_USB_Headset-00-Headset" card_name="alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1">
used: 2
load once: no
properties:
[... more output ...]
[...]
您将需要模块名称和参数来重新加载它。
要卸载模块,请输入命令(替换模块索引从您的输出中获得适当的值)
pacmd unload-module module-index
要在卸载模块后重新加载,请输入命令
pacmd load-module module-name module-arguments
代替模块名称和模块参数使用来自输出的值pacmd 列表模块. 省略尖括号。
现在应该重新加载模块,如果幸运的话,您的耳机配置文件就回来了。
应用自动化
如果您需要经常重置设备,上述步骤会非常繁琐,因为模块索引会不断变化,您每次都需要查找。我为自己编写了一个 shell 脚本来自动执行最糟糕的操作:
#!/bin/bash
if [ -z "$1" ]; then
echo "Pulseaudio has these cards:"
pacmd list-cards | grep 'name: '
exit 0
fi
MODULE_INDEX=`pacmd list-modules | tac | grep -A 10 -e "argument: .*$1" | grep 'index:' | head -n 1 | cut -d ':' -f 2 | tr -d ' '`
MODULE_NAME=`pacmd list-modules | tac | grep -A 10 -e "argument: .*$1" | grep 'name:' | head -n 1 | cut -d ':' -f 2 | tr -d '<>'`
MODULE_ARGUMENTS=`pacmd list-modules | tac | grep -e "argument: .*$1" | head -n 1 | cut -d ':' -f 2 | tr -d '<>'`
echo "Module index is $MODULE_INDEX"
echo "Module name: $MODULE_NAME"
echo "Module args: $MODULE_ARGUMENTS"
if [ -z "$MODULE_INDEX" ]; then echo "Could not find module index"; exit 0; fi
if [ -z "$MODULE_NAME" ]; then echo "Could not find module name"; exit 0; fi
if [ -z "$MODULE_ARGUMENTS" ]; then echo "Could not find module arguments"; exit 0; fi
echo "Unloading module"
pacmd unload-module $MODULE_INDEX
echo ""
echo "Reloading module"
pacmd load-module $MODULE_NAME $MODULE_ARGUMENTS
echo ""
不带参数运行时,脚本会列出 Pulseaudio 所知道的卡。当卡的一部分名称作为参数给出时,脚本会尝试卸载并重新加载相关的 Pulseaudio 模块。