Pulseaudio 接收器在启动时不存在,但稍后可访问

use*_*151 7 pulseaudio ubuntu-18.04

我有一台运行 Ubuntu 18.04 和 i3wm 的笔记本电脑,通过 Thunderbolt 连接到扩展坞和网络摄像头。我希望将默认脉冲音频接收器设置为笔记本电脑内部声卡。因此我有

set-default-sink alsa_output.pci-0000_00_1f.3.analog-stereo
set-default-source alsa_input.pci-0000_00_1f.3.analog-stereo
Run Code Online (Sandbox Code Playgroud)

/etc/pulse/default.pa

这不起作用,启动后默认接收器设置为扩展坞,默认源设置为网络摄像头。脉冲音频告诉我

[pulseaudio] main.c: Source alsa_input.pci-0000_00_1f.3.analog-stereo does not exist.
[pulseaudio] main.c: Sink alsa_output.pci-0000_00_1f.3.analog-stereo does not exist.
Run Code Online (Sandbox Code Playgroud)

启动后重新启动脉冲音频会将默认源和接收器设置为配置中指定的笔记本电脑内部声卡。我该如何调试这个问题?

Gog*_*a70 1

这个问题与编程无关,但模组似乎并不关心,所以……就这样吧。

过去几天我遇到了类似的问题,所以以下是发现的,但你的情况可能有点不同。

首先,我的经验是在 Ubuntu Linux 系统上。脉冲音频在 Ubuntu 上作为用户服务运行,因此以下与 systemd(systemctl、journalctl)相关的命令将包含--user. 如果您的pulseaudio作为系统服务运行,请省略--user命令部分并在前面添加sudo


好的,调试pulseaudio 问题的第一步是检查日志文件。假设您的pulseaudio服务登录到journald,运行以下命令:

journalctl --user -u pulseaudio.service

滚动到最新日志条目的末尾。您正在寻找这样的条目Master sink not found:如果您发现这一点,请在上面查找显示 的条目Card '0' doesn't exist: No such file or directory。如果您看到了这一点,那么您就遇到了与我完全相同的问题。

如果您没有找到表示 的条目Card '0' doesn't exist,但找到了表示 的条目Master sink not found,那么您需要做的可能就是手动指定 中的接收器/etc/pulse/default.pa

要手动指定接收器,请编辑/etc/pulse/default.pasudo nano /etc/pulse/default.pa。您需要添加行来手动指定接收器。这取决于您的硬件,因此请参阅module-alsa-sink 的pulseaudio 文档。该加载模块中有几行default.pa,因此请参考它们进行格式化。

如果您遇到Card '0' not found问题,请继续阅读。

首先,您可能需要继续添加一行load module/etc/pulse/default.pa继续手动指定您的声卡。同样,这是特定于硬件的,因此您需要参考module-alsa-card 的pulseaudio 文档

根据您的情况,手动加载 module-alsa-card 可能足以解决您的问题。如果没有,那么你真的遇到了和我完全相同的情况。恭喜你,我感受到了你的痛苦。

至少根据我的情况,这里发生的情况是,pulseaudio 服务在 Alsa 有机会创建/dev/snd/controlC0设备节点之前就已运行。如果出现这个Card '0' doesn't exist错误,那么根据libasound2的源代码,这个错误是由于libasound2不/dev/snd/controlC0存在而无法打开造成的。我尝试了各种方法修改文件pulseaudio.service以等待此设备节点存在,但无济于事。

最终,我所做的是创建了一个 shell 脚本,其中包含以下代码/etc/pulse/runpulse.sh

#!/bin/bash

while [[ ! -e /dev/snd/controlC0 ]]; do
    sleep 0.5
done

sleep 1

/usr/bin/pulseaudio --daemonize=no --log-target=journal
Run Code Online (Sandbox Code Playgroud)

确保运行sudo chown root.root /etc/pulse/runpulse.shsudo chmod 755 /etc/pulse/runpulse.sh

最后一行是运行pulseaudio 的行,是命令/usr/lib/systemd/user/pulseaudio.service中通常出现的行ExecStartExecStart=将该服务文件中后面的所有内容替换为/etc/pulse/runpulse.sh. 然后,运行systemctl --user daemon-reload

您可能想继续测试该服务是否会启动:systemctl --user restart pulseaudio.service

如果服务成功启动/重新启动(使用 进行检查systemctl --user status pulseaudio.service),则此时继续并重新启动。

希望您的问题现在已经解决,生活美好,您现在可以享受一些甜美的曲调。这是你应得的。

如果这不能解决您的问题,我希望至少能够提供一些有关您的问题的见解以及一些故障排除和/或修复它的方法。祝你好运。