惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Visual Studio Blog
I
InfoQ
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
D
Docker
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
量子位
D
DataBreaches.Net
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hugging Face - Blog
Hugging Face - Blog
J
Java Code Geeks
T
Tailwind CSS Blog
S
Securelist
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
雷峰网
雷峰网
D
Darknet – Hacking Tools, Hacker News & Cyber Security
小众软件
小众软件
Cloudbric
Cloudbric
N
News and Events Feed by Topic
L
LangChain Blog
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
L
LINUX DO - 热门话题
T
The Blog of Author Tim Ferriss
AWS News Blog
AWS News Blog
爱范儿
爱范儿
博客园 - 聂微东
Project Zero
Project Zero
V
Vulnerabilities – Threatpost
PCI Perspectives
PCI Perspectives
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - Franky
Y
Y Combinator Blog
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
AI
AI
The Last Watchdog
The Last Watchdog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
CXSECURITY Database RSS Feed - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
美团技术团队
Google Online Security Blog
Google Online Security Blog
Google DeepMind News
Google DeepMind News
MyScale Blog
MyScale Blog
T
Tor Project blog

Allen Hua 的网络博客

由于 Linux 桌面没有一个好用的天气程序就写了一个跨平台的CheckitoutWeather 给 caesium-image-compressor 图片压缩程序构建了 Linux AppImage v2.8.5 最新版 debian13(debian trixie)安装了nvidia闭源驱动后从x11切换到wayland的方法 山间摩旅追风,偶遇一场绚烂晚霞 最近使用debian系统的一些心得 机械革命无界14Pro笔记本debian forky成功驱动内置扬声器和麦克风 记录 typecho 1.2.0 升级到 1.3.0 过程 开发了一款openwrt插件:文本剪贴板 解决机械革命笔记本内屏高刷240Hz闪屏问题 使用 Java 写了一个局域网端口扫描器 - Allen Hua 的网络博客 openwrt使用外置根extroot机制扩展根分区大小 - Allen Hua 的网络博客 将机场ss节点批量转换成ss字符串链接批量添加到passwall - Allen Hua 的网络博客 给机械革命钛钽plus换屏:NY2换成NZ2 - Allen Hua 的网络博客 记录一次pve宿主机和上面的debian虚机无故down机事件 - Allen Hua 的网络博客 给图床部署cdn腾讯云的edgeone并排查Cache-Control max-age 3600的问题 - Allen Hua 的网络博客 从高山草甸到徽派古村:武功山反穿与皖浙赣自驾行记 - Allen Hua 的网络博客 增程器就是充电宝?别被忽悠了 - Allen Hua 的网络博客 浦口龙虎巷扫街,记录人间真实 博客图片压缩方案更新|AVIF|WebP|MozJPEG|标准JPEG Windows 电脑使用 Obs Studio 录制各个网站视频/桌面画面教程 为typecho博客添加latex支持 新能源汽车之纯电车使用交流慢充和直流快充的充电损耗对比 2025年3月更新全国5A景区名录 2025最新查看小米/红米手机电池健康度和循环次数方法 完美解决 seafile FILE_SERVER_ROOT 配置导致的内网外网不能同时访问和上传下载的问题 纯css实现typecho博客文章文字spoiler剧透效果 我对Typecho Facile主题的一些修改,图片懒加载优化,样式定制 2024年8月我的宜昌 - 重庆 - 川西小环线自驾旅行分享 2022年打卡南京市区人防工程纳凉点 2024年带着A7C2+腾龙28-200 再次来到红山森林动物园 入手a7c2第一个变焦镜头腾龙28-200体验分享 使用 exiftool 方便快捷写入图片的 exif metadata 使用JavaScript抓取易车销量排行榜数据到一个页面上展示 使用JavaScript脚本快速获取B站观看历史记录页面的视频标题和URL 入门三脚架推荐|云腾VCT-668配合索尼A7C2+FE 35mm F1.8 第一次夜景出片 Windows 11 Docker Desktop 更换默认C盘存储路径,释放C盘空间 雨游钟山——雨天带着索尼A7C2去钟山拍照 带上A7C2第一次扫街,分享今天拍的一些片子 再次为尼,买了人生第二台相机——索尼A7C2和FE 35mm F1.8 定焦镜头 更新 link-cleaner v1.1.0 适配linux桌面环境 使用自定义JavaScript脚本功能禁止memos最新版默认打开的链接预览功能 debian 11升级 docker ce 版本和 docker-compose 版本 机械革命无界14 Pro 安装 debian testing/trixie/sid 驱动扬声器,外部耳机,外接显示器过程分享 不借助 mirror 仓库,为docker engine daemon添加 proxy 访问 docker hub,解决国内公开的docker mirror 仓库不再可用了的问题 徒步江苏镇江句容九连尖 macOS 安装 proxychains-ng 并借助局域网 socks5 代理使用 Google Earth Pro 修复一块 18 年 12 月买的二手 4TB 机械硬盘 iCloud 在 Windows 下很流氓,用 taskkill 干掉它 2023 年 12 月 Spotify 彻底被墙,我在比亚迪车机上安装 surfboard 挂代理听歌 利用 proxychains 让 Windows10/11 上的 Google Earth Pro 通过代理正常访问 湖州安吉天荒坪盘山公路和杭州临安浙西天路之旅 Redmi K70 首发开箱和拍照体验 Review Android 13+ 通过 Shizuku + Language Selector 给特定应用设置独立语言 我的 2023 Spotify Wrapped 听歌总结 压缩剪贴板内图片并立即写入剪贴板,减轻服务器存储压力 【Allen Hua 翻唱】山阴路的夏天和一个人的北京 初涉录音设备,记录我购买声卡和麦克风的曲折经历以及第一首翻唱陶喆——流沙 soul power 版本(low quality) 特种兵旅行之马鞍山一日游 给我的 .com 域名续期以及转移域名(GoDaddy 到 Cloudflare) 看《下辈子我再好好过》第三季 使用油猴脚本干掉B站web首页的浏览器插件警告信息 闯进我平静生活的三只猫 在远离中短视频几天之后 [可能是]最好的压缩图片程序,使用 squoosh-cli 批量压缩图片 再次出发,自驾徽州天路和黄山之行 nginx设置referer配置个人图床的防盗链功能 微博注销记 第一次4+2旅行,骑行皖南川藏线 让 rime 输入法用上颜文字 使用 nginx 获取自己的公网 IP 地址 2023 年 618 买了一台机械革命笔记本,但很不愉快 聊聊我晚睡的习惯和早点洗澡悟出来的原因 配置 ShadowsocksR Plus+ 的服务端,在外访问家中服务 部署一个 memos 作为个人微博站点和备忘录 我的听歌软件 Spotify 和网易云的故事 | 导出网易云的歌单再导入到 Spotify 我问 ChatGPT 为何印度人痔疮发病率低 使用 immich 来管理家庭照片 | 升级 immich 1.52.0 添加 typesense 容器 在 OpenWrt 上搭建 nfs server 利用 cron 和 curl 自动模拟登录馒头,防止账号被 ban 更新 Mattermost 服务端版本,由 7.4.0 更新到 7.8.0 获取 Seafile 分享的文件直链 你是科技产品偏执狂吗?一张不同种类互联网用户日常使用产品的分级图片 记录我的 V2EX 账号被封 不通过插件给 Typecho 博客添加图片灯箱功能(fancybox js 实现) 为 Typecho 博客添加 favicon.ico(网页标签小图标) OpenWrt 修改登录页面默认展示的 root 用户名信息,保护隐私 米家智能插座 3 上手初体验 互联网上为了保护隐私我们能做些什么?分享我的想法和我写的 link-cleaner tplink 10280, wan 无法访问 lan 下的 dhcp 主机,换上 padavan 解决两台路由器 lan-wan 级联,两台路由器下面的电脑互访 机械革命自带键盘总是自动乱按,拆机拔掉排线,完美解决烦恼 做了一个 squoosh docker 镜像,写博客贴图直接在本地压缩文件,安全且高效 nginx 常规端口和非常规端口的 http redirect to https 记一次 OpenWrt luci 显示正在“收集数据”,使用公网 IP nginx 反向代理遇到的 Uncaught TypeError: Cannot read properties of null (reading 'wan') 问题 OpenWrt 安装并配置腾讯云动态 dns dnspod tencent ddns 浅谈文件传输/共享协议|内网共享文件协议选择|自建公网文件管理同步和共享方案推荐 解决 webdav 连接 seafile 无法重命名文件等操作造成的 SeafDAV: MOVE returns 502 Bad Gateway 错误 Linux 删除当前目录下的隐藏文件 OpenWrt 安装 4.4.2 版本的 qbittorrent-nox Docker 构建多架构镜像实战 构建 amd64 和 arm64 架构的兰空图床镜像 构建 arm64 架构和 amd64 架构的兰空图床 docker 镜像
MECHREVO WUJIE14 PRO on Linux 声卡完整修复历程
字数:7021 · 2026-06-18 · via Allen Hua 的网络博客
阅读量:50

为了解决我的机械革命无界 14 pro 笔记本在 linux debian testing(forky) 下的自带麦克风、自带扬声器、插入 3.5mm 耳机这三个场景下,对应硬件都能正常工作的问题,遂有了此文。

前景提要:机械革命无界14Pro笔记本debian forky成功驱动内置扬声器和麦克风

系统信息

项目
机型 MECHREVO WUJIE14 PRO
CPU 12th Gen Intel Core i7-12650H
声卡 Intel Alder Lake PCH-P HD Audio (8086:51c8)
Codec Realtek ALC256 (10ec:0256)
子系统 ID 1d05:170b
固件 SOF (Sound Open Firmware) 签名固件 2025.05.1
OS Debian forky/sid, GNOME 50, Wayland
内核 7.0.10+deb14-amd64
PipeWire 1.6.6 + WirePlumber 1.6.6
ALSA UCM2 alsa-ucm-conf 1.2.15.3-1

目标

确保以下三个场景全部正常工作:

场景 状态
内置数字麦克风(DMIC) 始终正常
内置扬声器 始终正常
3.5mm 耳机插入后 修复前无声,修复后正常

问题

插入 3.5mm 耳机后声音仍然从笔记本内置扬声器输出,耳机无声音。系统设置输入设备显示正常(内置数字麦克风可用)。

根因分析

三重故障叠加

┌─────────────────────────────────────────────────────────┐
│  问题 1:硬件插孔检测不工作                                │
│  ALSA 控制 "Headphone Jack" 始终 = off                    │
│  即使耳机物理插入,Codec (Node 0x21) 的 pin sense 未触发   │
│  可能原因:SOF 驱动与 ALC256 pin sense 事件处理有兼容问题    │
├─────────────────────────────────────────────────────────┤
│  问题 2:UCM2 启动时禁用 Auto-Mute                         │
│  /usr/share/alsa/ucm2/HDA/init.conf                      │
│  → cset "name='Auto-Mute Mode' off"                      │
│  设计意图:让 PipeWire 用户态管理切换,但 UCM2 配置有缺陷    │
├─────────────────────────────────────────────────────────┤
│  问题 3:Speaker 和 Headphones 在不同 HiFi Profile 中      │
│  两者共用 PlaybackPCM "hw:0",ACP 拆分成了两个互斥 Profile  │
│  Headphones 依赖 JackControl,端口永远 "not available"     │
│  导致 PipeWire 无法激活耳机 DSP 通路                       │
└─────────────────────────────────────────────────────────┘

为什么 model= 参数无效

  • 本机使用 SOF/avs 驱动栈snd_soc_skl_hda_dsp),声卡名 sof-hda-dsp
  • snd-hda-intel 模块虽然被加载,但依赖计数为 0,不参与实际驱动
  • /etc/modprobe.d/alsa-alc256.conf 中配置的 options snd-hda-intel model=xxx 在 SOF 下不生效
  • 修复后该文件应当为空(或直接删除),避免误导
  • 强制使用传统 HDA(snd-intel-dspcfg.dsp_driver=1)会丢失内置 DMIC

音频拓扑(ALC256 Codec 节点路由)

                    ┌──────────┐
    hw:0 PCM ──────┤ DAC 0x02 │──┬── Pin 0x14 (Speaker) ── 扬声器
                    │ (Speaker)│  │
                    └──────────┘  │
                                  ├── Pin 0x1b (unused)
                                  └── Pin 0x21 (HP β) ── 耳机(辅)
                    ┌──────────┐
    hw:0 PCM ──────┤ DAC 0x03 │───── Pin 0x21* (HP α) ── 耳机(主)
                    │(Headphone)│
                    └──────────┘

                    * 表示活动连接

关键:两个 DAC 接收同一路 PCM 音频流,SOF DSP 固件根据激活的 Profile 控制哪个 DAC 通路工作。

修复历程(失败记录)

尝试 方法 结果 原因
1 model=laptop-amicheadset-mic 无效 SOF 驱动忽略 model= 参数
2 方案A:加 dsp_driver=1 切传统 HDA + headset-mic 耳机无效、麦消失 传统 HDA 不支持 DMIC;headset-mic 合并插孔类型不匹配
3 SOF 下手动切 Headphones Profile 端口 not available 无法路由 JackControl 依赖失败检测
4 Speaker Profile 下手动 amixer 开耳机 无声音 DSP 未激活耳机通路,DAC 0x03 无 stream
5 amixer toggle 脚本(操作 Playback Switch) 调音量时扬声器被激活 WirePlumber EnableSequence 每回路由激活都重开 Speaker

最终修复方案

核心思路

绕过硬件插孔检测,通过切换 Profile 来切换耳机/扬声器,让 WirePlumber 独立管理每个 Profile 的音量。

步骤

1. 修改 UCM2 配置,移除耳机 JackControl

# 备份
sudo cp /usr/share/alsa/ucm2/HDA/HiFi-analog.conf \
        /usr/share/alsa/ucm2/HDA/HiFi-analog.conf.bak

# 注释 JackControl 行(保留缩进)
sudo sed -i 's/^\([[:space:]]*\)JackControl "${var:hpjack}"/\1#JackControl "${var:hpjack}"/' \
    /usr/share/alsa/ucm2/HDA/HiFi-analog.conf

修改位置:/usr/share/alsa/ucm2/HDA/HiFi-analog.conf 第 156 行

         PlaybackSwitch "${var:hpvol} Playback Switch"
-        JackControl "${var:hpjack}"
+        #JackControl "${var:hpjack}"

效果:Headphones 端口不再依赖 Headphone Jack ALSA 控制,始终显示为可用(如同 Speaker 的 availability unknown)。

2. 创建快捷键切换脚本

~/.local/bin/toggle-audio.sh

#!/bin/bash
# 在扬声器和耳机之间切换

CARD="alsa_card.pci-0000_00_1f.3-platform-skl_hda_dsp_generic"
SPK_PROFILE="HiFi (HDMI1, HDMI2, HDMI3, Mic1, Mic2, Speaker)"
HP_PROFILE="HiFi (HDMI1, HDMI2, HDMI3, Headphones, Mic1, Mic2)"
SPK_SINK="alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Speaker__sink"
HP_SINK="alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Headphones__sink"

current=$(pactl list cards 2>/dev/null | grep "Active Profile" | grep -o "Speaker")

if [ -n "$current" ]; then
    pactl set-card-profile "$CARD" "$HP_PROFILE"
    sleep 0.3
    pactl set-default-sink "$HP_SINK"
    for i in $(pactl list sink-inputs short 2>/dev/null | awk '{print $1}'); do
        pactl move-sink-input "$i" "$HP_SINK" 2>/dev/null
    done
    notify-send -a "音频切换" "已切换到耳机" -i audio-headphones
else
    pactl set-card-profile "$CARD" "$SPK_PROFILE"
    sleep 0.3
    pactl set-default-sink "$SPK_SINK"
    for i in $(pactl list sink-inputs short 2>/dev/null | awk '{print $1}'); do
        pactl move-sink-input "$i" "$SPK_SINK" 2>/dev/null
    done
    notify-send -a "音频切换" "已切换到扬声器" -i audio-speakers
fi
chmod +x ~/.local/bin/toggle-audio.sh

3. 绑定快捷键

GNOME 设置 → 键盘 → 查看及自定义快捷键 → 自定义快捷键 → 添加:

  • 命令:/home/dk/.local/bin/toggle-audio.sh
  • 快捷键:Super+Alt+S

4. 重启音频服务

systemctl --user restart wireplumber pipewire pipewire-pulse

注意事项

  • alsa-ucm-conf 包更新后会覆盖修改的配置文件,需重新执行 sed 命令
  • 备份文件位置:/usr/share/alsa/ucm2/HDA/HiFi-analog.conf.bak
  • 恢复:sudo cp /usr/share/alsa/ucm2/HDA/HiFi-analog.conf.bak /usr/share/alsa/ucm2/HDA/HiFi-analog.conf

涉及知识点

ALSA 驱动栈

层级 组件 说明
用户态 PipeWire / WirePlumber 音频路由、流管理、音量控制
用户态 ACP (ALSA Card Profile) 解析 UCM2 配置,生成 Profile/Port
用户态 ALSA UCM2 声卡用例配置(Volume、Switch、Jack、PCM)
内核态 SOF 固件 DSP 音频处理管线
内核态 snd_soc_skl_hda_dsp ASoC machine driver
内核态 snd_hda_codec_alc269 ALC256 Codec 驱动
硬件 ALC256 Codec DAC/ADC/Pin Complex 寄存器

UCM2 关键文件

文件 作用
/usr/share/alsa/ucm2/HDA/init.conf 初始化序列(含 Auto-Mute off)
/usr/share/alsa/ucm2/HDA/HiFi-analog.conf 模拟设备定义(Speaker/Headphones/Mic)
/usr/share/alsa/ucm2/Intel/sof-hda-dsp/HiFi.conf SOF HiFi 顶层用例
/usr/share/alsa/ucm2/Intel/sof-hda-dsp/HiFi-sof.conf SOF 特定覆盖(DRC/EQ/固件)

诊断用命令

# 查看声卡
cat /proc/asound/cards
aplay -l

# 查看 Codec 寄存器(Pin Sense、DAC 音量、静音状态)
cat /proc/asound/card0/codec#0

# 查看 ALSA 控制和插孔状态
amixer -c0 contents | grep -E "Jack|Auto-Mute|name="

# 查看 PipeWire 状态
pactl info | grep "Default Sink"
pactl list cards | grep -A2 "Active Profile"
pactl list sinks short

# 查看 snd_hda_intel 是否被使用
ls /sys/module/snd_hda_intel/holders/
cat /sys/module/snd_hda_intel/refcnt

# 查看内核参数
cat /proc/cmdline

# 手动控制 Codec
amixer -c0 cset name='Headphone Playback Switch' on,on
amixer -c0 cset name='Auto-Mute Mode' Enabled