<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[InkCodes]]></title><description><![CDATA[读书，学习，睡觉]]></description><link>https://inkcodes.com</link><image><url>https://api.inkcodes.com/api/v3/objects/icon/59zpxqzsj1z35utmrz.ico</url><title>InkCodes</title><link>https://inkcodes.com</link></image><generator>Yohaku (https://github.com/Innei/Yohaku)</generator><lastBuildDate>Thu, 01 Oct 2026 17:36:44 GMT</lastBuildDate><atom:link href="https://inkcodes.com/feed" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Oct 2026 17:36:44 GMT</pubDate><language><![CDATA[zh-CN]]></language><item><title><![CDATA[牛马随想]]></title><description><![CDATA[<p>往原址览之：<a href="https://inkcodes.com/notes/13">https://inkcodes.com/notes/13</a></p>]]></description><link>https://inkcodes.com/notes/13</link><guid isPermaLink="true">https://inkcodes.com/notes/13</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Sat, 26 Sep 2026 06:20:04 GMT</pubDate></item><item><title><![CDATA[优化Afilmory相册嵌进Yohaku主题的显示效果和逻辑]]></title><description><![CDATA[<p>往原址览之：<a href="https://inkcodes.com/posts/tech/optimize-afilmory-in-yohaku">https://inkcodes.com/posts/tech/optimize-afilmory-in-yohaku</a></p>]]></description><link>https://inkcodes.com/posts/tech/optimize-afilmory-in-yohaku</link><guid isPermaLink="true">https://inkcodes.com/posts/tech/optimize-afilmory-in-yohaku</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Fri, 25 Sep 2026 15:05:22 GMT</pubDate></item><item><title><![CDATA[《你好，小朋友》为什么动人 | 不忍心欺哄的勇气]]></title><description><![CDATA[<p>往原址览之：<a href="https://inkcodes.com/notes/12">https://inkcodes.com/notes/12</a></p>]]></description><link>https://inkcodes.com/notes/12</link><guid isPermaLink="true">https://inkcodes.com/notes/12</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Wed, 23 Sep 2026 19:16:30 GMT</pubDate></item><item><title><![CDATA[甘南旅途我拍到了什么]]></title><description><![CDATA[<p>往原址览之：<a href="https://inkcodes.com/notes/11">https://inkcodes.com/notes/11</a></p>]]></description><link>https://inkcodes.com/notes/11</link><guid isPermaLink="true">https://inkcodes.com/notes/11</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Thu, 17 Sep 2026 19:23:19 GMT</pubDate></item><item><title><![CDATA[Afilmory-用阿里云OSS搭建原图私有化的静态画廊网站]]></title><description><![CDATA[<p>往原址览之：<a href="https://inkcodes.com/posts/tech/afilmory-aliyun-private-oss">https://inkcodes.com/posts/tech/afilmory-aliyun-private-oss</a></p>]]></description><link>https://inkcodes.com/posts/tech/afilmory-aliyun-private-oss</link><guid isPermaLink="true">https://inkcodes.com/posts/tech/afilmory-aliyun-private-oss</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Wed, 16 Sep 2026 19:11:54 GMT</pubDate></item><item><title><![CDATA[对话框里的“领导”]]></title><description><![CDATA[<p>往原址览之：<a href="https://inkcodes.com/notes/10">https://inkcodes.com/notes/10</a></p>]]></description><link>https://inkcodes.com/notes/10</link><guid isPermaLink="true">https://inkcodes.com/notes/10</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Sun, 13 Sep 2026 19:10:00 GMT</pubDate></item><item><title><![CDATA[archlinux机械革命15x音频修复2]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://inkcodes.com/posts/tech/archlinux15x2">https://inkcodes.com/posts/tech/archlinux15x2</a></blockquote><div><p>之前的解决方案：
<iframe src="https://inkcodes.com/2025/09/14/%E6%9C%BA%E6%A2%B0%E9%9D%A9%E5%91%BD%2015x%E7%9A%84%20linux%20%E9%9F%B3%E9%A2%91%E7%88%86%E9%9F%B3%20codec%E6%A3%80%E6%B5%8B%E4%B8%8D%E5%88%B0%E4%BF%AE%E5%A4%8D%E2%80%94%E2%80%94model%E5%8F%82%E6%95%B0/" width="100%" height="500" name="topFrame" scrolling="yes" noresize="noresize" frameBorder="0" id="topFrame"></iframe></p>
<h2 id="">目前解决方案</h2><p>经过3个月左右测试，机械革命15X的音频问题，目前采用的是：</p><ol start="1"><li><strong>延迟加载驱动</strong></li><li><strong>HDA驱动参数</strong></li><li><strong>禁用SOF驱动</strong></li><li><strong>WirePlumber配置</strong></li></ol><h3 id="">方案变化</h3><h4 id="">问题定位</h4><p>15X的音频问题主要源于：</p><ul><li><strong>冷启动初始化不稳定</strong>：Conexant SN6140 codec探测超时</li><li><strong>引脚配置</strong>：BIOS没适配引脚</li><li><strong>电源管理冲突</strong>：DMA位置报告错误，输出垃圾数据导致扬声器爆鸣</li></ul><h4 id="">解决思路</h4><p>通过<strong>延迟驱动加载</strong>绕过 BIOS 初始化的不稳定期</p><hr/><h3 id="">完整配置</h3><h4 id="1-hda-">1. HDA 驱动参数</h4><p><strong>文件路径</strong>：<code>/etc/modprobe.d/alsa-hda.conf</code></p><pre class="language-conf lang-conf"><code class="language-conf lang-conf">options snd_hda_intel single_cmd=1 power_save=0 power_save_controller=N model=,laptop-amic probe_mask=1 position_fix=1
</code></pre>
<p><strong>说明</strong>：</p><ul><li><code>single_cmd=1</code>：使用单命令模式</li><li><code>power_save=0</code>：禁用 codec 空闲省电，保持始终工作状态</li><li><code>power_save_controller=N</code>：禁止 HDA 控制器进入节能状态</li><li><code>model=,laptop-amic</code>：第一个逗号跳过 HDMI codec，第二个参数为 SN6140 指定笔记本模拟麦克风配置</li><li><code>probe_mask=1</code>：只探测第一个 codec，避免 HDMI 与内置声卡竞争</li><li><code>position_fix=1</code>：使用 LPIB 寄存器读取 DMA 位置，缓解爆音问题</li></ul><hr/><h4 id="2-sof">2. 禁用SOF驱动</h4><p><strong>文件路径</strong>：<code>/etc/modprobe.d/blacklist-sof.conf</code></p><pre class="language-conf lang-conf"><code class="language-conf lang-conf">blacklist snd_sof_pci
blacklist snd_sof_amd_acp
blacklist snd_sof_amd_renoir
blacklist snd_sof_amd_rembrandt
blacklist snd_sof_amd_vangogh
blacklist snd_sof_amd_acp63
blacklist snd_sof_amd_acp70
</code></pre>
<p><strong>说明</strong>：SOF (Sound Open Firmware) 驱动对 Conexant SN6140 支持不完善，强制使用传统 HDA 驱动。</p><hr/><h4 id="3--hda-">3. 延迟加载 HDA 驱动</h4><p>这是解决冷启动 &quot;no codecs found&quot; 问题的。</p><h5 id="-1">步骤 1：黑名单早期加载</h5><p><strong>文件路径</strong>：<code>/etc/modprobe.d/blacklist-hda-early.conf</code></p><pre class="language-conf lang-conf"><code class="language-conf lang-conf">blacklist snd_hda_intel
</code></pre>
<p><strong>作用</strong>：阻止 initramfs 阶段自动加载 snd<em>hda</em>intel，为延迟加载腾出空间。</p><h5 id="-2-systemd-">步骤 2：创建 systemd 延迟加载服务</h5><p><strong>文件路径</strong>：<code>/etc/systemd/system/audio-delayed-load.service</code></p><pre class="language-ini lang-ini"><code class="language-ini lang-ini">[Unit]
Description=Delayed HDA audio driver loading
After=multi-user.target
Before=sound.target

[Service]
Type=oneshot
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/modprobe snd_hda_intel
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
</code></pre>
<p><strong>原理</strong>：</p><pre class=""><code class="">系统启动 → BIOS 初始化（不稳定） → 等待 5 秒 → 硬件状态稳定 → 加载音频驱动
</code></pre>
<h5 id="-3-initramfs">步骤 3：启用服务并重建 initramfs</h5><pre class="language-bash lang-bash"><code class="language-bash lang-bash"># 启用服务
sudo systemctl enable audio-delayed-load.service

# 重建
sudo mkinitcpio -P

# 重启系统
sudo reboot
</code></pre>
<hr/><h4 id="4-wireplumber-">4. WirePlumber 配置（可选，防止暂停导致爆音）</h4><p><strong>文件路径</strong>：<code>~/.config/wireplumber/wireplumber.conf.d/disable-suspension.conf</code></p><pre class="language-conf lang-conf"><code class="language-conf lang-conf">monitor.alsa.rules = [
  {
    matches = [
      {
        # Matches all sources
        node.name = &quot;~alsa_input.*&quot;
      },
      {
        # Matches all sinks
        node.name = &quot;~alsa_output.*&quot;
      }
    ]
    actions = {
      update-props = {
        session.suspend-timeout-seconds = 0
      }
    }
  }
]
</code></pre>
<p><strong>应用配置</strong>：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">systemctl --user restart wireplumber pipewire pipewire-pulse
</code></pre>
<p><strong>验证</strong>：使用 <code>pw-top</code> 观察，停止播放后节点应保持 <code>Idle (I)</code> 状态，而非 <code>Suspended (S)</code>。</p><hr/><h3 id="">验证配置</h3><pre class="language-bash lang-bash"><code class="language-bash lang-bash"># 1. 检查延迟加载
systemctl status audio-delayed-load.service

# 2. 验证 model 参数
cat /sys/module/snd_hda_intel/parameters/model
# 应输出：laptop-amic,(null),(null),...

# 3. 检查音频设备
aplay -l
# 应能看到 SN6140 Analog

# 4. 查看 codec 信息
cat /proc/asound/card*/codec* | grep &quot;Codec:&quot;
# 应输出：
# Codec: ATI R6xx HDMI
# Codec: Conexant SN6140

# 5. 查看内核日志（不应有 &quot;no codecs found&quot; 错误）
sudo dmesg | grep -i &quot;hda\|codec&quot; | grep -i &quot;error\|fail&quot;
</code></pre>
<hr/><h3 id="">最近内核更新的情况</h3><p>Linux 6.19.6-zen1（2026年3月），内核包含了以下针对Conexant SN6140的修复：</p><ul><li>耳机自动检测修复（OMTP/CTIA 识别）</li><li>轮询模式检测改进</li></ul><p><strong>但没有针对WUJIE15XA冷启动初始化修复</strong>
所以目前就这样先用着，近几个月没有出过问题，目前看延迟加载还是有用的，如果有其他的问题继续更新~</p><hr/><p><strong>最后更新</strong>：2026-03-14
<strong>环境</strong>：Arch Linux, Kernel 6.19.6-zen1-1, MECHREVO WUJIE15XA</p></div><p style="text-align:right"><a href="https://inkcodes.com/posts/tech/archlinux15x2#comments">览毕，何不一言？</a></p></div>]]></description><link>https://inkcodes.com/posts/tech/archlinux15x2</link><guid isPermaLink="true">https://inkcodes.com/posts/tech/archlinux15x2</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Sat, 14 Mar 2026 01:43:56 GMT</pubDate></item><item><title><![CDATA[用阿里云oss自托管一个摄影相册afilmory]]></title><description><![CDATA[<p>往原址览之：<a href="https://inkcodes.com/posts/tech/ossafilmory">https://inkcodes.com/posts/tech/ossafilmory</a></p>]]></description><link>https://inkcodes.com/posts/tech/ossafilmory</link><guid isPermaLink="true">https://inkcodes.com/posts/tech/ossafilmory</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Wed, 04 Mar 2026 15:50:00 GMT</pubDate></item><item><title><![CDATA[机械革命 15x 的 linux 音频爆音 codec检测不到修复——model参数]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.specialhua.top/hexo_img/20250915011840959.webp-pic"/><link rel="preload" as="image" href="https://cdn.specialhua.top/hexo_img/20250921120521578.webp-pic"/><link rel="preload" as="image" href="https://cdn.specialhua.top/hexo_img/20250921120700253.webp-pic"/><div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://inkcodes.com/posts/tech/15x-linux-codecmodel">https://inkcodes.com/posts/tech/15x-linux-codecmodel</a></blockquote><div><p>笔记本机器型号是<strong>机械革命 15X</strong>（还得是鸡哥 = =），环境 Archlinux。15X的ALSA 枚举到两块编解码器（<code>codec</code>）：一块 HDMI（<code>ATI R6xx HDMI</code>），一块内置声卡 <strong>Conexant SN6140</strong>。
fastfetch信息如下</p><p><img alt="image.png" height="785" src="https://cdn.specialhua.top/hexo_img/20250915011840959.webp-pic" width="1307"/></p><h2 id="">症状</h2><p>音频出现问题的症状是系统运行一段时间后出现爆音、破音 、噼啪声，严重时这种杂音会非常大，大到多看一眼就要爆炸的地步。 且偶发开机没有内置扬声器输出，只有三个hdmi输出的情况，<strong>此时直接reboot大概率还是“掉声卡”，只有冷重启，即长按电源数十秒后再开机可能内置扬声器输出又回来了</strong>。没有内置扬声器输总是伴随dmesg日志里有snd<em>hda</em>intel 0000:64:00.6: no codecs found!记录（64:00.6是我的设备名，即主要问题是找不到编解码器）。</p><ul><li>这个问题困扰了我很久，包括但不限于的尝试如下：
<ul><li>amd-ucode 微码更新</li><li>linux内核的更新，包括zen和lts（6.13+开始）</li><li>安装/更新sof-firmware</li><li>snd<em>hda</em>intel.single_cmd=1：强制控制器以单命令模式工作</li><li>snd<em>hda</em>intel.enable_msi=0：禁用 MSI 中断</li><li>bios更新至官网目前的最新2025-01</li><li>bios电源切换为性能模式</li><li>snd<em>hda</em>intel.dmic_detect=0 禁用数字麦克风驱动路径</li></ul></li></ul><h2 id="">一些基础信息</h2><p>开机识别不到编解码器：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">sudo dmesg | grep -i -E &quot;(audio|sound|alsa|hda|card)&quot;
</code></pre>
<pre class="language-bash lang-bash"><code class="language-bash lang-bash">[ 5.385940] snd_hda_intel 0000:64:00.1: enabling device (0000 -&gt; 0002) 
[ 5.386051] snd_hda_intel 0000:64:00.1: Handle vga_switcheroo audio client 
[ 5.386219] snd_hda_intel 0000:64:00.6: enabling device (0000 -&gt; 0002) 
[ 5.390353] snd_hda_intel 0000:64:00.6: no codecs found! 
[ 5.401322] snd_hda_intel 0000:64:00.1: bound 0000:64:00.0 (ops amdgpu_dm_audio_component_bind_ops [amdgpu])
</code></pre>
<ul><li><p><code>cat /proc/asound/card*/codec*</code> 能明确看到：</p><ul><li><code>Codec: ATI R6xx HDMI</code>（外接 HDMI 音频）</li><li><code>Codec: Conexant SN6140</code>（内置 HDA 音频）</li></ul></li><li><p><code>sudo dmesg | grep -i &quot;hda.*model|snd.*model|codec.*model&quot;</code> 无输出</p></li><li><p><code>cat /sys/class/sound/card*/id</code> 输出 <code>Generic / Generic_1</code></p></li></ul><h2 id="">问题定位：爆音原因</h2><p>机革15x目前音频还是由HDA（High Definition Audio）驱动，即便安装了sof-firmware，sof也不会接管声卡（猜测机子算比较新的amd?）
但HDA在初始化时，需要根据<strong>引脚默认值（pin default）</strong>、机型特性和硬件连线，完成<strong>通路路由（Mixer/Widget 连接）</strong>、<strong>功放与 EAPD</strong>、<strong>插拔/耳麦检测</strong>等设置。若实际机器与通用策略（generic path）存在偏差，常见后果包括：</p><ul><li>某些引脚的方向/用途不匹配（例如麦克风/喇叭的路由与硬件设计不一致）；</li><li>放大器、电源门控（power gating）或 EAPD 时序不对，导致“启/停电”瞬间产生噪声；</li><li>插孔或内置麦/喇叭的检测与自动切换不可靠。</li></ul><p>在这台机器上，直观表现就是<strong>长时间开机运行系统，偶发扬声器突然的爆音、破音</strong>，以及<strong>电源状态切换后不稳定，偶发开机后检测不到内置扬声器输出，codec初始化失败</strong>。结合 <code>codec</code> 枚举结果，可以把怀疑点集中到 <strong>SN6140 的初始化策略</strong> 上。</p><h2 id="modellaptop-amic">关键改动：<code>model=laptop-amic</code></h2><p>将 <code>snd-hda-intel</code> 的 <code>model</code> 指定为 <code>laptop-amic</code> 后，问题即刻消失，目前几天时间内复测
各种播放视频、音乐均稳定。</p><p>配置：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash"># 配置
echo &#x27;options snd_hda_intel power_save=0 power_save_controller=N model=laptop-amic probe_mask=1&#x27; | sudo tee /etc/modprobe.d/alsa-hda.conf

# 重启
</code></pre>
<h3 id="">参数说明</h3><ul><li><p><strong><code>power_save</code></strong></p><ul><li>控制 codec 的省电空闲时间（单位秒）。默认值往往是 1 秒，也就是说空闲 1 秒就会把 codec 掉电。</li><li>设置为 <code>0</code> 表示禁用 codec 空闲省电，让它始终保持在工作状态。</li></ul></li><li><p><strong><code>power_save_controller</code></strong></p><ul><li>控制 HDA 控制器本身是否参与省电。</li><li>设置为 <code>N</code> 就是禁止 HDA 控制器进入节能状态。</li></ul></li><li><p><strong><code>model=laptop-amic</code></strong></p><ul><li>指定使用 <strong>笔记本模拟麦克风 (Analog Mic)</strong> 的引脚配置模板。</li><li>修正了 BIOS 提供的错误或不完整的 pin default，确保内置扬声器、耳机孔、内置麦克风正确路由。</li><li>启用必要的 EAPD（功放控制），避免因初始化不当导致的爆音、杂音和自动静音失效。</li></ul></li><li><p><strong><code>probe_mask=1</code></strong></p><ul><li>控制 <code>snd_hda_intel</code> 驱动在初始化时只探测第一个 codec。</li><li>屏蔽掉 GPU 的 HDMI codec，仅保留 Conexant SN6140 作为默认声卡。</li><li>避免 HDMI 与内置声卡竞争默认输出设备，保证系统始终加载并使用正确的那一块声卡。</li></ul></li></ul><h3 id="">其他机型的修改参考</h3><p>查阅archlinux论坛会发现很多与内置麦克风杂音/无声等问题也与codec有关，更通用的一个解决方案是：</p><ol start="1"><li>运行下面的命令，检查你机器上的音频 codec：
 <code>
 cat /proc/asound/card*/codec* | grep Codec
 </code></li><li>你可能会看到类似这样的输出（既包含音频也包含视频 codec）：
 <code>
 Codec: ATI R6xx HDMI
 Codec: Realtek ALC256
 </code></li><li>打开官方内核文档：<br/> <a href="https://www.kernel.org/doc/html/latest/sound/hd-audio/models.html">https://www.kernel.org/doc/html/latest/sound/hd-audio/models.html</a></li><li>在文档中找到对应的 codec 版本，并获取它的完整名称。<br/> 例如，我找到了这一部分：
 <code>
 ALC22x/23x/25x/269/27x/28x/29x (and vendor-specific ALC3xxx models)
 </code></li><li>在列表中，我选择了 <strong>laptop-amic</strong>。<br/> 另外，我没有改用更具体的 Realtek ALC256 配置名称，像华硕、联想的品牌机设置可能不适合鸡哥）</li><li>创建或更新 <code>/etc/modprobe.d/alsa-base.conf</code> 文件，并加入以下这一行（把 <code>laptop-amic</code> 替换成与你 codec 匹配的 model 名称）：
 <code>
 options snd-hda-intel model=laptop-amic
 </code></li><li>重启系统。
### 为什么 <code>card*/id</code> 还是 <code>Generic</code></li></ol><pre class="language-bash lang-bash"><code class="language-bash lang-bash">cat /sys/class/sound/card*/id

Generic
Generic_1
</code></pre>
<p><code>/sys/class/sound/card*/id</code> 反映的是<strong>声卡控制器的用户可读名称</strong>，与 <code>model=...</code> 选择的<strong>codec 初始化策略</strong>不是同一层级的对象。前者保持 <code>Generic / Generic_1</code> 完全正常，不影响通过 <code>model</code> 生效特定的引脚/路由修复。</p><h2 id="">电源管理</h2><p>我还在使用TLP，对于TLP的电源管理配置文件，把 <strong>SN6140 所在的 PCI 功能</strong>进行黑名单/禁用 Runtime PM，防止未插电开机出现codec检测失效问题</p><pre class=""><code class=""># /etc/tlp.conf（片段）

# 使用完整PCI地址（示例）
RUNTIME_PM_BLACKLIST=&quot;0000:64:00.6&quot;

# 对该设备强制禁用 Runtime PM（优先级更高）
RUNTIME_PM_DISABLE=&quot;64:00.6&quot;
</code></pre>
<p>两点说明：</p><ul><li>形如&quot;0000:64:00.6&quot;的地址用 <code>lspci -v | grep -A 10 -B 2 &quot;Audio device&quot;</code> 获取</li><li>如启用了 <code>powertop --auto-tune</code>，可能在会话层面“改写”电源设置，因此用 TLP 的<strong>禁用项</strong>做兜底。</li></ul><h2 id="">验证模块参数是否传递成功</h2><p>内核模块加载时会把参数挂在 <code>/sys/module/snd_hda_intel/parameters/</code> 下：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">cat /sys/module/snd_hda_intel/parameters/model 
</code></pre><p>这里应该会显示：(后面null正常)</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">laptop-amic,(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null)
</code></pre>
<h2 id="">一些知识，关于引脚配置</h2><h3 id="-hda-codec-pin">什么是 HDA Codec 的引脚（Pin）</h3><ul><li>在 Intel HDA（High Definition Audio）架构里，声卡芯片（Codec，比如 Realtek ALC256、Conexant SN6140）并不是直接“声卡 = 输出/输入端口”。</li><li>芯片内部有很多 <strong>功能节点（nodes）</strong>，其中最关键的是 <strong>Pin Widget</strong>：
<ul><li>每个 Pin 对应一个物理接口（耳机孔、扬声器、麦克风接口、HDMI 输出等）。</li><li>Pin 有自己的 ID（0x14, 0x15, 0x1a …）。</li><li>Pin 还带有能力描述（wcaps），比如是否支持输入、输出、放大器、检测插拔等。
简单理解：<strong>Pin 就是 Codec 芯片内部映射出来的“插孔定义”。</strong></li></ul></li></ul><hr/><h3 id="2-pin-configuration">2. 引脚配置（Pin Configuration）</h3><ul><li>每个 Pin 在出厂时会被 BIOS/ACPI 写入一份 <strong>默认配置（default pin config）</strong>。</li><li>配置内容包括：
<br/><ul><li>这个 Pin 是耳机输出？还是内置扬声器？</li><li>是否能检测插拔？</li><li>是否要用作模拟麦克风还是数字麦克风？</li><li>电源控制方式（EAPD、GPIO）。</li></ul></li></ul><p>👉 <strong>作用</strong>：决定了 ALSA 驱动初始化时如何理解你的硬件布局。</p><hr/><h3 id="3-">3. 为什么会出问题</h3><ul><li>很多笔记本厂商（尤其是国内品牌 / 小厂）<strong>BIOS 提供的 Pin 配置写得不规范</strong>：
<br/><ul><li>内置麦克风标成了 dmic（数字），但实际上是模拟 → 麦克风没声。</li><li>扬声器和耳机 pin 配错 → 插耳机时仍然从扬声器放音。</li><li>没有正确配置 EAPD → 扬声器音量极低或爆音。</li></ul></li><li>ALSA 驱动在遇到这些情况时，只能 fallback 到 <strong>Generic</strong>，导致功能残缺。</li></ul><hr/><h3 id="4-alsa--model-">4. ALSA 的 “model=” 参数怎么用的</h3><ul><li>在 <code>snd-hda-intel</code> 驱动里，每个 <code>model=xxx</code> 都对应一份 <strong>预定义的 pin 配置表</strong>（quirk/fixup）。</li><li>比如：
<br/><ul><li><code>laptop-amic</code> → 强制把某些 Pin 配置为“模拟麦克风输入”，修复 BIOS 配错 dmic 的情况。</li><li><code>alc256-asus-mic</code> → 对 ASUS 某些笔记本专门写死的引脚映射。</li><li><code>headset-mic</code> → 把一个 combo jack 同时作为耳机和麦克风使用。</li></ul></li></ul><p>👉 <strong>原理</strong>：绕过 BIOS 给的垃圾配置，直接套用一份驱动开发者验证过的“更靠谱”的表。</p><hr/><h3 id="5-">5. 引脚配置在音频中的实际作用</h3><ul><li>决定哪些物理接口可用：耳机孔、麦克风孔、内置扬声器。</li><li>决定自动切换逻辑：插耳机时是否自动静音扬声器（Auto-Mute）。</li><li>决定录音效果：是否能区分内置麦克风 vs 外置麦克风。</li><li>决定音质和稳定性：错误的 pin 配置可能导致爆音、底噪、放大器失效。</li></ul><h2 id="">后续——依然存在的爆音与解决方案</h2><p>时间：2025-09-20
情况：早上起来开机发现笔记本的内置扬声器依然发出了啸叫，随后开机运行了一段时间，此期间没有播放音视频等内容，但过了一段时间后突然还是出现了爆音情况，尝试查找archwiki，发现的<a href="https://wiki.archlinuxcn.org/wiki/PipeWire">pipewire on archwiki</a>  的5.1.13（在播放时有可觉察的音频延迟或是爆裂声）部分提到解决方案。
尝试如下：</p><h3 id="">创建用户级配置文件</h3><p>路径：
<code>~/.config/wireplumber/wireplumber.conf.d/disable-suspension.conf</code>
（如不存在自行创建）</p><h3 id="">写入配置</h3><p>因为我的蓝牙音响输出无问题，我没有配置蓝牙部分，我配置的内容如下：</p><pre class="language-conf lang-conf"><code class="language-conf lang-conf">monitor.alsa.rules = [
  {
    matches = [
      {
        # Matches all sources
        node.name = &quot;~alsa_input.*&quot;
      },
      {
        # Matches all sinks
        node.name = &quot;~alsa_output.*&quot;
      }
    ]
    actions = {
      update-props = {
        session.suspend-timeout-seconds = 0
      }
    }
  }
]
</code></pre>
<h3 id="">应用配置</h3><p><code>systemctl --user restart wireplumber pipewire pipewire-pulse</code></p><p>观察：<code>pw-top</code> 播放内容，并停止相关内容的播放后，回到 Idle(<code>I</code>)，而不是 Suspended(<code>S</code>)。
播放时：
<img alt="image.png" src="https://cdn.specialhua.top/hexo_img/20250921120521578.webp-pic"/>
未播放内容时：
<img alt="image.png" src="https://cdn.specialhua.top/hexo_img/20250921120700253.webp-pic"/></p><p>注意看ID为34的alsa output节点状态由R变I，而非S。</p></div><p style="text-align:right"><a href="https://inkcodes.com/posts/tech/15x-linux-codecmodel#comments">览毕，何不一言？</a></p></div>]]></description><link>https://inkcodes.com/posts/tech/15x-linux-codecmodel</link><guid isPermaLink="true">https://inkcodes.com/posts/tech/15x-linux-codecmodel</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Sun, 14 Sep 2025 08:09:56 GMT</pubDate></item><item><title><![CDATA[hyprland end4自动切换neovim主题]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://inkcodes.com/posts/tech/hyprland-end4neovim">https://inkcodes.com/posts/tech/hyprland-end4neovim</a></blockquote><div><p>最近我的hyprland主题一直在使用<a href="https://github.com/end-4">end-4</a>做的dotfile：<a href="https://github.com/end-4/dots-hyprland">illogical-impulse</a>(下面简称ii)，基于Quickshell实现，虽然后台占用是大，但是我用起来非常流畅，内存不拿来用不就是浪费吗~
遇到的一个问题是， 当切换主题的日夜间模式时， neonvim的主题并不会切换，如果就用neonvim主题配置中的<code>transparent_background = false</code>，即背景透明，会导致在ii生成的颜色配置在直接反转颜色后很不好看，于是想着通过配置neovim的主题文件来实现自动切换。</p><h2 id="">实现的效果</h2><h3 id="-">🎨 自动切换</h3><ul><li><strong>启动时检测</strong>：Neovim 启动时自动检测当前桌面环境的深浅色模式</li><li><strong>匹配主题</strong>：
<ul><li>浅色模式 → 自动应用 <strong>Catppuccin Latte</strong>（浅色主题）</li><li>深色模式 → 自动应用 <strong>Catppuccin Mocha</strong>（深色主题）</li></ul></li><li><strong>视觉统一</strong>：编辑器主题与 Quickshell 生成的 Material Design 3 终端颜色相协调</li></ul><h3 id="-">🎯 手动切换</h3><ul><li><strong>快捷键切换</strong>：
<ul><li><code>&lt;leader&gt;tl</code> - 强制切换到浅色主题</li><li><code>&lt;leader&gt;td</code> - 强制切换到深色主题</li></ul></li><li><strong>命令行控制</strong>：
<ul><li><code>:ThemeLight</code> - 切换到浅色主题</li><li><code>:ThemeDark</code> - 切换到深色主题</li></ul></li></ul><h2 id="">原理</h2><h3 id="-">🔍 检测</h3><ol start="1"><li><p><strong>数据源</strong>：读取 Quickshell 生成的颜色配置文件</p><ul><li>位置：<code>~/.local/state/quickshell/user/generated/colors.json</code></li></ul></li><li><p><strong>亮度计算</strong>：</p><pre class="language-lua lang-lua"><code class="language-lua lang-lua">-- 提取背景色（如 #f6fafe 或 #101417）
local r = tonumber(hex:sub(1, 2), 16) or 0
local g = tonumber(hex:sub(3, 4), 16) or 0  
local b = tonumber(hex:sub(5, 6), 16) or 0

-- 使用 ITU-R BT.709 标准计算相对亮度
local brightness = (r * 299 + g * 587 + b * 114) / 1000
</code></pre>
</li><li><p><strong>判断逻辑</strong>：</p><ul><li><code>brightness &gt; 128</code> → 浅色环境 → <code>vim.o.background = &quot;light&quot;</code></li><li><code>brightness ≤ 128</code> → 深色环境 → <code>vim.o.background = &quot;dark&quot;</code></li></ul></li></ol><h3 id="-neovim-">⚙️ Neovim 内部</h3><ol start="1"><li><p><strong>background 选项</strong>：</p><ul><li>Neovim 内置选项，用于告知主题当前环境类型</li></ul></li><li><p><strong>主题响应</strong>：</p><pre class="language-lua lang-lua"><code class="language-lua lang-lua">background = { 
  light = &quot;latte&quot;,    -- vim.o.background = &quot;light&quot; 时使用
  dark = &quot;mocha&quot;,     -- vim.o.background = &quot;dark&quot; 时使用
},
</code></pre>
</li><li><p><strong>自动监听</strong>：使用 <code>OptionSet</code> autocmd 监听 <code>background</code> 选项变化，实时切换主题</p></li></ol><h3 id="-">🔄 工作流程</h3><pre class=""><code class="">Quickshell 切换日夜模式
    ↓
更新 colors.json 文件
    ↓  
Neovim 启动时读取文件
    ↓
计算背景色亮度
    ↓
设置 vim.o.background
    ↓
触发主题自动切换
</code></pre>
<p>以下是我的<code>./.config/nvim/lua/plugins/catppuccin.lua</code>主题文件的配置，可作参考：</p><pre class="language-lua lang-lua"><code class="language-lua lang-lua">return {
    &quot;catppuccin/nvim&quot;,
    name = &quot;catppuccin&quot;,
    priority = 1000,
    config = function()
      require(&quot;catppuccin&quot;).setup({
        background = {
          light = &quot;latte&quot;,  -- 浅色环境使用 latte
          dark = &quot;mocha&quot;,   -- 深色环境使用 mocha
        },
        transparent_background = false, -- 建议false
        show_end_of_buffer = false,
        term_colors = false,
        dim_inactive = {
          enabled = false,
          shade = &quot;dark&quot;,
          percentage = 0.15,
        },
        styles = {
          comments = { &quot;italic&quot; },
          conditionals = { &quot;italic&quot; },
          loops = {},
          functions = {},
          keywords = {},
          strings = {},
          variables = {},
        },
        integrations = {
          cmp = true,
          gitsigns = true,
          nvimtree = true,
          treesitter = true,
          telescope = true,
          -- 根据你的插件添加更多集成
        },
      })

      -- 主题检测（可选 - 适配你的桌面环境）
      local function detect_system_theme()
        -- 示例：检查系统配置文件
        local theme_file = vim.fn.expand(&quot;~/.local/state/quickshell/user/generated/colors.json&quot;)
        if vim.fn.filereadable(theme_file) == 1 then
          local success, content = pcall(vim.fn.readfile, theme_file)
          if success then
            local text = table.concat(content, &quot;\n&quot;)
            local bg_color = text:match(&#x27;&quot;background&quot;:%s*&quot;(#[%w]+)&quot;&#x27;)
            if bg_color then
              -- 计算颜色亮度
              local hex = bg_color:gsub(&quot;#&quot;, &quot;&quot;)
              local r = tonumber(hex:sub(1, 2), 16) or 0
              local g = tonumber(hex:sub(3, 4), 16) or 0
              local b = tonumber(hex:sub(5, 6), 16) or 0
              local brightness = (r * 299 + g * 587 + b * 114) / 1000

              vim.o.background = brightness &gt; 128 and &quot;light&quot; or &quot;dark&quot;
              return true
            end
          end
        end

        return false
      end

      -- 根据 background 选项应用对应主题
      local function apply_theme()
        if vim.o.background == &quot;dark&quot; then
          vim.cmd.colorscheme(&quot;catppuccin-mocha&quot;)
        else
          vim.cmd.colorscheme(&quot;catppuccin-latte&quot;)
        end
      end

      -- 初始化
      if not detect_system_theme() then
        -- 如果检测失败，使用默认设置
        vim.o.background = &quot;light&quot;  -- 或 &quot;dark&quot;，根据个人偏好
      end

      apply_theme()

      -- 监听 background
      vim.api.nvim_create_autocmd(&quot;OptionSet&quot;, {
        pattern = &quot;background&quot;,
        callback = apply_theme,
      })

      -- 手动切换
      vim.api.nvim_create_user_command(&#x27;ThemeLight&#x27;, function()
        vim.o.background = &quot;light&quot;
      end, { desc = &#x27;切换到浅色主题&#x27; })

      vim.api.nvim_create_user_command(&#x27;ThemeDark&#x27;, function()
        vim.o.background = &quot;dark&quot;
      end, { desc = &#x27;切换到深色主题&#x27; })

      -- 快捷键（可选）
      vim.keymap.set(&#x27;n&#x27;, &#x27;&lt;leader&gt;tl&#x27;, &#x27;:ThemeLight&lt;CR&gt;&#x27;, { desc = &#x27;浅色主题&#x27; })
      vim.keymap.set(&#x27;n&#x27;, &#x27;&lt;leader&gt;td&#x27;, &#x27;:ThemeDark&lt;CR&gt;&#x27;, { desc = &#x27;深色主题&#x27; })
    end,
  }
</code></pre>
<h2 id="">注意事项</h2><h3 id="-">⚠️ 配置文件路径依赖</h3><p> <strong>Quickshell 数据路径</strong>：</p><ul><li>当前路径：<code>~/.local/state/quickshell/user/generated/colors.json</code></li><li>如果 Quickshell 配置更改了数据生成路径，需要同步更新 Neovim 配置中的路径
### 🔧 配置维护
<ol start="1"><li><strong>主题优先级</strong>：</li></ol></li><li>Catppuccin 设置为 <code>priority = 1000</code>，确保在其他主题之前加载</li><li>Github-theme 设为 <code>lazy = true</code>，避免冲突</li></ul><ol start="2"><li><strong>备用机制</strong>：
<ul><li>如果颜色文件读取失败，默认设置为浅色模式</li><li>保留手动切换功能作为备用选项</li></ul></li></ol><h3 id="-">🐛 故障排除</h3><ol start="1"><li><p><strong>主题不切换</strong>：</p><ul><li>检查 <code>colors.json</code> 文件是否存在和可读</li><li>在 Neovim 中运行 <code>:echo vim.o.background</code> 查看检测结果</li><li>使用 <code>:messages</code> 查看是否有错误信息</li></ul></li><li><p><strong>颜色不协调</strong>：</p><ul><li>检查透明背景设置：<code>transparent_background = false</code></li><li>确认终端颜色序列正常：<code>cat ~/.local/state/quickshell/user/generated/terminal/sequences.txt</code></li></ul></li><li><p><strong>手动测试</strong>：</p><pre class="language-lua lang-lua"><code class="language-lua lang-lua">-- 在 Neovim 中测试
:lua print(vim.fn.expand(&quot;~/.local/state/quickshell/user/generated/colors.json&quot;))
:lua print(vim.fn.filereadable(vim.fn.expand(&quot;~/.local/state/quickshell/user/generated/colors.json&quot;)))
</code></pre>
</li></ol><h3 id="-">📂 相关文件位置</h3><ul><li><strong>Neovim 主题配置</strong>：<code>~/.config/nvim/lua/plugins/catppuccin.lua</code></li><li><strong>Quickshell 颜色数据</strong>：<code>~/.local/state/quickshell/user/generated/colors.json</code></li><li><strong>终端颜色序列</strong>：<code>~/.local/state/quickshell/user/generated/terminal/sequences.txt</code></li><li><strong>Quickshell 主配置</strong>：<code>~/.config/illogical-impulse/config.json</code></li></ul><hr/><p><strong>我的环境</strong>：Arch Linux + Hyprland +illogical-impulse(dot-file) + Neovim + LazyVim</p></div><p style="text-align:right"><a href="https://inkcodes.com/posts/tech/hyprland-end4neovim#comments">览毕，何不一言？</a></p></div>]]></description><link>https://inkcodes.com/posts/tech/hyprland-end4neovim</link><guid isPermaLink="true">https://inkcodes.com/posts/tech/hyprland-end4neovim</guid><dc:creator><![CDATA[specialhua]]></dc:creator><pubDate>Thu, 04 Sep 2025 14:29:20 GMT</pubDate></item></channel></rss>