Ubuntu 20.04 仅通过 HDMI 显示器播放声音

Ubuntu 20.04 仅通过 HDMI 显示器播放声音

我的 ubuntu 桌面无法通过连接到声卡的扬声器播放任何声音。它总是通过 HDMI 显示器播放,就像它是唯一连接的声音播放设备一样。

我具有这些设置,它仍然可以通过 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


更新 :

我在我的一个项目中发现了一个脚本,用于强制声音模拟输出(在兼容的 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 设备

  1. 用于lsusb识别您想要忽略的设备的供应商/产品 ID

    $ lsusb
    Bus 006 Device 003: ID 17e9:4307 DisplayLink LAPDOCK
    # <other devices I don't care about>
    

    ID部分为我们提供了神奇的数字

  2. 创建一个 udev 规则文件,例如/etc/udev/rules.d/80-ignore-audio-cards.rules为脉冲音频设置环境变量。

    对我来说,这看起来像:

    ATTRS{idVendor}=="17e9", ATTRS{idProduct}=="4307", ENV{PULSE_IGNORE}="1"
    

    80-随意选择了文件名的前缀。如果你有任何与 pulseaudio 相关的规则,请确保你的新文件以较低的数字开头

  3. 重新启动以确保其生效

有了 udev 规则,pulseaudio 会完全忽略该设备。


先前的答案:

遇到了同样的问题,给出的答案在重启后对我不起作用。我认为我的问题是卡检测延迟;当 pulseaudio 启动时,它没有看到所有的卡,并且一些组合module-switch-on-connectmodule-switch-on-port-available总是重新设定我的选择。

我通过制作一个解决了这个问题systemd 用户单元pactl set_card_profile "$MY_CARD_NAME" off当我登录时运行。

  1. 找到你不想要的卡的名称;希望这个名字足以告诉你是哪一个:

    $ 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”一直在窃取我的音频。

  2. 创建 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
    
  3. 启用服务: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,我认为这就是我选择它的原因。

相关内容