[{"data":1,"prerenderedAt":3767},["ShallowReactive",2],{"articles-index":3},[4,490],{"id":5,"title":6,"body":7,"description":474,"draft":475,"extension":476,"meta":477,"navigation":478,"path":479,"publishedAt":480,"seo":481,"stem":482,"tags":483,"updatedAt":488,"__hash__":489},"articles\u002Farticles\u002Fubuntu-nautilus-icon-theme-svg-crash-fix.md","Ubuntu 下第三方图标主题导致 Nautilus 无法打开目录的修复",{"type":8,"value":9,"toc":467},"minimark",[10,17,25,30,37,63,70,74,77,96,99,140,143,146,186,197,201,215,246,249,260,264,267,293,296,316,323,376,380,424,430,441,456,463],[11,12,13],"blockquote",{},[14,15,16],"p",{},"适用场景：启用第三方图标主题后，Nautilus 打开含压缩包、安装包等特定文件的目录时立即退出；切回系统图标主题后恢复正常。",[14,18,19,20,24],{},"这通常不是目录或文件损坏，而是旧版 SVG 图标、错误的 ",[21,22,23],"code",{},"index.theme","，或它们与新版 GTK、Cairo 的兼容性问题。",[26,27,29],"h2",{"id":28},"_1-排除文件损坏","1. 排除文件损坏",[14,31,32,33,36],{},"以 ",[21,34,35],{},".tar.xz"," 为例：",[38,39,44],"pre",{"className":40,"code":41,"language":42,"meta":43,"style":43},"language-bash shiki shiki-themes github-light github-dark","xz -t \u002Fpath\u002Fto\u002Farchive.tar.xz\n","bash","",[21,45,46],{"__ignoreMap":43},[47,48,51,55,59],"span",{"class":49,"line":50},"line",1,[47,52,54],{"class":53},"sScJk","xz",[47,56,58],{"class":57},"sj4cs"," -t",[47,60,62],{"class":61},"sZZnC"," \u002Fpath\u002Fto\u002Farchive.tar.xz\n",[14,64,65,66,69],{},"命令无输出且退出状态为 ",[21,67,68],{},"0","，说明压缩包结构正常。",[26,71,73],{"id":72},"_2-确认问题来自图标主题","2. 确认问题来自图标主题",[14,75,76],{},"查看当前主题：",[38,78,80],{"className":40,"code":79,"language":42,"meta":43,"style":43},"gsettings get org.gnome.desktop.interface icon-theme\n",[21,81,82],{"__ignoreMap":43},[47,83,84,87,90,93],{"class":49,"line":50},[47,85,86],{"class":53},"gsettings",[47,88,89],{"class":61}," get",[47,91,92],{"class":61}," org.gnome.desktop.interface",[47,94,95],{"class":61}," icon-theme\n",[14,97,98],{},"临时切回 Ubuntu 默认主题后重新打开目录：",[38,100,102],{"className":40,"code":101,"language":42,"meta":43,"style":43},"gsettings set org.gnome.desktop.interface icon-theme 'Yaru'\nnautilus -q\ngio open \u002Fpath\u002Fto\u002Fproblem-directory\n",[21,103,104,119,128],{"__ignoreMap":43},[47,105,106,108,111,113,116],{"class":49,"line":50},[47,107,86],{"class":53},[47,109,110],{"class":61}," set",[47,112,92],{"class":61},[47,114,115],{"class":61}," icon-theme",[47,117,118],{"class":61}," 'Yaru'\n",[47,120,122,125],{"class":49,"line":121},2,[47,123,124],{"class":53},"nautilus",[47,126,127],{"class":57}," -q\n",[47,129,131,134,137],{"class":49,"line":130},3,[47,132,133],{"class":53},"gio",[47,135,136],{"class":61}," open",[47,138,139],{"class":61}," \u002Fpath\u002Fto\u002Fproblem-directory\n",[14,141,142],{},"如果目录可以正常打开，问题基本位于第三方图标主题。",[14,144,145],{},"还可以检查日志中的典型错误：",[38,147,149],{"className":40,"code":148,"language":42,"meta":43,"style":43},"journalctl --user --since '10 minutes ago' --no-pager \\\n  | grep -Ei 'nautilus|cairo|icon|theme directory'\n",[21,150,151,171],{"__ignoreMap":43},[47,152,153,156,159,162,165,168],{"class":49,"line":50},[47,154,155],{"class":53},"journalctl",[47,157,158],{"class":57}," --user",[47,160,161],{"class":57}," --since",[47,163,164],{"class":61}," '10 minutes ago'",[47,166,167],{"class":57}," --no-pager",[47,169,170],{"class":57}," \\\n",[47,172,173,177,180,183],{"class":49,"line":121},[47,174,176],{"class":175},"szBVR","  |",[47,178,179],{"class":53}," grep",[47,181,182],{"class":57}," -Ei",[47,184,185],{"class":61}," 'nautilus|cairo|icon|theme directory'\n",[14,187,188,189,192,193,196],{},"常见信息包括 ",[21,190,191],{},"cairo_surface_set_device_scale"," 断言失败，或主题目录缺少 ",[21,194,195],{},"Size"," 字段。",[26,198,200],{"id":199},"_3-检查主题索引","3. 检查主题索引",[14,202,203,204,207,208,211,212,214],{},"主题通常位于 ",[21,205,206],{},"~\u002F.icons\u002F主题名\u002F"," 或 ",[21,209,210],{},"~\u002F.local\u002Fshare\u002Ficons\u002F主题名\u002F","。打开其中的 ",[21,213,23],{},"，确认：",[216,217,218,225,232,243],"ul",{},[219,220,221,224],"li",{},[21,222,223],{},"Directories="," 中的每个目录真实存在；",[219,226,227,228,231],{},"每个目录都有对应的 ",[21,229,230],{},"[目录名]"," 段；",[219,233,234,235,238,239,242],{},"使用 ",[21,236,237],{},"Size=24","，不要写成区分大小写后无法识别的 ",[21,240,241],{},"size=24","；",[219,244,245],{},"删除重复项和不存在的目录声明。",[14,247,248],{},"修改后重启 Nautilus：",[38,250,252],{"className":40,"code":251,"language":42,"meta":43,"style":43},"nautilus -q\n",[21,253,254],{"__ignoreMap":43},[47,255,256,258],{"class":49,"line":50},[47,257,124],{"class":53},[47,259,127],{"class":57},[26,261,263],{"id":262},"_4-修复不兼容的-svg-图标","4. 修复不兼容的 SVG 图标",[14,265,266],{},"先根据文件 MIME 类型找到候选图标名：",[38,268,270],{"className":40,"code":269,"language":42,"meta":43,"style":43},"gio info \u002Fpath\u002Fto\u002Fproblem-file | grep -E 'content-type|standard::icon'\n",[21,271,272],{"__ignoreMap":43},[47,273,274,276,279,282,285,287,290],{"class":49,"line":50},[47,275,133],{"class":53},[47,277,278],{"class":61}," info",[47,280,281],{"class":61}," \u002Fpath\u002Fto\u002Fproblem-file",[47,283,284],{"class":175}," |",[47,286,179],{"class":53},[47,288,289],{"class":57}," -E",[47,291,292],{"class":61}," 'content-type|standard::icon'\n",[14,294,295],{},"如果某个旧 SVG 触发崩溃，最稳妥的办法是暂时移走它，让 GTK 使用继承主题中的安全图标：",[38,297,299],{"className":40,"code":298,"language":42,"meta":43,"style":43},"mv ~\u002F.icons\u002F主题名\u002F128x128\u002Fmimetypes\u002F问题图标.svg \\\n   ~\u002F.icons\u002F主题名\u002F128x128\u002Fmimetypes\u002F问题图标.svg.disabled\n",[21,300,301,311],{"__ignoreMap":43},[47,302,303,306,309],{"class":49,"line":50},[47,304,305],{"class":53},"mv",[47,307,308],{"class":61}," ~\u002F.icons\u002F主题名\u002F128x128\u002Fmimetypes\u002F问题图标.svg",[47,310,170],{"class":57},[47,312,313],{"class":49,"line":121},[47,314,315],{"class":61},"   ~\u002F.icons\u002F主题名\u002F128x128\u002Fmimetypes\u002F问题图标.svg.disabled\n",[14,317,318,319,322],{},"若希望保留原外观，可安装 ",[21,320,321],{},"librsvg2-bin","，将 SVG 转成 PNG：",[38,324,326],{"className":40,"code":325,"language":42,"meta":43,"style":43},"sudo apt install librsvg2-bin\nrsvg-convert -w 128 -h 128 问题图标.svg -o 问题图标.png\nmv 问题图标.svg 问题图标.svg.disabled\n",[21,327,328,342,367],{"__ignoreMap":43},[47,329,330,333,336,339],{"class":49,"line":50},[47,331,332],{"class":53},"sudo",[47,334,335],{"class":61}," apt",[47,337,338],{"class":61}," install",[47,340,341],{"class":61}," librsvg2-bin\n",[47,343,344,347,350,353,356,358,361,364],{"class":49,"line":121},[47,345,346],{"class":53},"rsvg-convert",[47,348,349],{"class":57}," -w",[47,351,352],{"class":57}," 128",[47,354,355],{"class":57}," -h",[47,357,352],{"class":57},[47,359,360],{"class":61}," 问题图标.svg",[47,362,363],{"class":57}," -o",[47,365,366],{"class":61}," 问题图标.png\n",[47,368,369,371,373],{"class":49,"line":130},[47,370,305],{"class":53},[47,372,360],{"class":61},[47,374,375],{"class":61}," 问题图标.svg.disabled\n",[26,377,379],{"id":378},"_5-重新启用并验证","5. 重新启用并验证",[38,381,383],{"className":40,"code":382,"language":42,"meta":43,"style":43},"gsettings set org.gnome.desktop.interface icon-theme '主题目录名'\nnautilus -q\ngio open \u002Fpath\u002Fto\u002Fproblem-directory\npgrep -a nautilus\n",[21,384,385,398,404,412],{"__ignoreMap":43},[47,386,387,389,391,393,395],{"class":49,"line":50},[47,388,86],{"class":53},[47,390,110],{"class":61},[47,392,92],{"class":61},[47,394,115],{"class":61},[47,396,397],{"class":61}," '主题目录名'\n",[47,399,400,402],{"class":49,"line":121},[47,401,124],{"class":53},[47,403,127],{"class":57},[47,405,406,408,410],{"class":49,"line":130},[47,407,133],{"class":53},[47,409,136],{"class":61},[47,411,139],{"class":61},[47,413,415,418,421],{"class":49,"line":414},4,[47,416,417],{"class":53},"pgrep",[47,419,420],{"class":57}," -a",[47,422,423],{"class":61}," nautilus\n",[14,425,426,427,429],{},"目录能打开、",[21,428,417],{}," 能看到 Nautilus，且日志中没有新的 Cairo 断言，即表示修复成功。",[14,431,432,433,436,437,440],{},"确认稳定后，可将测试主题、",[21,434,435],{},".bak","、",[21,438,439],{},".disabled"," 等文件移入回收站：",[38,442,444],{"className":40,"code":443,"language":42,"meta":43,"style":43},"gio trash \u002Fpath\u002Fto\u002Fconfirmed-test-copy\n",[21,445,446],{"__ignoreMap":43},[47,447,448,450,453],{"class":49,"line":50},[47,449,133],{"class":53},[47,451,452],{"class":61}," trash",[47,454,455],{"class":61}," \u002Fpath\u002Fto\u002Fconfirmed-test-copy\n",[14,457,458,459,462],{},"不要批量删除整个 ",[21,460,461],{},"~\u002F.icons","，也不要在未验证前删除原始图标；保留系统主题作为随时可用的回退方案。",[464,465,466],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":43,"searchDepth":121,"depth":121,"links":468},[469,470,471,472,473],{"id":28,"depth":121,"text":29},{"id":72,"depth":121,"text":73},{"id":199,"depth":121,"text":200},{"id":262,"depth":121,"text":263},{"id":378,"depth":121,"text":379},"排查并修复旧版 SVG 图标或错误主题索引导致 Nautilus 打开特定目录时崩溃的问题。",false,"md",{},true,"\u002Farticles\u002Fubuntu-nautilus-icon-theme-svg-crash-fix","2026-10-02",{"title":6,"description":474},"articles\u002Fubuntu-nautilus-icon-theme-svg-crash-fix",[484,485,486,487],"Ubuntu","Nautilus","图标主题","GTK",null,"jhxxIj1XQ1GzWaWdjhwLsaHqX7yooSDyCiqzh4MEokY",{"id":491,"title":492,"body":493,"description":3757,"draft":475,"extension":476,"meta":3758,"navigation":478,"path":3759,"publishedAt":3760,"seo":3761,"stem":3762,"tags":3763,"updatedAt":488,"__hash__":3766},"articles\u002Farticles\u002Fubuntu-huawei-matebook-sn6140-headphone-speaker-fix.md","Ubuntu \u002F Huawei MateBook 16s 有线耳机与扬声器同时出声问题排查与修复",{"type":8,"value":494,"toc":3747},[495,512,515,518,522,525,528,536,539,545,551,559,562,568,571,577,579,584,587,596,599,605,608,611,617,620,626,629,635,638,641,647,650,656,659,665,668,674,677,683,686,689,695,698,703,705,709,712,902,905,911,914,920,922,926,929,948,951,957,960,966,969,985,987,993,995,1001,1004,1027,1029,1035,1037,1041,1044,1050,1056,1059,1062,1068,1071,1077,1080,1083,1089,1092,1097,1100,1102,1106,1117,1133,1136,1152,1155,1161,1166,1168,1172,1175,1178,1202,1205,1211,1214,1220,1223,1232,1235,1241,1247,1250,1252,1256,1259,1342,1345,1351,1354,1360,1363,1365,1369,1372,1447,1450,1456,1458,1464,1466,1468,1472,1475,1478,1499,1502,1508,1511,1529,1531,1537,1540,1546,1549,1555,1558,1564,1567,1573,1576,1578,1582,1585,1591,1594,1600,1603,1609,1612,1614,1618,1620,2464,2466,2470,2472,2556,2559,2574,2577,2597,2599,2603,2605,2624,2627,2633,2636,2658,2661,2667,2670,2687,2690,2696,2698,2702,2705,2708,2714,2717,2720,2726,2729,2732,2735,2738,2744,2747,2753,2755,2759,2762,2768,2771,2777,2780,2786,2789,2792,2798,2801,2804,2809,2812,2814,2818,2821,2884,2887,2891,2965,2968,3042,3044,3048,3051,3158,3164,3170,3173,3175,3179,3182,3202,3207,3210,3213,3219,3226,3229,3235,3238,3241,3261,3264,3266,3270,3273,3276,3294,3297,3312,3315,3328,3331,3343,3346,3358,3361,3363,3367,3370,3584,3587,3626,3629,3647,3649,3653,3656,3662,3665,3671,3673,3676,3679,3685,3688,3691,3737,3744],[11,496,497],{},[14,498,499,500,503,504,507,508,511],{},"适用场景：Ubuntu 下插入 3.5 mm 有线耳机后，耳机正常出声，但笔记本内置扬声器仍然同时播放；在系统设置中选择 ",[21,501,502],{},"Headphones","、在 ",[21,505,506],{},"alsamixer"," 中启用 ",[21,509,510],{},"Auto-Mute"," 后仍无法解决。",[14,513,514],{},"本文记录一次在 Huawei MateBook 16s 类设备上的完整排障过程，包括问题定位、硬件信息确认、HDA Codec 路由测试，以及最终通过 systemd 服务实现自动切换耳机 \u002F 扬声器。",[516,517],"hr",{},[26,519,521],{"id":520},"_1-问题现象","1. 问题现象",[14,523,524],{},"系统可以正常识别有线耳机。",[14,526,527],{},"在：",[38,529,534],{"className":530,"code":532,"language":533,"meta":43},[531],"language-text","Settings -> Sound -> Output\n","text",[21,535,532],{"__ignoreMap":43},[14,537,538],{},"中可以看到：",[38,540,543],{"className":541,"code":542,"language":533,"meta":43},[531],"Speaker\nHeadphones\nHDMI \u002F DisplayPort\n",[21,544,542],{"__ignoreMap":43},[14,546,547,548,550],{},"选择 ",[21,549,502],{}," 后：",[216,552,553,556],{},[219,554,555],{},"耳机有声音；",[219,557,558],{},"笔记本内置扬声器仍然有声音。",[14,560,561],{},"也就是说，实际状态类似：",[38,563,566],{"className":564,"code":565,"language":533,"meta":43},[531],"应用程序\n   ↓\nPipeWire\n   ↓\nHeadphones\n   ↓\nHDA Codec\n   ├── Headphone   有声音\n   └── Speaker     仍然有声音\n",[21,567,565],{"__ignoreMap":43},[14,569,570],{},"正常行为应该是：",[38,572,575],{"className":573,"code":574,"language":533,"meta":43},[531],"插入耳机\n   ├── Headphone   ON\n   └── Speaker     OFF\n",[21,576,574],{"__ignoreMap":43},[516,578],{},[580,581,583],"h1",{"id":582},"_2-第一阶段检查-auto-mute","2. 第一阶段：检查 Auto-Mute",[14,585,586],{},"首先进入 ALSA Mixer：",[38,588,590],{"className":40,"code":589,"language":42,"meta":43,"style":43},"alsamixer\n",[21,591,592],{"__ignoreMap":43},[47,593,594],{"class":49,"line":50},[47,595,589],{"class":53},[14,597,598],{},"如果默认界面顶部显示：",[38,600,603],{"className":601,"code":602,"language":533,"meta":43},[531],"Card: PipeWire\nChip: PipeWire\n",[21,604,602],{"__ignoreMap":43},[14,606,607],{},"说明当前看到的是 PipeWire 虚拟 Mixer，而不是实际声卡。",[14,609,610],{},"按：",[38,612,615],{"className":613,"code":614,"language":533,"meta":43},[531],"F6\n",[21,616,614],{"__ignoreMap":43},[14,618,619],{},"选择：",[38,621,624],{"className":622,"code":623,"language":533,"meta":43},[531],"default:0  sof-hda-dsp\n",[21,625,623],{"__ignoreMap":43},[14,627,628],{},"然后按：",[38,630,633],{"className":631,"code":632,"language":533,"meta":43},[531],"F5\n",[21,634,632],{"__ignoreMap":43},[14,636,637],{},"显示所有控件。",[14,639,640],{},"找到：",[38,642,645],{"className":643,"code":644,"language":533,"meta":43},[531],"Auto-Mute Mode\n",[21,646,644],{"__ignoreMap":43},[14,648,649],{},"将：",[38,651,654],{"className":652,"code":653,"language":533,"meta":43},[531],"Disabled\n",[21,655,653],{"__ignoreMap":43},[14,657,658],{},"改为：",[38,660,663],{"className":661,"code":662,"language":533,"meta":43},[531],"Enabled\n",[21,664,662],{"__ignoreMap":43},[14,666,667],{},"此时在本机上可以看到：",[38,669,672],{"className":670,"code":671,"language":533,"meta":43},[531],"Auto-Mute = Enabled\nHeadphone = OO\nSpeaker   = MM\n",[21,673,671],{"__ignoreMap":43},[14,675,676],{},"其中：",[38,678,681],{"className":679,"code":680,"language":533,"meta":43},[531],"OO = 未静音\nMM = 已静音\n",[21,682,680],{"__ignoreMap":43},[14,684,685],{},"按理来说，此时扬声器应该已经关闭。",[14,687,688],{},"但实际测试发现：",[38,690,693],{"className":691,"code":692,"language":533,"meta":43},[531],"alsamixer:\nSpeaker = MM\n\n实际：\n笔记本扬声器仍然在出声\n",[21,694,692],{"__ignoreMap":43},[14,696,697],{},"因此可以判断：",[11,699,700],{},[14,701,702],{},"问题已经不是普通的 PipeWire 输出选择或 ALSA Auto-Mute 设置，而更可能发生在更底层的 HDA Codec 硬件路由。",[516,704],{},[580,706,708],{"id":707},"_3-获取硬件和-codec-信息","3. 获取硬件和 Codec 信息",[14,710,711],{},"为了继续定位，执行：",[38,713,715],{"className":40,"code":714,"language":42,"meta":43,"style":43},"echo \"===== Kernel =====\"\nuname -r\n\necho\necho \"===== Machine =====\"\ncat \u002Fsys\u002Fclass\u002Fdmi\u002Fid\u002Fproduct_name\ncat \u002Fsys\u002Fclass\u002Fdmi\u002Fid\u002Fboard_name 2>\u002Fdev\u002Fnull\n\necho\necho \"===== Audio PCI =====\"\nlspci -nnvv -s 00:1f.3 | grep -E 'Audio|Multimedia|Subsystem'\n\necho\necho \"===== HDA codecs =====\"\nfor f in \u002Fproc\u002Fasound\u002Fcard*\u002Fcodec#*; do\n    echo \"---- $f ----\"\n    grep -E '^Codec:|^Subsystem Id:' \"$f\"\ndone\n",[21,716,717,725,733,738,743,751,760,774,779,784,792,816,821,826,834,862,877,896],{"__ignoreMap":43},[47,718,719,722],{"class":49,"line":50},[47,720,721],{"class":57},"echo",[47,723,724],{"class":61}," \"===== Kernel =====\"\n",[47,726,727,730],{"class":49,"line":121},[47,728,729],{"class":53},"uname",[47,731,732],{"class":57}," -r\n",[47,734,735],{"class":49,"line":130},[47,736,737],{"emptyLinePlaceholder":478},"\n",[47,739,740],{"class":49,"line":414},[47,741,742],{"class":57},"echo\n",[47,744,746,748],{"class":49,"line":745},5,[47,747,721],{"class":57},[47,749,750],{"class":61}," \"===== Machine =====\"\n",[47,752,754,757],{"class":49,"line":753},6,[47,755,756],{"class":53},"cat",[47,758,759],{"class":61}," \u002Fsys\u002Fclass\u002Fdmi\u002Fid\u002Fproduct_name\n",[47,761,763,765,768,771],{"class":49,"line":762},7,[47,764,756],{"class":53},[47,766,767],{"class":61}," \u002Fsys\u002Fclass\u002Fdmi\u002Fid\u002Fboard_name",[47,769,770],{"class":175}," 2>",[47,772,773],{"class":61},"\u002Fdev\u002Fnull\n",[47,775,777],{"class":49,"line":776},8,[47,778,737],{"emptyLinePlaceholder":478},[47,780,782],{"class":49,"line":781},9,[47,783,742],{"class":57},[47,785,787,789],{"class":49,"line":786},10,[47,788,721],{"class":57},[47,790,791],{"class":61}," \"===== Audio PCI =====\"\n",[47,793,795,798,801,804,807,809,811,813],{"class":49,"line":794},11,[47,796,797],{"class":53},"lspci",[47,799,800],{"class":57}," -nnvv",[47,802,803],{"class":57}," -s",[47,805,806],{"class":61}," 00:1f.3",[47,808,284],{"class":175},[47,810,179],{"class":53},[47,812,289],{"class":57},[47,814,815],{"class":61}," 'Audio|Multimedia|Subsystem'\n",[47,817,819],{"class":49,"line":818},12,[47,820,737],{"emptyLinePlaceholder":478},[47,822,824],{"class":49,"line":823},13,[47,825,742],{"class":57},[47,827,829,831],{"class":49,"line":828},14,[47,830,721],{"class":57},[47,832,833],{"class":61}," \"===== HDA codecs =====\"\n",[47,835,837,840,844,847,850,853,856,859],{"class":49,"line":836},15,[47,838,839],{"class":175},"for",[47,841,843],{"class":842},"sVt8B"," f ",[47,845,846],{"class":175},"in",[47,848,849],{"class":61}," \u002Fproc\u002Fasound\u002Fcard*\u002Fcodec",[47,851,852],{"class":842},"#",[47,854,855],{"class":175},"*",[47,857,858],{"class":842},"; ",[47,860,861],{"class":175},"do\n",[47,863,865,868,871,874],{"class":49,"line":864},16,[47,866,867],{"class":57},"    echo",[47,869,870],{"class":61}," \"---- ",[47,872,873],{"class":842},"$f",[47,875,876],{"class":61}," ----\"\n",[47,878,880,883,885,888,891,893],{"class":49,"line":879},17,[47,881,882],{"class":53},"    grep",[47,884,289],{"class":57},[47,886,887],{"class":61}," '^Codec:|^Subsystem Id:'",[47,889,890],{"class":61}," \"",[47,892,873],{"class":842},[47,894,895],{"class":61},"\"\n",[47,897,899],{"class":49,"line":898},18,[47,900,901],{"class":175},"done\n",[14,903,904],{},"本机结果：",[38,906,909],{"className":907,"code":908,"language":533,"meta":43},[531],"===== Kernel =====\n7.0.0-34-generic\n\n===== Machine =====\nCREF-XX\nCREF-XX-PCB\n\n===== Audio PCI =====\n00:1f.3 Multimedia audio controller:\nIntel Corporation Alder Lake PCH-P High Definition Audio Controller [8086:51c8]\n\nSubsystem:\nHuawei Technologies Co., Ltd. Device [19e5:3e5f]\n\n===== HDA codecs =====\nCodec: Conexant SN6140\nSubsystem Id: 0x19e53281\n\nCodec: Intel Alderlake-P HDMI\nSubsystem Id: 0x80860101\n",[21,910,908],{"__ignoreMap":43},[14,912,913],{},"因此实际音频硬件为：",[38,915,918],{"className":916,"code":917,"language":533,"meta":43},[531],"CPU \u002F PCH      : Intel Alder Lake PCH-P\nALSA card      : sof-hda-dsp\nCodec          : Conexant SN6140\nCodec Subsystem: 0x19e53281\nVendor ID      : 0x14f11f87\n",[21,919,917],{"__ignoreMap":43},[516,921],{},[580,923,925],{"id":924},"_4-查看-hda-codec-节点","4. 查看 HDA Codec 节点",[14,927,928],{},"继续检查关键 Pin：",[38,930,932],{"className":40,"code":931,"language":42,"meta":43,"style":43},"grep -A20 'Node 0x16' \u002Fproc\u002Fasound\u002Fcard0\u002Fcodec#0\n",[21,933,934],{"__ignoreMap":43},[47,935,936,939,942,945],{"class":49,"line":50},[47,937,938],{"class":53},"grep",[47,940,941],{"class":57}," -A20",[47,943,944],{"class":61}," 'Node 0x16'",[47,946,947],{"class":61}," \u002Fproc\u002Fasound\u002Fcard0\u002Fcodec#0\n",[14,949,950],{},"得到：",[38,952,955],{"className":953,"code":954,"language":533,"meta":43},[531],"Node 0x16 [Pin Complex]\nPincap 0x0001001c: OUT HP EAPD Detect\nEAPD 0x2: EAPD\n\nPin Default 0x03211040:\n[Jack] HP Out at Ext Left\n\nPin-ctls: 0xc0: OUT HP\n\nConnection: 2\n   0x10* 0x11\n",[21,956,954],{"__ignoreMap":43},[14,958,959],{},"说明：",[38,961,964],{"className":962,"code":963,"language":533,"meta":43},[531],"0x16 = 外接耳机 Pin\n",[21,965,963],{"__ignoreMap":43},[14,967,968],{},"再检查：",[38,970,972],{"className":40,"code":971,"language":42,"meta":43,"style":43},"grep -A20 'Node 0x17' \u002Fproc\u002Fasound\u002Fcard0\u002Fcodec#0\n",[21,973,974],{"__ignoreMap":43},[47,975,976,978,980,983],{"class":49,"line":50},[47,977,938],{"class":53},[47,979,941],{"class":57},[47,981,982],{"class":61}," 'Node 0x17'",[47,984,947],{"class":61},[14,986,950],{},[38,988,991],{"className":989,"code":990,"language":533,"meta":43},[531],"Node 0x17 [Pin Complex]\nPincap 0x00010010: OUT EAPD\n\nEAPD 0x2: EAPD\n\nPin Default 0x91170110:\n[Fixed] Speaker at Int Rear\n\nConnection: 2\n   0x10 0x11*\n",[21,992,990],{"__ignoreMap":43},[14,994,959],{},[38,996,999],{"className":997,"code":998,"language":533,"meta":43},[531],"0x17 = 内置扬声器 Pin\n",[21,1000,998],{"__ignoreMap":43},[14,1002,1003],{},"同时查看 GPIO：",[38,1005,1007],{"className":40,"code":1006,"language":42,"meta":43,"style":43},"grep -i -A10 -B2 'GPIO' \u002Fproc\u002Fasound\u002Fcard0\u002Fcodec#0\n",[21,1008,1009],{"__ignoreMap":43},[47,1010,1011,1013,1016,1019,1022,1025],{"class":49,"line":50},[47,1012,938],{"class":53},[47,1014,1015],{"class":57}," -i",[47,1017,1018],{"class":57}," -A10",[47,1020,1021],{"class":57}," -B2",[47,1023,1024],{"class":61}," 'GPIO'",[47,1026,947],{"class":61},[14,1028,676],{},[38,1030,1033],{"className":1031,"code":1032,"language":533,"meta":43},[531],"GPIO: io=5\n\nIO[0]: enable=1, dir=1, data=1\nIO[1]: enable=1, dir=1, data=0\nIO[4]: enable=1, dir=0, data=0\n",[21,1034,1032],{"__ignoreMap":43},[516,1036],{},[580,1038,1040],{"id":1039},"_5-为什么-speaker-已经是-mm物理扬声器仍然响","5. 为什么 Speaker 已经是 MM，物理扬声器仍然响？",[14,1042,1043],{},"这一步是整个排障的关键。",[14,1045,1046,1047,1049],{},"在 ",[21,1048,506],{}," 中：",[38,1051,1054],{"className":1052,"code":1053,"language":533,"meta":43},[531],"Speaker = MM\n",[21,1055,1053],{"__ignoreMap":43},[14,1057,1058],{},"只能说明 ALSA 暴露出来的 Mixer 控件处于静音状态。",[14,1060,1061],{},"但这台机器上，真正决定物理扬声器是否工作的还包括：",[38,1063,1066],{"className":1064,"code":1065,"language":533,"meta":43},[531],"CONNECT_SEL\nEAPD\nGPIO\n",[21,1067,1065],{"__ignoreMap":43},[14,1069,1070],{},"其中 EAPD 可以理解为：",[38,1072,1075],{"className":1073,"code":1074,"language":533,"meta":43},[531],"External Amplifier Power Down\n",[21,1076,1074],{"__ignoreMap":43},[14,1078,1079],{},"也就是外部功放控制。",[14,1081,1082],{},"在耳机插入后，我们观察到：",[38,1084,1087],{"className":1085,"code":1086,"language":533,"meta":43},[531],"Node 0x17:\nEAPD 0x2: EAPD\n",[21,1088,1086],{"__ignoreMap":43},[14,1090,1091],{},"也就是说：",[11,1093,1094],{},[14,1095,1096],{},"虽然 ALSA Mixer 已经认为 Speaker 被静音，但扬声器功放仍然处于启用状态。",[14,1098,1099],{},"因此物理扬声器仍然会播放。",[516,1101],{},[580,1103,1105],{"id":1104},"_6-安装-hda-verb","6. 安装 hda-verb",[14,1107,1108,1109,1112,1113,1116],{},"Ubuntu 可以通过 ",[21,1110,1111],{},"alsa-tools"," 提供 ",[21,1114,1115],{},"hda-verb","：",[38,1118,1120],{"className":40,"code":1119,"language":42,"meta":43,"style":43},"sudo apt install alsa-tools\n",[21,1121,1122],{"__ignoreMap":43},[47,1123,1124,1126,1128,1130],{"class":49,"line":50},[47,1125,332],{"class":53},[47,1127,335],{"class":61},[47,1129,338],{"class":61},[47,1131,1132],{"class":61}," alsa-tools\n",[14,1134,1135],{},"检查：",[38,1137,1139],{"className":40,"code":1138,"language":42,"meta":43,"style":43},"command -v hda-verb\n",[21,1140,1141],{"__ignoreMap":43},[47,1142,1143,1146,1149],{"class":49,"line":50},[47,1144,1145],{"class":57},"command",[47,1147,1148],{"class":57}," -v",[47,1150,1151],{"class":61}," hda-verb\n",[14,1153,1154],{},"正常应输出类似：",[38,1156,1159],{"className":1157,"code":1158,"language":533,"meta":43},[531],"\u002Fusr\u002Fbin\u002Fhda-verb\n",[21,1160,1158],{"__ignoreMap":43},[14,1162,1163,1165],{},[21,1164,1115],{}," 可以直接向 HDA Codec 发送 Verb，用于读取或修改 Codec 节点状态。",[516,1167],{},[580,1169,1171],{"id":1170},"_7-最小化测试关闭扬声器-eapd","7. 最小化测试：关闭扬声器 EAPD",[14,1173,1174],{},"保持耳机插入，并播放音频。",[14,1176,1177],{},"执行：",[38,1179,1181],{"className":40,"code":1180,"language":42,"meta":43,"style":43},"sudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x17 0x70c 0x0\n",[21,1182,1183],{"__ignoreMap":43},[47,1184,1185,1187,1190,1193,1196,1199],{"class":49,"line":50},[47,1186,332],{"class":53},[47,1188,1189],{"class":61}," hda-verb",[47,1191,1192],{"class":61}," \u002Fdev\u002Fsnd\u002FhwC0D0",[47,1194,1195],{"class":57}," 0x17",[47,1197,1198],{"class":57}," 0x70c",[47,1200,1201],{"class":57}," 0x0\n",[14,1203,1204],{},"本机输出：",[38,1206,1209],{"className":1207,"code":1208,"language":533,"meta":43},[531],"nid = 0x17, verb = 0x70c, param = 0x0\nvalue = 0x0\n",[21,1210,1208],{"__ignoreMap":43},[14,1212,1213],{},"执行后：",[38,1215,1218],{"className":1216,"code":1217,"language":533,"meta":43},[531],"耳机：正常有声音\n扬声器：立即停止出声\n",[21,1219,1217],{"__ignoreMap":43},[14,1221,1222],{},"这一步几乎可以直接确认：",[11,1224,1225],{},[14,1226,1227,1228,1231],{},"问题的核心就是 Speaker 节点 ",[21,1229,1230],{},"0x17"," 的 EAPD 没有随着耳机插入被正确关闭。",[14,1233,1234],{},"但此时如果拔掉耳机：",[38,1236,1239],{"className":1237,"code":1238,"language":533,"meta":43},[531],"耳机     已拔出\nSpeaker  没有声音\n",[21,1240,1238],{"__ignoreMap":43},[14,1242,1243,1244,1246],{},"这是因为我们只是手动把 EAPD 改成了 ",[21,1245,68],{},"，系统并不会自动重新打开它。",[14,1248,1249],{},"所以还需要实现完整的 Speaker \u002F Headphone 路由切换。",[516,1251],{},[580,1253,1255],{"id":1254},"_8-手动验证完整-speaker-模式","8. 手动验证完整 Speaker 模式",[14,1257,1258],{},"拔掉耳机后执行：",[38,1260,1262],{"className":40,"code":1261,"language":42,"meta":43,"style":43},"sudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x01 0x717 0x2\nsudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x01 0x716 0x2\nsudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x16 0x701 0x1\nsudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x17 0x70c 0x2\nsudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x01 0x715 0x2\n",[21,1263,1264,1281,1296,1313,1327],{"__ignoreMap":43},[47,1265,1266,1268,1270,1272,1275,1278],{"class":49,"line":50},[47,1267,332],{"class":53},[47,1269,1189],{"class":61},[47,1271,1192],{"class":61},[47,1273,1274],{"class":57}," 0x01",[47,1276,1277],{"class":57}," 0x717",[47,1279,1280],{"class":57}," 0x2\n",[47,1282,1283,1285,1287,1289,1291,1294],{"class":49,"line":121},[47,1284,332],{"class":53},[47,1286,1189],{"class":61},[47,1288,1192],{"class":61},[47,1290,1274],{"class":57},[47,1292,1293],{"class":57}," 0x716",[47,1295,1280],{"class":57},[47,1297,1298,1300,1302,1304,1307,1310],{"class":49,"line":130},[47,1299,332],{"class":53},[47,1301,1189],{"class":61},[47,1303,1192],{"class":61},[47,1305,1306],{"class":57}," 0x16",[47,1308,1309],{"class":57}," 0x701",[47,1311,1312],{"class":57}," 0x1\n",[47,1314,1315,1317,1319,1321,1323,1325],{"class":49,"line":414},[47,1316,332],{"class":53},[47,1318,1189],{"class":61},[47,1320,1192],{"class":61},[47,1322,1195],{"class":57},[47,1324,1198],{"class":57},[47,1326,1280],{"class":57},[47,1328,1329,1331,1333,1335,1337,1340],{"class":49,"line":745},[47,1330,332],{"class":53},[47,1332,1189],{"class":61},[47,1334,1192],{"class":61},[47,1336,1274],{"class":57},[47,1338,1339],{"class":57}," 0x715",[47,1341,1280],{"class":57},[14,1343,1344],{},"对应含义：",[38,1346,1349],{"className":1347,"code":1348,"language":533,"meta":43},[531],"GPIO direction = 0x2\nGPIO mask      = 0x2\nCONNECT_SEL    = 1\nSpeaker EAPD   = 2\nGPIO data      = 0x2\n",[21,1350,1348],{"__ignoreMap":43},[14,1352,1353],{},"测试结果：",[38,1355,1358],{"className":1356,"code":1357,"language":533,"meta":43},[531],"只从笔记本扬声器播放\n",[21,1359,1357],{"__ignoreMap":43},[14,1361,1362],{},"符合预期。",[516,1364],{},[580,1366,1368],{"id":1367},"_9-手动验证完整-headphone-模式","9. 手动验证完整 Headphone 模式",[14,1370,1371],{},"插入耳机后执行：",[38,1373,1375],{"className":40,"code":1374,"language":42,"meta":43,"style":43},"sudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x01 0x717 0x2\nsudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x01 0x716 0x2\nsudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x16 0x701 0x0\nsudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x17 0x70c 0x0\nsudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x01 0x715 0x0\n",[21,1376,1377,1391,1405,1419,1433],{"__ignoreMap":43},[47,1378,1379,1381,1383,1385,1387,1389],{"class":49,"line":50},[47,1380,332],{"class":53},[47,1382,1189],{"class":61},[47,1384,1192],{"class":61},[47,1386,1274],{"class":57},[47,1388,1277],{"class":57},[47,1390,1280],{"class":57},[47,1392,1393,1395,1397,1399,1401,1403],{"class":49,"line":121},[47,1394,332],{"class":53},[47,1396,1189],{"class":61},[47,1398,1192],{"class":61},[47,1400,1274],{"class":57},[47,1402,1293],{"class":57},[47,1404,1280],{"class":57},[47,1406,1407,1409,1411,1413,1415,1417],{"class":49,"line":130},[47,1408,332],{"class":53},[47,1410,1189],{"class":61},[47,1412,1192],{"class":61},[47,1414,1306],{"class":57},[47,1416,1309],{"class":57},[47,1418,1201],{"class":57},[47,1420,1421,1423,1425,1427,1429,1431],{"class":49,"line":414},[47,1422,332],{"class":53},[47,1424,1189],{"class":61},[47,1426,1192],{"class":61},[47,1428,1195],{"class":57},[47,1430,1198],{"class":57},[47,1432,1201],{"class":57},[47,1434,1435,1437,1439,1441,1443,1445],{"class":49,"line":745},[47,1436,332],{"class":53},[47,1438,1189],{"class":61},[47,1440,1192],{"class":61},[47,1442,1274],{"class":57},[47,1444,1339],{"class":57},[47,1446,1201],{"class":57},[14,1448,1449],{},"对应：",[38,1451,1454],{"className":1452,"code":1453,"language":533,"meta":43},[531],"GPIO direction = 0x2\nGPIO mask      = 0x2\nCONNECT_SEL    = 0\nSpeaker EAPD   = 0\nGPIO data      = 0\n",[21,1455,1453],{"__ignoreMap":43},[14,1457,1353],{},[38,1459,1462],{"className":1460,"code":1461,"language":533,"meta":43},[531],"耳机有声音\n笔记本扬声器无声音\n",[21,1463,1461],{"__ignoreMap":43},[14,1465,1362],{},[516,1467],{},[580,1469,1471],{"id":1470},"_10-验证耳机插拔检测","10. 验证耳机插拔检测",[14,1473,1474],{},"下一步检查 HDA Codec 能否准确知道耳机是否插入。",[14,1476,1477],{},"耳机插着时：",[38,1479,1481],{"className":40,"code":1480,"language":42,"meta":43,"style":43},"sudo hda-verb \u002Fdev\u002Fsnd\u002FhwC0D0 0x16 0xf09 0\n",[21,1482,1483],{"__ignoreMap":43},[47,1484,1485,1487,1489,1491,1493,1496],{"class":49,"line":50},[47,1486,332],{"class":53},[47,1488,1189],{"class":61},[47,1490,1192],{"class":61},[47,1492,1306],{"class":57},[47,1494,1495],{"class":57}," 0xf09",[47,1497,1498],{"class":57}," 0\n",[14,1500,1501],{},"输出：",[38,1503,1506],{"className":1504,"code":1505,"language":533,"meta":43},[531],"nid = 0x16, verb = 0xf09, param = 0x0\nvalue = 0x80000000\n",[21,1507,1505],{"__ignoreMap":43},[14,1509,1510],{},"拔掉耳机：",[38,1512,1513],{"className":40,"code":1480,"language":42,"meta":43,"style":43},[21,1514,1515],{"__ignoreMap":43},[47,1516,1517,1519,1521,1523,1525,1527],{"class":49,"line":50},[47,1518,332],{"class":53},[47,1520,1189],{"class":61},[47,1522,1192],{"class":61},[47,1524,1306],{"class":57},[47,1526,1495],{"class":57},[47,1528,1498],{"class":57},[14,1530,1501],{},[38,1532,1535],{"className":1533,"code":1534,"language":533,"meta":43},[531],"nid = 0x16, verb = 0xf09, param = 0x0\nvalue = 0x0\n",[21,1536,1534],{"__ignoreMap":43},[14,1538,1539],{},"Linux HDA 定义中：",[38,1541,1544],{"className":1542,"code":1543,"language":533,"meta":43},[531],"0xf09 = GET_PIN_SENSE\n",[21,1545,1543],{"__ignoreMap":43},[14,1547,1548],{},"其 bit 31：",[38,1550,1553],{"className":1551,"code":1552,"language":533,"meta":43},[531],"0x80000000\n",[21,1554,1552],{"__ignoreMap":43},[14,1556,1557],{},"表示：",[38,1559,1562],{"className":1560,"code":1561,"language":533,"meta":43},[531],"Presence Detect = 1\n",[21,1563,1561],{"__ignoreMap":43},[14,1565,1566],{},"因此：",[38,1568,1571],{"className":1569,"code":1570,"language":533,"meta":43},[531],"value & 0x80000000 != 0\n    → 耳机已插入\n\nvalue & 0x80000000 == 0\n    → 耳机未插入\n",[21,1572,1570],{"__ignoreMap":43},[14,1574,1575],{},"这意味着自动切换所需的检测条件已经完全具备。",[516,1577],{},[580,1579,1581],{"id":1580},"_11-最终自动修复方案","11. 最终自动修复方案",[14,1583,1584],{},"最终目标：",[38,1586,1589],{"className":1587,"code":1588,"language":533,"meta":43},[531],"检测 0x16 Pin Sense\n          │\n          ├── 有耳机\n          │      ↓\n          │   Headphone Mode\n          │\n          └── 无耳机\n                 ↓\n              Speaker Mode\n",[21,1590,1588],{"__ignoreMap":43},[14,1592,1593],{},"同时，为避免 ALSA card 编号发生变化，脚本不固定依赖：",[38,1595,1598],{"className":1596,"code":1597,"language":533,"meta":43},[531],"\u002Fdev\u002Fsnd\u002FhwC0D0\n",[21,1599,1597],{"__ignoreMap":43},[14,1601,1602],{},"而是根据：",[38,1604,1607],{"className":1605,"code":1606,"language":533,"meta":43},[531],"Vendor Id:    0x14f11f87\nSubsystem Id: 0x19e53281\n",[21,1608,1606],{"__ignoreMap":43},[14,1610,1611],{},"自动寻找实际 HDA 设备。",[516,1613],{},[580,1615,1617],{"id":1616},"_12-创建自动修复脚本","12. 创建自动修复脚本",[14,1619,1177],{},[38,1621,1623],{"className":40,"code":1622,"language":42,"meta":43,"style":43},"sudo tee \u002Fusr\u002Flocal\u002Fsbin\u002Fhuawei-sn6140-audio-fix >\u002Fdev\u002Fnull \u003C\u003C'EOF'\n#!\u002Fusr\u002Fbin\u002Fenv bash\n\nset -u\n\nHDA_VERB=\"\u002Fusr\u002Fbin\u002Fhda-verb\"\n\n# 仅允许当前验证过的 Codec 运行。\nVENDOR_ID=\"0x14f11f87\"\nSUBSYSTEM_ID=\"0x19e53281\"\n\nPOLL_INTERVAL=1\nREFRESH_INTERVAL=10\n\nfind_hda_device() {\n    local codec card addr dev\n\n    for codec in \u002Fproc\u002Fasound\u002Fcard*\u002Fcodec#*; do\n        [[ -r \"$codec\" ]] || continue\n\n        grep -qx \"Vendor Id: $VENDOR_ID\" \"$codec\" || continue\n        grep -qx \"Subsystem Id: $SUBSYSTEM_ID\" \"$codec\" || continue\n\n        card=\"${codec#\u002Fproc\u002Fasound\u002Fcard}\"\n        card=\"${card%%\u002F*}\"\n\n        addr=\"$(awk '\u002F^Address:\u002F {print $2; exit}' \"$codec\")\"\n\n        [[ \"$card\" =~ ^[0-9]+$ ]] || continue\n        [[ \"$addr\" =~ ^[0-9]+$ ]] || continue\n\n        dev=\"\u002Fdev\u002Fsnd\u002FhwC${card}D${addr}\"\n\n        if [[ -e \"$dev\" ]]; then\n            printf '%s\\n' \"$dev\"\n            return 0\n        fi\n    done\n\n    return 1\n}\n\nverb() {\n    \"$HDA_VERB\" \"$DEV\" \"$1\" \"$2\" \"$3\" >\u002Fdev\u002Fnull 2>&1\n}\n\nset_speaker_mode() {\n    verb 0x01 0x717 0x2 &&\n    verb 0x01 0x716 0x2 &&\n    verb 0x16 0x701 0x1 &&\n    verb 0x17 0x70c 0x2 &&\n    verb 0x01 0x715 0x2\n}\n\nset_headphone_mode() {\n    verb 0x01 0x717 0x2 &&\n    verb 0x01 0x716 0x2 &&\n    verb 0x16 0x701 0x0 &&\n    verb 0x17 0x70c 0x0 &&\n    verb 0x01 0x715 0x0\n}\n\nget_mode() {\n    local output value\n\n    output=\"$(\"$HDA_VERB\" \"$DEV\" 0x16 0xf09 0 2>\u002Fdev\u002Fnull)\" || return 1\n\n    value=\"$(awk '\u002Fvalue =\u002F {print $3; exit}' \u003C\u003C\u003C\"$output\")\"\n\n    [[ \"$value\" =~ ^0x[0-9a-fA-F]+$ ]] || return 1\n\n    if (( value & 0x80000000 )); then\n        printf '%s\\n' \"headphone\"\n    else\n        printf '%s\\n' \"speaker\"\n    fi\n}\n\nif [[ ! -x \"$HDA_VERB\" ]]; then\n    echo \"hda-verb not found: $HDA_VERB\" >&2\n    exit 1\nfi\n\nDEV=\"\"\nPREVIOUS_MODE=\"\"\nREFRESH_COUNTER=0\n\nwhile true; do\n\n    # 如果设备还没找到，或者设备在休眠恢复后重新编号，则重新扫描。\n    if [[ -z \"$DEV\" || ! -e \"$DEV\" ]]; then\n        DEV=\"$(find_hda_device || true)\"\n\n        if [[ -z \"$DEV\" ]]; then\n            sleep 2\n            continue\n        fi\n\n        echo \"Huawei SN6140 codec found: $DEV\"\n        PREVIOUS_MODE=\"\"\n        REFRESH_COUNTER=0\n    fi\n\n    MODE=\"$(get_mode || true)\"\n\n    if [[ -z \"$MODE\" ]]; then\n        DEV=\"\"\n        PREVIOUS_MODE=\"\"\n        sleep 2\n        continue\n    fi\n\n    REFRESH_COUNTER=$((REFRESH_COUNTER + 1))\n\n    # 状态变化时立即设置；\n    # 同时每隔一段时间重新应用，避免 SOF \u002F runtime PM 恢复后寄存器被重置。\n    if [[ \"$MODE\" != \"$PREVIOUS_MODE\" ]] ||\n       (( REFRESH_COUNTER >= REFRESH_INTERVAL )); then\n\n        if [[ \"$MODE\" == \"headphone\" ]]; then\n            if ! set_headphone_mode; then\n                DEV=\"\"\n                PREVIOUS_MODE=\"\"\n                sleep 1\n                continue\n            fi\n        else\n            if ! set_speaker_mode; then\n                DEV=\"\"\n                PREVIOUS_MODE=\"\"\n                sleep 1\n                continue\n            fi\n        fi\n\n        if [[ \"$MODE\" != \"$PREVIOUS_MODE\" ]]; then\n            echo \"Audio route switched to: $MODE\"\n        fi\n\n        PREVIOUS_MODE=\"$MODE\"\n        REFRESH_COUNTER=0\n    fi\n\n    sleep \"$POLL_INTERVAL\"\ndone\nEOF\n\nsudo chmod 755 \u002Fusr\u002Flocal\u002Fsbin\u002Fhuawei-sn6140-audio-fix\n",[21,1624,1625,1647,1652,1656,1661,1665,1670,1674,1679,1684,1689,1693,1698,1703,1707,1712,1717,1721,1726,1732,1737,1743,1749,1754,1760,1766,1771,1777,1782,1788,1794,1799,1805,1810,1816,1822,1828,1834,1840,1845,1851,1857,1862,1868,1874,1879,1884,1890,1896,1902,1908,1914,1920,1925,1930,1936,1941,1946,1952,1958,1964,1969,1974,1980,1986,1991,1997,2002,2008,2013,2019,2024,2030,2036,2042,2048,2054,2059,2064,2070,2076,2082,2088,2093,2099,2105,2111,2116,2122,2127,2133,2139,2145,2150,2156,2162,2168,2173,2178,2184,2190,2196,2201,2206,2212,2217,2223,2229,2234,2240,2246,2251,2256,2262,2267,2273,2279,2285,2291,2296,2302,2308,2314,2320,2326,2332,2338,2344,2350,2355,2360,2365,2370,2375,2380,2385,2391,2397,2402,2407,2413,2418,2423,2428,2434,2439,2445,2450],{"__ignoreMap":43},[47,1626,1627,1629,1632,1635,1638,1641,1644],{"class":49,"line":50},[47,1628,332],{"class":53},[47,1630,1631],{"class":61}," tee",[47,1633,1634],{"class":61}," \u002Fusr\u002Flocal\u002Fsbin\u002Fhuawei-sn6140-audio-fix",[47,1636,1637],{"class":175}," >",[47,1639,1640],{"class":61},"\u002Fdev\u002Fnull",[47,1642,1643],{"class":175}," \u003C\u003C",[47,1645,1646],{"class":61},"'EOF'\n",[47,1648,1649],{"class":49,"line":121},[47,1650,1651],{"class":61},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[47,1653,1654],{"class":49,"line":130},[47,1655,737],{"emptyLinePlaceholder":478},[47,1657,1658],{"class":49,"line":414},[47,1659,1660],{"class":61},"set -u\n",[47,1662,1663],{"class":49,"line":745},[47,1664,737],{"emptyLinePlaceholder":478},[47,1666,1667],{"class":49,"line":753},[47,1668,1669],{"class":61},"HDA_VERB=\"\u002Fusr\u002Fbin\u002Fhda-verb\"\n",[47,1671,1672],{"class":49,"line":762},[47,1673,737],{"emptyLinePlaceholder":478},[47,1675,1676],{"class":49,"line":776},[47,1677,1678],{"class":61},"# 仅允许当前验证过的 Codec 运行。\n",[47,1680,1681],{"class":49,"line":781},[47,1682,1683],{"class":61},"VENDOR_ID=\"0x14f11f87\"\n",[47,1685,1686],{"class":49,"line":786},[47,1687,1688],{"class":61},"SUBSYSTEM_ID=\"0x19e53281\"\n",[47,1690,1691],{"class":49,"line":794},[47,1692,737],{"emptyLinePlaceholder":478},[47,1694,1695],{"class":49,"line":818},[47,1696,1697],{"class":61},"POLL_INTERVAL=1\n",[47,1699,1700],{"class":49,"line":823},[47,1701,1702],{"class":61},"REFRESH_INTERVAL=10\n",[47,1704,1705],{"class":49,"line":828},[47,1706,737],{"emptyLinePlaceholder":478},[47,1708,1709],{"class":49,"line":836},[47,1710,1711],{"class":61},"find_hda_device() {\n",[47,1713,1714],{"class":49,"line":864},[47,1715,1716],{"class":61},"    local codec card addr dev\n",[47,1718,1719],{"class":49,"line":879},[47,1720,737],{"emptyLinePlaceholder":478},[47,1722,1723],{"class":49,"line":898},[47,1724,1725],{"class":61},"    for codec in \u002Fproc\u002Fasound\u002Fcard*\u002Fcodec#*; do\n",[47,1727,1729],{"class":49,"line":1728},19,[47,1730,1731],{"class":61},"        [[ -r \"$codec\" ]] || continue\n",[47,1733,1735],{"class":49,"line":1734},20,[47,1736,737],{"emptyLinePlaceholder":478},[47,1738,1740],{"class":49,"line":1739},21,[47,1741,1742],{"class":61},"        grep -qx \"Vendor Id: $VENDOR_ID\" \"$codec\" || continue\n",[47,1744,1746],{"class":49,"line":1745},22,[47,1747,1748],{"class":61},"        grep -qx \"Subsystem Id: $SUBSYSTEM_ID\" \"$codec\" || continue\n",[47,1750,1752],{"class":49,"line":1751},23,[47,1753,737],{"emptyLinePlaceholder":478},[47,1755,1757],{"class":49,"line":1756},24,[47,1758,1759],{"class":61},"        card=\"${codec#\u002Fproc\u002Fasound\u002Fcard}\"\n",[47,1761,1763],{"class":49,"line":1762},25,[47,1764,1765],{"class":61},"        card=\"${card%%\u002F*}\"\n",[47,1767,1769],{"class":49,"line":1768},26,[47,1770,737],{"emptyLinePlaceholder":478},[47,1772,1774],{"class":49,"line":1773},27,[47,1775,1776],{"class":61},"        addr=\"$(awk '\u002F^Address:\u002F {print $2; exit}' \"$codec\")\"\n",[47,1778,1780],{"class":49,"line":1779},28,[47,1781,737],{"emptyLinePlaceholder":478},[47,1783,1785],{"class":49,"line":1784},29,[47,1786,1787],{"class":61},"        [[ \"$card\" =~ ^[0-9]+$ ]] || continue\n",[47,1789,1791],{"class":49,"line":1790},30,[47,1792,1793],{"class":61},"        [[ \"$addr\" =~ ^[0-9]+$ ]] || continue\n",[47,1795,1797],{"class":49,"line":1796},31,[47,1798,737],{"emptyLinePlaceholder":478},[47,1800,1802],{"class":49,"line":1801},32,[47,1803,1804],{"class":61},"        dev=\"\u002Fdev\u002Fsnd\u002FhwC${card}D${addr}\"\n",[47,1806,1808],{"class":49,"line":1807},33,[47,1809,737],{"emptyLinePlaceholder":478},[47,1811,1813],{"class":49,"line":1812},34,[47,1814,1815],{"class":61},"        if [[ -e \"$dev\" ]]; then\n",[47,1817,1819],{"class":49,"line":1818},35,[47,1820,1821],{"class":61},"            printf '%s\\n' \"$dev\"\n",[47,1823,1825],{"class":49,"line":1824},36,[47,1826,1827],{"class":61},"            return 0\n",[47,1829,1831],{"class":49,"line":1830},37,[47,1832,1833],{"class":61},"        fi\n",[47,1835,1837],{"class":49,"line":1836},38,[47,1838,1839],{"class":61},"    done\n",[47,1841,1843],{"class":49,"line":1842},39,[47,1844,737],{"emptyLinePlaceholder":478},[47,1846,1848],{"class":49,"line":1847},40,[47,1849,1850],{"class":61},"    return 1\n",[47,1852,1854],{"class":49,"line":1853},41,[47,1855,1856],{"class":61},"}\n",[47,1858,1860],{"class":49,"line":1859},42,[47,1861,737],{"emptyLinePlaceholder":478},[47,1863,1865],{"class":49,"line":1864},43,[47,1866,1867],{"class":61},"verb() {\n",[47,1869,1871],{"class":49,"line":1870},44,[47,1872,1873],{"class":61},"    \"$HDA_VERB\" \"$DEV\" \"$1\" \"$2\" \"$3\" >\u002Fdev\u002Fnull 2>&1\n",[47,1875,1877],{"class":49,"line":1876},45,[47,1878,1856],{"class":61},[47,1880,1882],{"class":49,"line":1881},46,[47,1883,737],{"emptyLinePlaceholder":478},[47,1885,1887],{"class":49,"line":1886},47,[47,1888,1889],{"class":61},"set_speaker_mode() {\n",[47,1891,1893],{"class":49,"line":1892},48,[47,1894,1895],{"class":61},"    verb 0x01 0x717 0x2 &&\n",[47,1897,1899],{"class":49,"line":1898},49,[47,1900,1901],{"class":61},"    verb 0x01 0x716 0x2 &&\n",[47,1903,1905],{"class":49,"line":1904},50,[47,1906,1907],{"class":61},"    verb 0x16 0x701 0x1 &&\n",[47,1909,1911],{"class":49,"line":1910},51,[47,1912,1913],{"class":61},"    verb 0x17 0x70c 0x2 &&\n",[47,1915,1917],{"class":49,"line":1916},52,[47,1918,1919],{"class":61},"    verb 0x01 0x715 0x2\n",[47,1921,1923],{"class":49,"line":1922},53,[47,1924,1856],{"class":61},[47,1926,1928],{"class":49,"line":1927},54,[47,1929,737],{"emptyLinePlaceholder":478},[47,1931,1933],{"class":49,"line":1932},55,[47,1934,1935],{"class":61},"set_headphone_mode() {\n",[47,1937,1939],{"class":49,"line":1938},56,[47,1940,1895],{"class":61},[47,1942,1944],{"class":49,"line":1943},57,[47,1945,1901],{"class":61},[47,1947,1949],{"class":49,"line":1948},58,[47,1950,1951],{"class":61},"    verb 0x16 0x701 0x0 &&\n",[47,1953,1955],{"class":49,"line":1954},59,[47,1956,1957],{"class":61},"    verb 0x17 0x70c 0x0 &&\n",[47,1959,1961],{"class":49,"line":1960},60,[47,1962,1963],{"class":61},"    verb 0x01 0x715 0x0\n",[47,1965,1967],{"class":49,"line":1966},61,[47,1968,1856],{"class":61},[47,1970,1972],{"class":49,"line":1971},62,[47,1973,737],{"emptyLinePlaceholder":478},[47,1975,1977],{"class":49,"line":1976},63,[47,1978,1979],{"class":61},"get_mode() {\n",[47,1981,1983],{"class":49,"line":1982},64,[47,1984,1985],{"class":61},"    local output value\n",[47,1987,1989],{"class":49,"line":1988},65,[47,1990,737],{"emptyLinePlaceholder":478},[47,1992,1994],{"class":49,"line":1993},66,[47,1995,1996],{"class":61},"    output=\"$(\"$HDA_VERB\" \"$DEV\" 0x16 0xf09 0 2>\u002Fdev\u002Fnull)\" || return 1\n",[47,1998,2000],{"class":49,"line":1999},67,[47,2001,737],{"emptyLinePlaceholder":478},[47,2003,2005],{"class":49,"line":2004},68,[47,2006,2007],{"class":61},"    value=\"$(awk '\u002Fvalue =\u002F {print $3; exit}' \u003C\u003C\u003C\"$output\")\"\n",[47,2009,2011],{"class":49,"line":2010},69,[47,2012,737],{"emptyLinePlaceholder":478},[47,2014,2016],{"class":49,"line":2015},70,[47,2017,2018],{"class":61},"    [[ \"$value\" =~ ^0x[0-9a-fA-F]+$ ]] || return 1\n",[47,2020,2022],{"class":49,"line":2021},71,[47,2023,737],{"emptyLinePlaceholder":478},[47,2025,2027],{"class":49,"line":2026},72,[47,2028,2029],{"class":61},"    if (( value & 0x80000000 )); then\n",[47,2031,2033],{"class":49,"line":2032},73,[47,2034,2035],{"class":61},"        printf '%s\\n' \"headphone\"\n",[47,2037,2039],{"class":49,"line":2038},74,[47,2040,2041],{"class":61},"    else\n",[47,2043,2045],{"class":49,"line":2044},75,[47,2046,2047],{"class":61},"        printf '%s\\n' \"speaker\"\n",[47,2049,2051],{"class":49,"line":2050},76,[47,2052,2053],{"class":61},"    fi\n",[47,2055,2057],{"class":49,"line":2056},77,[47,2058,1856],{"class":61},[47,2060,2062],{"class":49,"line":2061},78,[47,2063,737],{"emptyLinePlaceholder":478},[47,2065,2067],{"class":49,"line":2066},79,[47,2068,2069],{"class":61},"if [[ ! -x \"$HDA_VERB\" ]]; then\n",[47,2071,2073],{"class":49,"line":2072},80,[47,2074,2075],{"class":61},"    echo \"hda-verb not found: $HDA_VERB\" >&2\n",[47,2077,2079],{"class":49,"line":2078},81,[47,2080,2081],{"class":61},"    exit 1\n",[47,2083,2085],{"class":49,"line":2084},82,[47,2086,2087],{"class":61},"fi\n",[47,2089,2091],{"class":49,"line":2090},83,[47,2092,737],{"emptyLinePlaceholder":478},[47,2094,2096],{"class":49,"line":2095},84,[47,2097,2098],{"class":61},"DEV=\"\"\n",[47,2100,2102],{"class":49,"line":2101},85,[47,2103,2104],{"class":61},"PREVIOUS_MODE=\"\"\n",[47,2106,2108],{"class":49,"line":2107},86,[47,2109,2110],{"class":61},"REFRESH_COUNTER=0\n",[47,2112,2114],{"class":49,"line":2113},87,[47,2115,737],{"emptyLinePlaceholder":478},[47,2117,2119],{"class":49,"line":2118},88,[47,2120,2121],{"class":61},"while true; do\n",[47,2123,2125],{"class":49,"line":2124},89,[47,2126,737],{"emptyLinePlaceholder":478},[47,2128,2130],{"class":49,"line":2129},90,[47,2131,2132],{"class":61},"    # 如果设备还没找到，或者设备在休眠恢复后重新编号，则重新扫描。\n",[47,2134,2136],{"class":49,"line":2135},91,[47,2137,2138],{"class":61},"    if [[ -z \"$DEV\" || ! -e \"$DEV\" ]]; then\n",[47,2140,2142],{"class":49,"line":2141},92,[47,2143,2144],{"class":61},"        DEV=\"$(find_hda_device || true)\"\n",[47,2146,2148],{"class":49,"line":2147},93,[47,2149,737],{"emptyLinePlaceholder":478},[47,2151,2153],{"class":49,"line":2152},94,[47,2154,2155],{"class":61},"        if [[ -z \"$DEV\" ]]; then\n",[47,2157,2159],{"class":49,"line":2158},95,[47,2160,2161],{"class":61},"            sleep 2\n",[47,2163,2165],{"class":49,"line":2164},96,[47,2166,2167],{"class":61},"            continue\n",[47,2169,2171],{"class":49,"line":2170},97,[47,2172,1833],{"class":61},[47,2174,2176],{"class":49,"line":2175},98,[47,2177,737],{"emptyLinePlaceholder":478},[47,2179,2181],{"class":49,"line":2180},99,[47,2182,2183],{"class":61},"        echo \"Huawei SN6140 codec found: $DEV\"\n",[47,2185,2187],{"class":49,"line":2186},100,[47,2188,2189],{"class":61},"        PREVIOUS_MODE=\"\"\n",[47,2191,2193],{"class":49,"line":2192},101,[47,2194,2195],{"class":61},"        REFRESH_COUNTER=0\n",[47,2197,2199],{"class":49,"line":2198},102,[47,2200,2053],{"class":61},[47,2202,2204],{"class":49,"line":2203},103,[47,2205,737],{"emptyLinePlaceholder":478},[47,2207,2209],{"class":49,"line":2208},104,[47,2210,2211],{"class":61},"    MODE=\"$(get_mode || true)\"\n",[47,2213,2215],{"class":49,"line":2214},105,[47,2216,737],{"emptyLinePlaceholder":478},[47,2218,2220],{"class":49,"line":2219},106,[47,2221,2222],{"class":61},"    if [[ -z \"$MODE\" ]]; then\n",[47,2224,2226],{"class":49,"line":2225},107,[47,2227,2228],{"class":61},"        DEV=\"\"\n",[47,2230,2232],{"class":49,"line":2231},108,[47,2233,2189],{"class":61},[47,2235,2237],{"class":49,"line":2236},109,[47,2238,2239],{"class":61},"        sleep 2\n",[47,2241,2243],{"class":49,"line":2242},110,[47,2244,2245],{"class":61},"        continue\n",[47,2247,2249],{"class":49,"line":2248},111,[47,2250,2053],{"class":61},[47,2252,2254],{"class":49,"line":2253},112,[47,2255,737],{"emptyLinePlaceholder":478},[47,2257,2259],{"class":49,"line":2258},113,[47,2260,2261],{"class":61},"    REFRESH_COUNTER=$((REFRESH_COUNTER + 1))\n",[47,2263,2265],{"class":49,"line":2264},114,[47,2266,737],{"emptyLinePlaceholder":478},[47,2268,2270],{"class":49,"line":2269},115,[47,2271,2272],{"class":61},"    # 状态变化时立即设置；\n",[47,2274,2276],{"class":49,"line":2275},116,[47,2277,2278],{"class":61},"    # 同时每隔一段时间重新应用，避免 SOF \u002F runtime PM 恢复后寄存器被重置。\n",[47,2280,2282],{"class":49,"line":2281},117,[47,2283,2284],{"class":61},"    if [[ \"$MODE\" != \"$PREVIOUS_MODE\" ]] ||\n",[47,2286,2288],{"class":49,"line":2287},118,[47,2289,2290],{"class":61},"       (( REFRESH_COUNTER >= REFRESH_INTERVAL )); then\n",[47,2292,2294],{"class":49,"line":2293},119,[47,2295,737],{"emptyLinePlaceholder":478},[47,2297,2299],{"class":49,"line":2298},120,[47,2300,2301],{"class":61},"        if [[ \"$MODE\" == \"headphone\" ]]; then\n",[47,2303,2305],{"class":49,"line":2304},121,[47,2306,2307],{"class":61},"            if ! set_headphone_mode; then\n",[47,2309,2311],{"class":49,"line":2310},122,[47,2312,2313],{"class":61},"                DEV=\"\"\n",[47,2315,2317],{"class":49,"line":2316},123,[47,2318,2319],{"class":61},"                PREVIOUS_MODE=\"\"\n",[47,2321,2323],{"class":49,"line":2322},124,[47,2324,2325],{"class":61},"                sleep 1\n",[47,2327,2329],{"class":49,"line":2328},125,[47,2330,2331],{"class":61},"                continue\n",[47,2333,2335],{"class":49,"line":2334},126,[47,2336,2337],{"class":61},"            fi\n",[47,2339,2341],{"class":49,"line":2340},127,[47,2342,2343],{"class":61},"        else\n",[47,2345,2347],{"class":49,"line":2346},128,[47,2348,2349],{"class":61},"            if ! set_speaker_mode; then\n",[47,2351,2353],{"class":49,"line":2352},129,[47,2354,2313],{"class":61},[47,2356,2358],{"class":49,"line":2357},130,[47,2359,2319],{"class":61},[47,2361,2363],{"class":49,"line":2362},131,[47,2364,2325],{"class":61},[47,2366,2368],{"class":49,"line":2367},132,[47,2369,2331],{"class":61},[47,2371,2373],{"class":49,"line":2372},133,[47,2374,2337],{"class":61},[47,2376,2378],{"class":49,"line":2377},134,[47,2379,1833],{"class":61},[47,2381,2383],{"class":49,"line":2382},135,[47,2384,737],{"emptyLinePlaceholder":478},[47,2386,2388],{"class":49,"line":2387},136,[47,2389,2390],{"class":61},"        if [[ \"$MODE\" != \"$PREVIOUS_MODE\" ]]; then\n",[47,2392,2394],{"class":49,"line":2393},137,[47,2395,2396],{"class":61},"            echo \"Audio route switched to: $MODE\"\n",[47,2398,2400],{"class":49,"line":2399},138,[47,2401,1833],{"class":61},[47,2403,2405],{"class":49,"line":2404},139,[47,2406,737],{"emptyLinePlaceholder":478},[47,2408,2410],{"class":49,"line":2409},140,[47,2411,2412],{"class":61},"        PREVIOUS_MODE=\"$MODE\"\n",[47,2414,2416],{"class":49,"line":2415},141,[47,2417,2195],{"class":61},[47,2419,2421],{"class":49,"line":2420},142,[47,2422,2053],{"class":61},[47,2424,2426],{"class":49,"line":2425},143,[47,2427,737],{"emptyLinePlaceholder":478},[47,2429,2431],{"class":49,"line":2430},144,[47,2432,2433],{"class":61},"    sleep \"$POLL_INTERVAL\"\n",[47,2435,2437],{"class":49,"line":2436},145,[47,2438,901],{"class":61},[47,2440,2442],{"class":49,"line":2441},146,[47,2443,2444],{"class":61},"EOF\n",[47,2446,2448],{"class":49,"line":2447},147,[47,2449,737],{"emptyLinePlaceholder":478},[47,2451,2453,2455,2458,2461],{"class":49,"line":2452},148,[47,2454,332],{"class":53},[47,2456,2457],{"class":61}," chmod",[47,2459,2460],{"class":57}," 755",[47,2462,2463],{"class":61}," \u002Fusr\u002Flocal\u002Fsbin\u002Fhuawei-sn6140-audio-fix\n",[516,2465],{},[580,2467,2469],{"id":2468},"_13-创建-systemd-服务","13. 创建 systemd 服务",[14,2471,1177],{},[38,2473,2475],{"className":40,"code":2474,"language":42,"meta":43,"style":43},"sudo tee \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhuawei-sn6140-audio-fix.service >\u002Fdev\u002Fnull \u003C\u003C'EOF'\n[Unit]\nDescription=Huawei MateBook SN6140 speaker\u002Fheadphone routing fix\nAfter=sound.target\n\n[Service]\nType=simple\nExecStart=\u002Fusr\u002Flocal\u002Fsbin\u002Fhuawei-sn6140-audio-fix\nRestart=always\nRestartSec=2\n\n[Install]\nWantedBy=multi-user.target\nEOF\n",[21,2476,2477,2494,2499,2504,2509,2513,2518,2523,2528,2533,2538,2542,2547,2552],{"__ignoreMap":43},[47,2478,2479,2481,2483,2486,2488,2490,2492],{"class":49,"line":50},[47,2480,332],{"class":53},[47,2482,1631],{"class":61},[47,2484,2485],{"class":61}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhuawei-sn6140-audio-fix.service",[47,2487,1637],{"class":175},[47,2489,1640],{"class":61},[47,2491,1643],{"class":175},[47,2493,1646],{"class":61},[47,2495,2496],{"class":49,"line":121},[47,2497,2498],{"class":61},"[Unit]\n",[47,2500,2501],{"class":49,"line":130},[47,2502,2503],{"class":61},"Description=Huawei MateBook SN6140 speaker\u002Fheadphone routing fix\n",[47,2505,2506],{"class":49,"line":414},[47,2507,2508],{"class":61},"After=sound.target\n",[47,2510,2511],{"class":49,"line":745},[47,2512,737],{"emptyLinePlaceholder":478},[47,2514,2515],{"class":49,"line":753},[47,2516,2517],{"class":61},"[Service]\n",[47,2519,2520],{"class":49,"line":762},[47,2521,2522],{"class":61},"Type=simple\n",[47,2524,2525],{"class":49,"line":776},[47,2526,2527],{"class":61},"ExecStart=\u002Fusr\u002Flocal\u002Fsbin\u002Fhuawei-sn6140-audio-fix\n",[47,2529,2530],{"class":49,"line":781},[47,2531,2532],{"class":61},"Restart=always\n",[47,2534,2535],{"class":49,"line":786},[47,2536,2537],{"class":61},"RestartSec=2\n",[47,2539,2540],{"class":49,"line":794},[47,2541,737],{"emptyLinePlaceholder":478},[47,2543,2544],{"class":49,"line":818},[47,2545,2546],{"class":61},"[Install]\n",[47,2548,2549],{"class":49,"line":823},[47,2550,2551],{"class":61},"WantedBy=multi-user.target\n",[47,2553,2554],{"class":49,"line":828},[47,2555,2444],{"class":61},[14,2557,2558],{},"重新加载 systemd：",[38,2560,2562],{"className":40,"code":2561,"language":42,"meta":43,"style":43},"sudo systemctl daemon-reload\n",[21,2563,2564],{"__ignoreMap":43},[47,2565,2566,2568,2571],{"class":49,"line":50},[47,2567,332],{"class":53},[47,2569,2570],{"class":61}," systemctl",[47,2572,2573],{"class":61}," daemon-reload\n",[14,2575,2576],{},"启用并立即启动：",[38,2578,2580],{"className":40,"code":2579,"language":42,"meta":43,"style":43},"sudo systemctl enable --now huawei-sn6140-audio-fix.service\n",[21,2581,2582],{"__ignoreMap":43},[47,2583,2584,2586,2588,2591,2594],{"class":49,"line":50},[47,2585,332],{"class":53},[47,2587,2570],{"class":61},[47,2589,2590],{"class":61}," enable",[47,2592,2593],{"class":57}," --now",[47,2595,2596],{"class":61}," huawei-sn6140-audio-fix.service\n",[516,2598],{},[580,2600,2602],{"id":2601},"_14-查看服务状态","14. 查看服务状态",[14,2604,1177],{},[38,2606,2608],{"className":40,"code":2607,"language":42,"meta":43,"style":43},"systemctl status huawei-sn6140-audio-fix.service --no-pager\n",[21,2609,2610],{"__ignoreMap":43},[47,2611,2612,2615,2618,2621],{"class":49,"line":50},[47,2613,2614],{"class":53},"systemctl",[47,2616,2617],{"class":61}," status",[47,2619,2620],{"class":61}," huawei-sn6140-audio-fix.service",[47,2622,2623],{"class":57}," --no-pager\n",[14,2625,2626],{},"正常应看到：",[38,2628,2631],{"className":2629,"code":2630,"language":533,"meta":43},[531],"Active: active (running)\n",[21,2632,2630],{"__ignoreMap":43},[14,2634,2635],{},"查看日志：",[38,2637,2639],{"className":40,"code":2638,"language":42,"meta":43,"style":43},"journalctl -u huawei-sn6140-audio-fix.service -n 30 --no-pager\n",[21,2640,2641],{"__ignoreMap":43},[47,2642,2643,2645,2648,2650,2653,2656],{"class":49,"line":50},[47,2644,155],{"class":53},[47,2646,2647],{"class":57}," -u",[47,2649,2620],{"class":61},[47,2651,2652],{"class":57}," -n",[47,2654,2655],{"class":57}," 30",[47,2657,2623],{"class":57},[14,2659,2660],{},"正常日志类似：",[38,2662,2665],{"className":2663,"code":2664,"language":533,"meta":43},[531],"Huawei SN6140 codec found: \u002Fdev\u002Fsnd\u002FhwC0D0\nAudio route switched to: speaker\nAudio route switched to: headphone\n",[21,2666,2664],{"__ignoreMap":43},[14,2668,2669],{},"实时查看：",[38,2671,2673],{"className":40,"code":2672,"language":42,"meta":43,"style":43},"sudo journalctl -fu huawei-sn6140-audio-fix.service\n",[21,2674,2675],{"__ignoreMap":43},[47,2676,2677,2679,2682,2685],{"class":49,"line":50},[47,2678,332],{"class":53},[47,2680,2681],{"class":61}," journalctl",[47,2683,2684],{"class":57}," -fu",[47,2686,2596],{"class":61},[14,2688,2689],{},"此时插拔耳机可以观察到：",[38,2691,2694],{"className":2692,"code":2693,"language":533,"meta":43},[531],"插入：\nAudio route switched to: headphone\n\n拔出：\nAudio route switched to: speaker\n",[21,2695,2693],{"__ignoreMap":43},[516,2697],{},[580,2699,2701],{"id":2700},"_15-最终结果","15. 最终结果",[14,2703,2704],{},"修复完成后：",[26,2706,2707],{"id":2707},"未插耳机",[38,2709,2712],{"className":2710,"code":2711,"language":533,"meta":43},[531],"Speaker    ON\nHeadphone  OFF\n",[21,2713,2711],{"__ignoreMap":43},[14,2715,2716],{},"声音只从笔记本扬声器播放。",[26,2718,2719],{"id":2719},"插入耳机",[38,2721,2724],{"className":2722,"code":2723,"language":533,"meta":43},[531],"Speaker    OFF\nHeadphone  ON\n",[21,2725,2723],{"__ignoreMap":43},[14,2727,2728],{},"声音只从有线耳机播放。",[26,2730,2731],{"id":2731},"拔掉耳机",[14,2733,2734],{},"系统自动重新切换到 Speaker 模式。",[14,2736,2737],{},"整个切换过程大约在：",[38,2739,2742],{"className":2740,"code":2741,"language":533,"meta":43},[531],"0 ~ 1 秒\n",[21,2743,2741],{"__ignoreMap":43},[14,2745,2746],{},"内完成。",[14,2748,2749,2750,2752],{},"重启 Ubuntu 后 systemd 服务会自动启动，不需要再次手动运行 ",[21,2751,1115],{},"。",[516,2754],{},[580,2756,2758],{"id":2757},"_16-最终问题分析","16. 最终问题分析",[14,2760,2761],{},"整个问题可以概括为：",[38,2763,2766],{"className":2764,"code":2765,"language":533,"meta":43},[531],"PipeWire\n   │\n   │ 输出设备选择正常\n   ↓\nALSA\n   │\n   │ Auto-Mute 正常\n   │ Speaker 显示 MM\n   ↓\nSOF \u002F HDA\n   │\n   │ Hardware Route 未完整切换\n   ↓\nConexant SN6140\n   │\n   ├── CONNECT_SEL\n   ├── EAPD\n   └── GPIO\n          ↓\n     物理扬声器功放\n",[21,2767,2765],{"__ignoreMap":43},[14,2769,2770],{},"真正的问题不是：",[38,2772,2775],{"className":2773,"code":2774,"language":533,"meta":43},[531],"Ubuntu 不认识耳机\n",[21,2776,2774],{"__ignoreMap":43},[14,2778,2779],{},"因为：",[38,2781,2784],{"className":2782,"code":2783,"language":533,"meta":43},[531],"GET_PIN_SENSE:\n插入 = 0x80000000\n拔出 = 0x0\n",[21,2785,2783],{"__ignoreMap":43},[14,2787,2788],{},"说明耳机检测完全正常。",[14,2790,2791],{},"问题也不是：",[38,2793,2796],{"className":2794,"code":2795,"language":533,"meta":43},[531],"PipeWire 同时把音频发送给两个设备\n",[21,2797,2795],{"__ignoreMap":43},[14,2799,2800],{},"因为手动关闭 Speaker EAPD 后，耳机仍然可以正常播放。",[14,2802,2803],{},"真正的问题是：",[11,2805,2806],{},[14,2807,2808],{},"耳机插入后，Linux 当前的 HDA 路由没有为这台 Huawei + Conexant SN6140 完整同步 CONNECT_SEL、EAPD 和 GPIO 状态，导致内置扬声器物理功放仍保持开启。",[14,2810,2811],{},"最终 workaround 通过监听耳机 Pin Sense，并在耳机插拔时主动切换三组硬件状态解决问题。",[516,2813],{},[580,2815,2817],{"id":2816},"_17-本机验证的路由状态","17. 本机验证的路由状态",[14,2819,2820],{},"最终验证得到：",[2822,2823,2824,2844],"table",{},[2825,2826,2827],"thead",{},[2828,2829,2830,2834,2838,2841],"tr",{},[2831,2832,2833],"th",{},"模式",[2831,2835,2837],{"align":2836},"right","0x16 CONNECT_SEL",[2831,2839,2840],{"align":2836},"0x17 EAPD",[2831,2842,2843],{"align":2836},"GPIO1",[2845,2846,2847,2867],"tbody",{},[2828,2848,2849,2853,2858,2863],{},[2850,2851,2852],"td",{},"Speaker",[2850,2854,2855],{"align":2836},[21,2856,2857],{},"1",[2850,2859,2860],{"align":2836},[21,2861,2862],{},"2",[2850,2864,2865],{"align":2836},[21,2866,2862],{},[2828,2868,2869,2872,2876,2880],{},[2850,2870,2871],{},"Headphone",[2850,2873,2874],{"align":2836},[21,2875,68],{},[2850,2877,2878],{"align":2836},[21,2879,68],{},[2850,2881,2882],{"align":2836},[21,2883,68],{},[14,2885,2886],{},"对应命令：",[2888,2889,2852],"h3",{"id":2890},"speaker",[38,2892,2893],{"className":40,"code":1261,"language":42,"meta":43,"style":43},[21,2894,2895,2909,2923,2937,2951],{"__ignoreMap":43},[47,2896,2897,2899,2901,2903,2905,2907],{"class":49,"line":50},[47,2898,332],{"class":53},[47,2900,1189],{"class":61},[47,2902,1192],{"class":61},[47,2904,1274],{"class":57},[47,2906,1277],{"class":57},[47,2908,1280],{"class":57},[47,2910,2911,2913,2915,2917,2919,2921],{"class":49,"line":121},[47,2912,332],{"class":53},[47,2914,1189],{"class":61},[47,2916,1192],{"class":61},[47,2918,1274],{"class":57},[47,2920,1293],{"class":57},[47,2922,1280],{"class":57},[47,2924,2925,2927,2929,2931,2933,2935],{"class":49,"line":130},[47,2926,332],{"class":53},[47,2928,1189],{"class":61},[47,2930,1192],{"class":61},[47,2932,1306],{"class":57},[47,2934,1309],{"class":57},[47,2936,1312],{"class":57},[47,2938,2939,2941,2943,2945,2947,2949],{"class":49,"line":414},[47,2940,332],{"class":53},[47,2942,1189],{"class":61},[47,2944,1192],{"class":61},[47,2946,1195],{"class":57},[47,2948,1198],{"class":57},[47,2950,1280],{"class":57},[47,2952,2953,2955,2957,2959,2961,2963],{"class":49,"line":745},[47,2954,332],{"class":53},[47,2956,1189],{"class":61},[47,2958,1192],{"class":61},[47,2960,1274],{"class":57},[47,2962,1339],{"class":57},[47,2964,1280],{"class":57},[2888,2966,2871],{"id":2967},"headphone",[38,2969,2970],{"className":40,"code":1374,"language":42,"meta":43,"style":43},[21,2971,2972,2986,3000,3014,3028],{"__ignoreMap":43},[47,2973,2974,2976,2978,2980,2982,2984],{"class":49,"line":50},[47,2975,332],{"class":53},[47,2977,1189],{"class":61},[47,2979,1192],{"class":61},[47,2981,1274],{"class":57},[47,2983,1277],{"class":57},[47,2985,1280],{"class":57},[47,2987,2988,2990,2992,2994,2996,2998],{"class":49,"line":121},[47,2989,332],{"class":53},[47,2991,1189],{"class":61},[47,2993,1192],{"class":61},[47,2995,1274],{"class":57},[47,2997,1293],{"class":57},[47,2999,1280],{"class":57},[47,3001,3002,3004,3006,3008,3010,3012],{"class":49,"line":130},[47,3003,332],{"class":53},[47,3005,1189],{"class":61},[47,3007,1192],{"class":61},[47,3009,1306],{"class":57},[47,3011,1309],{"class":57},[47,3013,1201],{"class":57},[47,3015,3016,3018,3020,3022,3024,3026],{"class":49,"line":414},[47,3017,332],{"class":53},[47,3019,1189],{"class":61},[47,3021,1192],{"class":61},[47,3023,1195],{"class":57},[47,3025,1198],{"class":57},[47,3027,1201],{"class":57},[47,3029,3030,3032,3034,3036,3038,3040],{"class":49,"line":745},[47,3031,332],{"class":53},[47,3033,1189],{"class":61},[47,3035,1192],{"class":61},[47,3037,1274],{"class":57},[47,3039,1339],{"class":57},[47,3041,1201],{"class":57},[516,3043],{},[580,3045,3047],{"id":3046},"_18-hda-verb-简单说明","18. HDA Verb 简单说明",[14,3049,3050],{},"本文实际用到的 Verb：",[2822,3052,3053,3066],{},[2825,3054,3055],{},[2828,3056,3057,3060,3063],{},[2831,3058,3059],{},"Verb",[2831,3061,3062],{},"Linux 定义",[2831,3064,3065],{},"作用",[2845,3067,3068,3083,3098,3113,3128,3143],{},[2828,3069,3070,3075,3080],{},[2850,3071,3072],{},[21,3073,3074],{},"0xf09",[2850,3076,3077],{},[21,3078,3079],{},"GET_PIN_SENSE",[2850,3081,3082],{},"获取耳机插入状态",[2828,3084,3085,3090,3095],{},[2850,3086,3087],{},[21,3088,3089],{},"0x701",[2850,3091,3092],{},[21,3093,3094],{},"SET_CONNECT_SEL",[2850,3096,3097],{},"选择输入连接 \u002F DAC 路由",[2828,3099,3100,3105,3110],{},[2850,3101,3102],{},[21,3103,3104],{},"0x70c",[2850,3106,3107],{},[21,3108,3109],{},"SET_EAPD_BTLENABLE",[2850,3111,3112],{},"设置 EAPD \u002F 外部功放",[2828,3114,3115,3120,3125],{},[2850,3116,3117],{},[21,3118,3119],{},"0x715",[2850,3121,3122],{},[21,3123,3124],{},"SET_GPIO_DATA",[2850,3126,3127],{},"设置 GPIO 数据",[2828,3129,3130,3135,3140],{},[2850,3131,3132],{},[21,3133,3134],{},"0x716",[2850,3136,3137],{},[21,3138,3139],{},"SET_GPIO_MASK",[2850,3141,3142],{},"设置 GPIO Mask",[2828,3144,3145,3150,3155],{},[2850,3146,3147],{},[21,3148,3149],{},"0x717",[2850,3151,3152],{},[21,3153,3154],{},"SET_GPIO_DIRECTION",[2850,3156,3157],{},"设置 GPIO 方向",[14,3159,3160,3161,3163],{},"其中 ",[21,3162,3079],{}," 的 bit 31：",[38,3165,3168],{"className":3166,"code":3167,"language":533,"meta":43},[531],"AC_PINSENSE_PRESENCE = 1 \u003C\u003C 31\n",[21,3169,3167],{"__ignoreMap":43},[14,3171,3172],{},"用于表示插孔 Presence。",[516,3174],{},[580,3176,3178],{"id":3177},"_19-安全说明","19. 安全说明",[14,3180,3181],{},"这个方案：",[216,3183,3184,3187,3190,3193,3196,3199],{},[219,3185,3186],{},"不修改 BIOS；",[219,3188,3189],{},"不刷写声卡固件；",[219,3191,3192],{},"不修改 Codec 永久配置；",[219,3194,3195],{},"不更换内核；",[219,3197,3198],{},"不修改 PipeWire 配置；",[219,3200,3201],{},"不替换 SOF 驱动。",[14,3203,3204,3206],{},[21,3205,1115],{}," 修改的是当前运行状态下的 HDA Codec 寄存器。",[14,3208,3209],{},"如果服务停止，或者机器重启，而不再启动该服务，就不会继续应用 workaround。",[14,3211,3212],{},"另外脚本限定：",[38,3214,3217],{"className":3215,"code":3216,"language":533,"meta":43},[531],"Vendor ID     = 0x14f11f87\nSubsystem ID  = 0x19e53281\n",[21,3218,3216],{"__ignoreMap":43},[14,3220,3221,3222,2752],{},"因此本文脚本",[3223,3224,3225],"strong",{},"不是 Huawei MateBook 全系列通用脚本",[14,3227,3228],{},"不同机型即使同样使用 SN6140，其：",[38,3230,3233],{"className":3231,"code":3232,"language":533,"meta":43},[531],"Node ID\nGPIO\nCONNECT_SEL\nSubsystem ID\n",[21,3234,3232],{"__ignoreMap":43},[14,3236,3237],{},"都有可能不同。",[14,3239,3240],{},"在其他机器上使用前，应先自行确认：",[38,3242,3244],{"className":40,"code":3243,"language":42,"meta":43,"style":43},"cat \u002Fproc\u002Fasound\u002Fcard*\u002Fcodec#*\n",[21,3245,3246],{"__ignoreMap":43},[47,3247,3248,3250,3253,3255,3258],{"class":49,"line":50},[47,3249,756],{"class":53},[47,3251,3252],{"class":61}," \u002Fproc\u002Fasound\u002Fcard",[47,3254,855],{"class":57},[47,3256,3257],{"class":61},"\u002Fcodec#",[47,3259,3260],{"class":57},"*\n",[14,3262,3263],{},"中的实际 Codec 拓扑。",[516,3265],{},[580,3267,3269],{"id":3268},"_20-如何撤销修复","20. 如何撤销修复",[14,3271,3272],{},"如果未来 Linux 内核已经原生支持这台机器，可以删除 workaround。",[14,3274,3275],{},"停止并禁用服务：",[38,3277,3279],{"className":40,"code":3278,"language":42,"meta":43,"style":43},"sudo systemctl disable --now huawei-sn6140-audio-fix.service\n",[21,3280,3281],{"__ignoreMap":43},[47,3282,3283,3285,3287,3290,3292],{"class":49,"line":50},[47,3284,332],{"class":53},[47,3286,2570],{"class":61},[47,3288,3289],{"class":61}," disable",[47,3291,2593],{"class":57},[47,3293,2596],{"class":61},[14,3295,3296],{},"删除 service：",[38,3298,3300],{"className":40,"code":3299,"language":42,"meta":43,"style":43},"sudo rm \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhuawei-sn6140-audio-fix.service\n",[21,3301,3302],{"__ignoreMap":43},[47,3303,3304,3306,3309],{"class":49,"line":50},[47,3305,332],{"class":53},[47,3307,3308],{"class":61}," rm",[47,3310,3311],{"class":61}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhuawei-sn6140-audio-fix.service\n",[14,3313,3314],{},"删除脚本：",[38,3316,3318],{"className":40,"code":3317,"language":42,"meta":43,"style":43},"sudo rm \u002Fusr\u002Flocal\u002Fsbin\u002Fhuawei-sn6140-audio-fix\n",[21,3319,3320],{"__ignoreMap":43},[47,3321,3322,3324,3326],{"class":49,"line":50},[47,3323,332],{"class":53},[47,3325,3308],{"class":61},[47,3327,2463],{"class":61},[14,3329,3330],{},"重新加载：",[38,3332,3333],{"className":40,"code":2561,"language":42,"meta":43,"style":43},[21,3334,3335],{"__ignoreMap":43},[47,3336,3337,3339,3341],{"class":49,"line":50},[47,3338,332],{"class":53},[47,3340,2570],{"class":61},[47,3342,2573],{"class":61},[14,3344,3345],{},"然后重启：",[38,3347,3349],{"className":40,"code":3348,"language":42,"meta":43,"style":43},"sudo reboot\n",[21,3350,3351],{"__ignoreMap":43},[47,3352,3353,3355],{"class":49,"line":50},[47,3354,332],{"class":53},[47,3356,3357],{"class":61}," reboot\n",[14,3359,3360],{},"即可恢复为系统默认音频处理逻辑。",[516,3362],{},[580,3364,3366],{"id":3365},"_21-快速诊断命令汇总","21. 快速诊断命令汇总",[14,3368,3369],{},"如果遇到类似问题，可以先执行：",[38,3371,3373],{"className":40,"code":3372,"language":42,"meta":43,"style":43},"echo \"===== Kernel =====\"\nuname -r\n\necho\necho \"===== DMI =====\"\nfor f in \\\n    sys_vendor \\\n    product_name \\\n    product_version \\\n    board_vendor \\\n    board_name \\\n    board_version\ndo\n    printf \"%-18s: \" \"$f\"\n    cat \"\u002Fsys\u002Fclass\u002Fdmi\u002Fid\u002F$f\" 2>\u002Fdev\u002Fnull\ndone\n\necho\necho \"===== Audio PCI =====\"\nlspci -nn | grep -iE 'audio|multimedia'\n\necho\necho \"===== Codecs =====\"\nfor f in \u002Fproc\u002Fasound\u002Fcard*\u002Fcodec#*; do\n    echo \"---- $f ----\"\n    grep -E '^Codec:|^Vendor Id:|^Subsystem Id:' \"$f\"\ndone\n",[21,3374,3375,3381,3387,3391,3395,3402,3412,3419,3426,3433,3440,3447,3452,3456,3470,3487,3491,3495,3499,3505,3522,3526,3530,3537,3555,3565,3580],{"__ignoreMap":43},[47,3376,3377,3379],{"class":49,"line":50},[47,3378,721],{"class":57},[47,3380,724],{"class":61},[47,3382,3383,3385],{"class":49,"line":121},[47,3384,729],{"class":53},[47,3386,732],{"class":57},[47,3388,3389],{"class":49,"line":130},[47,3390,737],{"emptyLinePlaceholder":478},[47,3392,3393],{"class":49,"line":414},[47,3394,742],{"class":57},[47,3396,3397,3399],{"class":49,"line":745},[47,3398,721],{"class":57},[47,3400,3401],{"class":61}," \"===== DMI =====\"\n",[47,3403,3404,3406,3408,3410],{"class":49,"line":753},[47,3405,839],{"class":175},[47,3407,843],{"class":842},[47,3409,846],{"class":175},[47,3411,170],{"class":842},[47,3413,3414,3417],{"class":49,"line":762},[47,3415,3416],{"class":61},"    sys_vendor",[47,3418,170],{"class":842},[47,3420,3421,3424],{"class":49,"line":776},[47,3422,3423],{"class":61},"    product_name",[47,3425,170],{"class":842},[47,3427,3428,3431],{"class":49,"line":781},[47,3429,3430],{"class":61},"    product_version",[47,3432,170],{"class":842},[47,3434,3435,3438],{"class":49,"line":786},[47,3436,3437],{"class":61},"    board_vendor",[47,3439,170],{"class":842},[47,3441,3442,3445],{"class":49,"line":794},[47,3443,3444],{"class":61},"    board_name",[47,3446,170],{"class":842},[47,3448,3449],{"class":49,"line":818},[47,3450,3451],{"class":61},"    board_version\n",[47,3453,3454],{"class":49,"line":823},[47,3455,861],{"class":175},[47,3457,3458,3461,3464,3466,3468],{"class":49,"line":828},[47,3459,3460],{"class":57},"    printf",[47,3462,3463],{"class":61}," \"%-18s: \"",[47,3465,890],{"class":61},[47,3467,873],{"class":842},[47,3469,895],{"class":61},[47,3471,3472,3475,3478,3480,3483,3485],{"class":49,"line":836},[47,3473,3474],{"class":53},"    cat",[47,3476,3477],{"class":61}," \"\u002Fsys\u002Fclass\u002Fdmi\u002Fid\u002F",[47,3479,873],{"class":842},[47,3481,3482],{"class":61},"\"",[47,3484,770],{"class":175},[47,3486,773],{"class":61},[47,3488,3489],{"class":49,"line":864},[47,3490,901],{"class":175},[47,3492,3493],{"class":49,"line":879},[47,3494,737],{"emptyLinePlaceholder":478},[47,3496,3497],{"class":49,"line":898},[47,3498,742],{"class":57},[47,3500,3501,3503],{"class":49,"line":1728},[47,3502,721],{"class":57},[47,3504,791],{"class":61},[47,3506,3507,3509,3512,3514,3516,3519],{"class":49,"line":1734},[47,3508,797],{"class":53},[47,3510,3511],{"class":57}," -nn",[47,3513,284],{"class":175},[47,3515,179],{"class":53},[47,3517,3518],{"class":57}," -iE",[47,3520,3521],{"class":61}," 'audio|multimedia'\n",[47,3523,3524],{"class":49,"line":1739},[47,3525,737],{"emptyLinePlaceholder":478},[47,3527,3528],{"class":49,"line":1745},[47,3529,742],{"class":57},[47,3531,3532,3534],{"class":49,"line":1751},[47,3533,721],{"class":57},[47,3535,3536],{"class":61}," \"===== Codecs =====\"\n",[47,3538,3539,3541,3543,3545,3547,3549,3551,3553],{"class":49,"line":1756},[47,3540,839],{"class":175},[47,3542,843],{"class":842},[47,3544,846],{"class":175},[47,3546,849],{"class":61},[47,3548,852],{"class":842},[47,3550,855],{"class":175},[47,3552,858],{"class":842},[47,3554,861],{"class":175},[47,3556,3557,3559,3561,3563],{"class":49,"line":1762},[47,3558,867],{"class":57},[47,3560,870],{"class":61},[47,3562,873],{"class":842},[47,3564,876],{"class":61},[47,3566,3567,3569,3571,3574,3576,3578],{"class":49,"line":1768},[47,3568,882],{"class":53},[47,3570,289],{"class":57},[47,3572,3573],{"class":61}," '^Codec:|^Vendor Id:|^Subsystem Id:'",[47,3575,890],{"class":61},[47,3577,873],{"class":842},[47,3579,895],{"class":61},[47,3581,3582],{"class":49,"line":1773},[47,3583,901],{"class":175},[14,3585,3586],{},"进一步检查：",[38,3588,3590],{"className":40,"code":3589,"language":42,"meta":43,"style":43},"grep -A20 'Node 0x16' \u002Fproc\u002Fasound\u002Fcard0\u002Fcodec#0\ngrep -A20 'Node 0x17' \u002Fproc\u002Fasound\u002Fcard0\u002Fcodec#0\ngrep -i -A10 -B2 'GPIO' \u002Fproc\u002Fasound\u002Fcard0\u002Fcodec#0\n",[21,3591,3592,3602,3612],{"__ignoreMap":43},[47,3593,3594,3596,3598,3600],{"class":49,"line":50},[47,3595,938],{"class":53},[47,3597,941],{"class":57},[47,3599,944],{"class":61},[47,3601,947],{"class":61},[47,3603,3604,3606,3608,3610],{"class":49,"line":121},[47,3605,938],{"class":53},[47,3607,941],{"class":57},[47,3609,982],{"class":61},[47,3611,947],{"class":61},[47,3613,3614,3616,3618,3620,3622,3624],{"class":49,"line":130},[47,3615,938],{"class":53},[47,3617,1015],{"class":57},[47,3619,1018],{"class":57},[47,3621,1021],{"class":57},[47,3623,1024],{"class":61},[47,3625,947],{"class":61},[14,3627,3628],{},"检查耳机检测：",[38,3630,3631],{"className":40,"code":1480,"language":42,"meta":43,"style":43},[21,3632,3633],{"__ignoreMap":43},[47,3634,3635,3637,3639,3641,3643,3645],{"class":49,"line":50},[47,3636,332],{"class":53},[47,3638,1189],{"class":61},[47,3640,1192],{"class":61},[47,3642,1306],{"class":57},[47,3644,1495],{"class":57},[47,3646,1498],{"class":57},[516,3648],{},[580,3650,3652],{"id":3651},"_22-环境","22. 环境",[14,3654,3655],{},"本文实际验证环境：",[38,3657,3660],{"className":3658,"code":3659,"language":533,"meta":43},[531],"OS            : Ubuntu\nKernel        : 7.0.0-34-generic\nMachine       : HUAWEI CREF-XX\nProduct Ver.  : M1010\nBoard         : CREF-XX-PCB\nAudio         : Intel Alder Lake PCH-P\nALSA          : sof-hda-dsp\nCodec         : Conexant SN6140\nVendor ID     : 0x14f11f87\nSubsystem ID  : 0x19e53281\n",[21,3661,3659],{"__ignoreMap":43},[14,3663,3664],{},"最终结果：",[38,3666,3669],{"className":3667,"code":3668,"language":533,"meta":43},[531],"插入耳机 → 仅耳机出声\n拔出耳机 → 自动恢复笔记本扬声器\n重启系统 → 自动修复继续生效\n",[21,3670,3668],{"__ignoreMap":43},[516,3672],{},[26,3674,3675],{"id":3675},"参考",[14,3677,3678],{},"Linux 内核中的 HDA Verb 定义可以在：",[38,3680,3683],{"className":3681,"code":3682,"language":533,"meta":43},[531],"include\u002Fsound\u002Fhda_verbs.h\n",[21,3684,3682],{"__ignoreMap":43},[14,3686,3687],{},"中查看。",[14,3689,3690],{},"本文涉及的关键定义包括：",[38,3692,3696],{"className":3693,"code":3694,"language":3695,"meta":43,"style":43},"language-c shiki shiki-themes github-light github-dark","AC_VERB_GET_PIN_SENSE          0x0f09\nAC_VERB_SET_CONNECT_SEL        0x701\nAC_VERB_SET_EAPD_BTLENABLE     0x70c\nAC_VERB_SET_GPIO_DATA          0x715\nAC_VERB_SET_GPIO_MASK          0x716\nAC_VERB_SET_GPIO_DIRECTION     0x717\n\nAC_PINSENSE_PRESENCE           (1 \u003C\u003C 31)\n","c",[21,3697,3698,3703,3708,3713,3718,3723,3728,3732],{"__ignoreMap":43},[47,3699,3700],{"class":49,"line":50},[47,3701,3702],{},"AC_VERB_GET_PIN_SENSE          0x0f09\n",[47,3704,3705],{"class":49,"line":121},[47,3706,3707],{},"AC_VERB_SET_CONNECT_SEL        0x701\n",[47,3709,3710],{"class":49,"line":130},[47,3711,3712],{},"AC_VERB_SET_EAPD_BTLENABLE     0x70c\n",[47,3714,3715],{"class":49,"line":414},[47,3716,3717],{},"AC_VERB_SET_GPIO_DATA          0x715\n",[47,3719,3720],{"class":49,"line":745},[47,3721,3722],{},"AC_VERB_SET_GPIO_MASK          0x716\n",[47,3724,3725],{"class":49,"line":753},[47,3726,3727],{},"AC_VERB_SET_GPIO_DIRECTION     0x717\n",[47,3729,3730],{"class":49,"line":762},[47,3731,737],{"emptyLinePlaceholder":478},[47,3733,3734],{"class":49,"line":776},[47,3735,3736],{},"AC_PINSENSE_PRESENCE           (1 \u003C\u003C 31)\n",[14,3738,3739,3740,3743],{},"建议在其他机型上应用本文方案之前，先根据自身 ",[21,3741,3742],{},"\u002Fproc\u002Fasound\u002Fcard*\u002Fcodec#*"," 输出验证 Codec、Node 和 GPIO 拓扑，而不要直接照搬寄存器参数。",[464,3745,3746],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":43,"searchDepth":121,"depth":121,"links":3748},[3749,3750,3751,3752,3756],{"id":520,"depth":121,"text":521},{"id":2707,"depth":121,"text":2707},{"id":2719,"depth":121,"text":2719},{"id":2731,"depth":121,"text":2731,"children":3753},[3754,3755],{"id":2890,"depth":130,"text":2852},{"id":2967,"depth":130,"text":2871},{"id":3675,"depth":121,"text":3675},"Ubuntu 下 Huawei MateBook 16s 有线耳机与扬声器同时出声问题的排查与修复记录。",{},"\u002Farticles\u002Fubuntu-huawei-matebook-sn6140-headphone-speaker-fix","2026-09-25",{"title":492,"description":3757},"articles\u002Fubuntu-huawei-matebook-sn6140-headphone-speaker-fix",[484,3764,3765],"音频","Huawei MateBook 16s","0ACTUuYOz5KKSeXJMyplyu9FhidOGdpi2qmamXe-2WY",1791276707641]