我的 ubuntu 桌面无法通过连接到声卡的扬声器播放任何声音。它总是通过 HDMI 显示器播放,就像它是唯一连接的声音播放设备一样。
当我插入耳机时,系统会在“输出设备”中看到它,但声音仍然通过 HDMI 传输。
当我移除 HDMI 显示器(它是我的辅助显示器)时,声音就可以正常工作。
更新型多巴胺
cat /proc/asound/cards
0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xdf220000 irq 126
1 [NVidia ]: HDA-Intel - HDA NVidia
HDA NVidia at 0xdf080000 irq 17
你能帮我吗?
答案1
尝试一下是否
pavucontrol
让你选择特定的输出如果你不介意两个都 输出 已启用: https://wiki.archlinux.org/index.php/PulseAudio/Examples#Simultaneous_HDMI_and_analog_output(通过以下途径找到https://unix.stackexchange.com/questions/143865/how-to-enable-both-built-in-audio-output-and-hdmi-audio-output-with-pulseaudio)
在alsamixer可能会有一个元素命名
output
或者switch output
类似的东西,让你能够通过静音/取消静音来改变输出(HDMI 也可能被称为 LINE)如果你拥有多张卡,或者导出多个输出端口的卡:https://unix.stackexchange.com/questions/62818/how-can-i-switch-between-different-audio-output-hardware-using-the-shell
如果你有一张卡提供多个输出,这可能是路由问题:https://wiki.gentoo.org/wiki/ALSA#APlay_SPDIF.2FHDMI_output_has_incorrect_speaker_channels
如果你是不幸的你的卡可能自动切换,只将一个声卡导出到系统(例如政府间伙伴关系迷你电脑上的卡)然后它将要总是切割线对于 HDMI
解决方法:获取一些音频提取器,例如:https://www.reichelt.de/4khdmi-audio-extractor-n-vext3470at-p266927.html
更新 :
我在我的一个项目中发现了一个脚本,用于强制声音模拟输出(在兼容的 shellroot
中运行它bash
):
aplay -l|grep Analog|grep -v Digital|sed 's/^card /defaults.pcm.card /g;s/:.\+device /\ndefaults.pcm.device /g'|cut -d":" -f1 > /etc/asound.conf
这将添加永久条目到/etc/asound.conf
答案2
找到了更好的选择
如下所述使用 systemd 在启动时有效,但在将设备插入已经运行的系统时无效。
热插拔时忽略音频和在启动时,udev 规则是更好的选择。
改编自告诉 PulseAudio 使用 udev 忽略 USB 设备:
用于
lsusb
识别您想要忽略的设备的供应商/产品 ID$ lsusb Bus 006 Device 003: ID 17e9:4307 DisplayLink LAPDOCK # <other devices I don't care about>
该
ID
部分为我们提供了神奇的数字创建一个 udev 规则文件,例如
/etc/udev/rules.d/80-ignore-audio-cards.rules
为脉冲音频设置环境变量。对我来说,这看起来像:
ATTRS{idVendor}=="17e9", ATTRS{idProduct}=="4307", ENV{PULSE_IGNORE}="1"
我
80-
随意选择了文件名的前缀。如果你有任何与 pulseaudio 相关的规则,请确保你的新文件以较低的数字开头重新启动以确保其生效
有了 udev 规则,pulseaudio 会完全忽略该设备。
先前的答案:
遇到了同样的问题,给出的答案在重启后对我不起作用。我认为我的问题是卡检测延迟;当 pulseaudio 启动时,它没有看到所有的卡,并且一些组合module-switch-on-connect
和module-switch-on-port-available
总是重新设定我的选择。
我通过制作一个解决了这个问题systemd 用户单元pactl set_card_profile "$MY_CARD_NAME" off
当我登录时运行。
找到你不想要的卡的名称;希望这个名字足以告诉你是哪一个:
$ pactl list cards | grep -E '(Card|Name:)' Card #0 Name: alsa_card.usb-DisplayLink_LAPDOCK_U3D2338486250-02 Card #1 Name: alsa_card.pci-0000_01_00.1 Card #2 Name: alsa_card.usb-Plantronics_Plantronics_Blackwire_5220_Series_2961D11C621649939CED8BF57E910BA5-00 Card #3 Name: alsa_card.usb-HD_Web_Camera_HD_Web_Camera_Ucamera001-02 Card #4 Name: alsa_card.pci-0000_00_1f.3
对我来说,“LAPDOCK”一直在窃取我的音频。
创建 systemd 单元,调用
pactl
并禁用该卡:$ mkdir -p ~/.config/systemd/user $ nano ~/.config/systemd/user/disable-cards.service
添加这些内容,更改行
ExecStart
以引用您想要丢弃的卡片:[Unit] Description=Disable card [Service] Type=simple Restart=on-failure ExecStart=pactl set-card-profile "alsa_card.usb-DisplayLink_LAPDOCK_U3D2338486250-02" off [Install] WantedBy=default.target
启用服务:
systemctl --user enable disable-cards
现在,当您重新启动时,systemd 将继续尝试断开该卡,直到成功为止。systemd
在插入显示器后,可能有更好的配置来运行它;每个设备都显示为一个“单元”(例如在 的输出中systemctl --user
),因此可以改进它以在您插入/拔出东西时工作。
另一种选择是将您的更改/etc/pulse/default.pa
为使用module-switch-on-connect blacklist="REGEX_MATCHING_THE_CARD_NAME"
,但这对我来说不起作用;没有办法自定义module-switch-on-port-available
,我认为这就是我选择它的原因。