如何在不重启Pulseaudio的情况下显示正确的Pulseaudio配置文件?

有时我的USB耳机麦克风会从我的输入设备列表中消失。 重新连接耳机不起作用,但杀死Pulseaudio会:

pulseaudio -k 

当Pulseaudio重新启动时,我的USB耳机会在输入和输出设备下显示,并且工作正常。

问题是杀死Pulseaudio还会崩溃使用它的所有应用程序,或者让它们没有声音。 这意味着我必须重启Skype,Steam,XChat,任何正在运行的video播放器(SMPlayer崩溃),任何正在运行的游戏等。

有没有办法强制重新加载所有设备而不会杀死正在运行的Pulseaudio实例?


有趣的是,当我通过重新启动Pulseaudio让我的USB耳机工作时,重新连接耳机将导致只显示输出设备。 我必须在连接耳机的情况下重新启动Pulseaudio才能显示输入设备。


编辑:在“配置”下检查了pavuvontrol

截图

重新启动Pulseaudio后,列表中会提供以“+ Digital Stereo Input”(或类似内容)结尾的附加配置文件,默认情况下会选中该配置文件。

我一直在遭遇同样的问题,终于有机会看到它。 事实certificate,卸载和重新加载负责音频设备的Pulseaudio模块对我有用。

手动卸载和重新加载模块

在终端窗口中,输入命令

 pacmd list-cards 

并从输出中找到缺少配置文件的音频设备。 你可能会得到几张牌,需要找到合适的牌。 我看起来像这样:

 [...] index: 8 name:  driver:  owner module: 27 properties: alsa.card = "1" alsa.card_name = "Logitech USB Headset" [... more output ...] [...] 

从输出中,查找“ 所有者模块 ”行。 这是您需要卸载的模块,但您需要先查看它的参数,以便重新加载它。 输入命令

 pacmd list-modules 

并找到驱动卡的模块。 同样,在我的情况下输出的相关部分看起来像这样( 索引匹配来自pacmd list-cards输出的所有者模块 ):

 [...] index: 27 name:  argument:  used: 2 load once: no properties: [... more output ...] [...] 

您将需要模块名称和参数来重新加载它。

要卸载模块,请输入命令(将output -index替换为输出中的适当值)

 pacmd unload-module module-index 

要在卸载模块后重新加载模块,请输入命令

 pacmd load-module module-name module-arguments 

module-namemodule-arguments替换为pacmd list-modules输出中的值。 省略尖括号。

现在应该重新加载模块,运气好的话,你的耳机配置文件又回来了。

应用自动化

如果您需要经常重置设备,上述步骤是很多工作,因为模块索引不断变化,您需要每次都查找它。 我为自己写了一个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模块。