我有一台运行 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
在
/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.
启动后重新启动脉冲音频会将默认源和接收器设置为配置中指定的笔记本电脑内部声卡。 我该如何调试这个问题?
这个问题不是关于编程的,但是模组似乎并不关心,所以......就这样吧。
这几天我遇到了类似的问题,所以下面是我发现的,但你的情况可能有点不同。
首先,我的经验是在 Ubuntu Linux 系统上。 Pulse audio 在 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
。如果你看到了,那么你就遇到了exact和我一样的问题。
如果您没有找到说
Card '0' doesn't exist
的条目,但确实找到了说Master sink not found
的条目,那么您可能需要做的就是在/etc/pulse/default.pa
中手动指定水槽。
要手动指定接收器,请编辑
/etc/pulse/default.pa
:sudo nano /etc/pulse/default.pa
。您需要添加行以手动指定接收器。这取决于您的硬件,因此请参阅 pulseaudio 文档 for module-alsa-sink。 default.pa
中有几行加载模块,因此请参考它们进行格式化。
如果您遇到
Card '0' not found
问题,请继续阅读。
首先,您可能想要继续并在
load module
中添加 /etc/pulse/default.pa
行以继续并手动指定您的声卡。同样,这是特定于硬件的,因此您需要参考 pulseaudio 文档 for module-alsa-card。
根据您的情况,手动加载 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
确保运行
sudo chown root.root /etc/pulse/runpulse.sh
和sudo chmod 755 /etc/pulse/runpulse.sh
.
最后一行,即运行 pulseaudio 的那一行,是通常出现在
/usr/lib/systemd/user/pulseaudio.service
中用于 ExecStart
命令的行。将该服务文件中 ExecStart=
之后的所有内容替换为 /etc/pulse/runpulse.sh
。然后,运行systemctl --user daemon-reload
.
您可能想继续测试服务是否会启动:
systemctl --user restart pulseaudio.service
.
如果服务启动/重启成功(用
systemctl --user status pulseaudio.service
检查),然后继续并在此时重启。
希望你的问题现在解决了,生活美好了,你现在可以享受一些甜美的曲子了。你赚到了。
如果这不能解决您的问题,我希望至少我能够深入了解您的问题可能是什么以及一些故障排除和/或修复它的方法。祝你好运。