You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置PipeWire以阻止自动切换到HDMI音频

如何配置PipeWire以阻止自动切换到HDMI音频

我完全懂这种烦恼——外接显示器一连接或者从休眠唤醒,音频就自动切到HDMI,耳机突然没声音真的很影响体验。针对你用的PipeWire 1.2.3(Gentoo Linux+i3环境),这里有两种精准解决的方案,你可以按需选择:

方案一:彻底阻止HDMI音频自动启用

这个方法会让HDMI音频设备始终处于禁用状态,除非你手动启用它:

  1. 先定位你的HDMI音频设备
    打开终端执行wpctl status,找到输出里Audio/sink分类下的HDMI设备,记下它的完整名称(比如alsa_output.pci-0000_01_00.1.hdmi-stereo),或者直接用*hdmi*通配所有HDMI设备。

  2. 创建用户级PipeWire配置文件
    先确保配置目录存在,执行:

    mkdir -p ~/.config/pipewire/pipewire.conf.d
    

    然后新建配置文件99-disable-hdmi-auto.conf

    nano ~/.config/pipewire/pipewire.conf.d/99-disable-hdmi-auto.conf
    
  3. 添加禁用自动激活的配置
    如果要针对单个HDMI设备,写入:

    context.modules = [
        {   name = libpipewire-module-port-config
            args = {
                # 替换成你实际的HDMI设备名称
                audio.sink.alsa_output.pci-0000_01_00.1.hdmi-stereo.auto-activate = false
            }
        }
    ]
    

    如果要禁用所有HDMI设备,改用通配符:

    context.modules = [
        {   name = libpipewire-module-port-config
            args = {
                audio.sink.*hdmi*.auto-activate = false
            }
        }
    ]
    
  4. 重启PipeWire服务生效
    执行命令重启用户级PipeWire服务:

    systemctl --user restart pipewire pipewire-pulse
    

方案二:设置音频输出优先级(耳机>HDMI>内置扬声器)

如果你不想完全禁用HDMI,只是希望系统优先选择耳机,其次是HDMI,最后是内置扬声器,可以通过WirePlumber(PipeWire的会话管理器)配置优先级:

  1. 创建WirePlumber配置文件
    先确保配置目录存在:

    mkdir -p ~/.config/wireplumber/main.lua.d
    

    新建优先级配置文件50-route-priority.lua

    nano ~/.config/wireplumber/main.lua.d/50-route-priority.lua
    
  2. 写入优先级规则
    把以下内容复制进去,它会给不同设备设置不同优先级数值(数值越高优先级越高):

    -- 给耳机设置最高优先级
    rule = {
        matches = {
            {
                { "node.name", "matches", "alsa_output.*headphones*" },
            },
        },
        apply_properties = {
            ["session.suspend-timeout-seconds"] = 0,
            ["priority.driver"] = 1000,
        },
    }
    table.insert(alsa_monitor.rules, rule)
    
    -- 给HDMI设置中等优先级
    rule = {
        matches = {
            {
                { "node.name", "matches", "alsa_output.*hdmi*" },
            },
        },
        apply_properties = {
            ["session.suspend-timeout-seconds"] = 0,
            ["priority.driver"] = 500,
        },
    }
    table.insert(alsa_monitor.rules, rule)
    
    -- 给内置扬声器设置最低优先级
    rule = {
        matches = {
            {
                { "node.name", "matches", "alsa_output.*speaker*" },
            },
        },
        apply_properties = {
            ["session.suspend-timeout-seconds"] = 0,
            ["priority.driver"] = 100,
        },
    }
    table.insert(alsa_monitor.rules, rule)
    
  3. 重启WirePlumber服务生效
    执行命令:

    systemctl --user restart wireplumber
    

额外注意事项

  • 如果你不确定设备名称,wpctl status的输出里会列出所有音频输出设备,仔细核对名称里的关键词(比如headphoneshdmispeaker)。
  • 推荐使用用户级配置~/.config/下的文件),这样不会影响系统其他用户的设置。
  • 配置生效后,你还可以用wpctl set-default <你的耳机设备名称>手动设置一次默认输出,之后优先级规则会自动维持这个选择。

备注:内容来源于stack exchange,提问作者WGH

火山引擎 最新活动