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

Hub*_*bro 11 sound usb pulseaudio microphone

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

pulseaudio -k
Run Code Online (Sandbox Code Playgroud)

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

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

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


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


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

截屏

重新启动 Pulseaudio 后,列表中会出现一个以“+ Digital Stereo Input”(或类似内容)结尾的附加配置文件,并默认选中。

小智 10

我已经被同样的问题困扰了一段时间,终于有机会看看它了。事实证明,卸载和重新加载负责音频设备的 Pulseaudio 模块对我有用。

手动卸载和重新加载模块

在终端窗口输入命令

pacmd list-cards
Run Code Online (Sandbox Code Playgroud)

并从输出中找到缺少配置文件的音频设备。您可能会得到几张卡片,并且需要找到正确的一张。我的看起来像这样:

[...]
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 ...]
[...]
Run Code Online (Sandbox Code Playgroud)

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

pacmd list-modules
Run Code Online (Sandbox Code Playgroud)

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

[...]
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 ...]
[...]
Run Code Online (Sandbox Code Playgroud)

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

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

pacmd unload-module module-index
Run Code Online (Sandbox Code Playgroud)

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

pacmd load-module module-name module-arguments
Run Code Online (Sandbox Code Playgroud)

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 ""
Run Code Online (Sandbox Code Playgroud)

当不带参数运行时,脚本会列出 Pulseaudio 知道的卡片。当卡片名称的一部分作为参数给出时,脚本会尝试卸载和重新加载相关的 Pulseaudio 模块。

  • 因为当你这样做时,所有使用pulseaudio的应用程序(以及你的设备)都吓坏了,还需要重新启动,这是一个巨大的痛苦。 (2认同)