Linux 下让机械革命星耀 14 的麦克风和扬声器同时工作

本文记录机械革命星耀 14(P916F-STX,AMD Strix Point、Realtek ALC256,子系统 1d05:e004)在 Linux 下的音频修复过程与最终方案。它解决两个互相独立的问题:默认数字麦克风不能录音,以及第二组内置扬声器 0x1B 没有启用造成的音量小、低频少、声音发薄。最终方案不依赖 KDE、GNOME 或其他桌面音频面板,只依赖 PipeWire、WirePlumber、ALSA 和 systemd。

故障表现

默认 HiFi 配置下:

  • 内置麦克风的音量条固定在约 79%;
  • 录音只有一声“嗒”,没有有效人声;
  • 内置扬声器正常。

把 Ryzen 声卡切换到 Pro Audio 后:

  • 麦克风可以正常录音;
  • 内置扬声器没有声音;
  • 手动打开扬声器后暂时恢复,但重启 WirePlumber 又会变成静音;
  • 输出声道显示为 AUX0/AUX1,KDE 的逐声道测试只播放沙沙的通用测试信号。

最终通过禁止 WirePlumber 对这张 ALC256 声卡使用 ACP profile/mixer 管理,让 PipeWire 直接创建原始 HDA 播放和录音节点,麦克风和扬声器可以同时工作,声道也恢复为标准的 front-left/front-right。再把 ALC256 的 0x1B 节点切成输出并解除静音后,第二组内置扬声器开始工作,实测响度、低频和清晰度恢复到接近 Windows 的水平。

原因

这台机器暴露了两条录音路径:

  • AMD ACP-PDM 数字麦克风:acppdmmach;
  • Realtek ALC256 HDA 模拟录音和播放设备:Generic_1。

默认 HiFi/UCM 配置选择 ACP-PDM。实际抓取数据时,这条路径持续输出异常的 32 位饱和值,因此音量条看似有输入,录音却只有开头的一声“嗒”。

普通 Pro Audio profile 会绕过 UCM,直接暴露 ALC256 的 PCM,所以麦克风恢复。但此时 ACP 仍负责 card profile 和硬件 mixer 管理;WirePlumber 每次重新创建声卡时都会把 Speaker Playback Switch 关闭。仅运行一次 amixer 或 alsactl store 不能从根本上解决这个问题。

麦克风与基本播放共存的关键参数是:

api.alsa.use-acp = false

它只应用于这张 ALC256 声卡,关闭 ACP profile/mixer 管理,直接枚举 ALSA PCM。这样既绕过坏掉的 ACP-PDM 录音路径,也阻止 WirePlumber 再次关闭扬声器硬件开关。

音质问题还有第二个原因:Linux 从 BIOS 读取到的 0x1B 默认配置是未连接节点,并把它保持在输入、静音状态;但 Windows 的 E004 机型配置同时设置了 Pin14=04 与 Pin1b=04。在本机只执行下面两个最小 HDA 动作后,原本缺失的扬声器通路立即恢复:

hda-verb /dev/snd/hwC1D0 0x1b SET_PIN_WIDGET_CONTROL 0x40
hda-verb /dev/snd/hwC1D0 0x1b SET_AMP_GAIN_MUTE 0xb000

其中卡号 1 并不稳定,所以持久化脚本会按 codec ID 与 subsystem ID 自动寻找设备,而不是写死卡号。

1. 找出本机的稳定设备名

不要照抄 card 1、wpctl 57 之类的数字编号,它们可能在重启或插拔设备后变化。

查看 PipeWire 声卡:

pactl list cards short

本文机器上的 ALC256 声卡名是:

alsa_card.pci-0000_c1_00.6

查看 ALSA 卡名:

cat /proc/asound/cards
aplay -l
arecord -l

本文机器上的稳定 ALSA ID 是:

Generic_1

其他机器必须使用自己的实际声卡名和 ALSA ID。

2. WirePlumber 0.5 及以上的最终配置

检查版本:

wireplumber --version

创建配置目录:

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

创建 ~/.config/wireplumber/wireplumber.conf.d/51-xingyao-audio.conf:

monitor.alsa.rules = [
  {
    matches = [
      {
        device.name = "alsa_card.pci-0000_c1_00.6"
      }
    ]
    actions = {
      update-props = {
        api.alsa.use-acp = false
      }
    }
  }
]

然后重启 WirePlumber:

systemctl --user restart wireplumber.service

这会短暂中断声音。不要修改 /usr/share/wireplumber/ 里的文件,它们属于发行版软件包,升级时会被覆盖。

如果要让配置对所有用户生效,可以把同一个文件放到:

/etc/wireplumber/wireplumber.conf.d/51-xingyao-audio.conf

本机使用 Plasma Login Manager,其登录界面会以 plasmalogin 用户单独运行 WirePlumber。因此应采用系统级规则:仅写入自己的 ~/.config 不能约束登录界面的音频会话。排查发现,开机修复服务运行时 Speaker 是 100%,进入桌面后却变成 64%;单独重启当前用户的 WirePlumber 未复现下降。将同一规则扩展为系统级后,再次重启并登录,Master/Speaker 都保持 100%(0 dB),用户确认响度正常。这支持登录界面音频会话覆盖硬件增益的判断,但未抓取到具体写入调用。附带安装器会把同一规则安装为 /etc/wireplumber/wireplumber.conf.d/50-xingyao-e004-system.conf,不要重复创建两个系统级文件。

为什么界面不再显示 Pro Audio

禁用 ACP 后,pactl 中的 profile 可能显示为:

Active Profile: on

这是正常的。此时不是回到了 HiFi/UCM,而是 PipeWire 直接枚举原始 ALSA PCM;效果比只选择 pro-audio 更底层。

本文机器上创建出的节点是:

alsa_output.pci-0000_c1_00.6.playback.0.0
alsa_input.pci-0000_c1_00.6.capture.0.0

3. 旧版 WirePlumber 0.4

WirePlumber 0.4 使用 Lua 配置。创建 ~/.config/wireplumber/main.lua.d/51-xingyao-audio.lua:

local rule = {
  matches = {
    {
      { "device.name", "equals", "alsa_card.pci-0000_c1_00.6" },
    },
  },
  apply_properties = {
    ["api.alsa.use-acp"] = false,
  },
}

table.insert(alsa_monitor.rules, rule)

然后重启 WirePlumber。WirePlumber 0.5 已不再读取旧式 Lua 配置,因此两个版本的配置不能混用。

4. 设置默认输入和输出

禁用 ACP 后节点名发生变化,原来保存的默认设备可能失效,系统甚至可能暂时选中 HDMI 输出。

设置 ALC256 为默认输出和输入:

pactl set-default-sink alsa_output.pci-0000_c1_00.6.playback.0.0
pactl set-default-source alsa_input.pci-0000_c1_00.6.capture.0.0

检查:

pactl get-default-sink
pactl get-default-source

WirePlumber 会把默认节点保存在用户状态目录中,后续启动通常会自动恢复。

5. 打开扬声器硬件开关并设置增益

查看当前 ALSA mixer:

amixer -D hw:Generic_1 sget Master
amixer -D hw:Generic_1 sget Speaker

打开 Master 和 Speaker,并把硬件输出恢复到 0 dB:

amixer -D hw:Generic_1 sset Master 100% unmute
amixer -D hw:Generic_1 sset Speaker 100% unmute

本文机器上 Speaker 64% 实际对应 -23.25 dB,音量会非常小。因此把 ALSA 硬件增益设为 100%,平时再用 PipeWire 控制听感音量,例如:

wpctl set-volume @DEFAULT_SINK@ 0.5
wpctl set-mute @DEFAULT_SINK@ 0

在确认左右声道都显示 [on] 后保存 ALSA 状态:

sudo alsactl store Generic_1

使用 systemd 的发行版通常会由 alsa-restore.service 在开机时恢复:

systemctl status alsa-restore.service

仅在当前用户禁用 ACP 时,本机仍出现重启后 Speaker 增益降为 64%(−23.25 dB)的现象。单纯在开机服务里恢复增益也未解决,因为后续登录界面有独立的音频会话。最终组合是系统级 WirePlumber 规则,加上下文的修复服务:恢复 Master/Speaker 的 0 dB 硬件增益并启用 0x1B。该组合已通过重启试听,日常听感音量仍用 PipeWire 调节。

6. 启用 E004 的第二组内置扬声器

先安装提供 hda-verb 的软件包。在 Arch/CachyOS 上是:

sudo pacman -S alsa-tools

临时验证时,先从 /proc/asound/card*/codec#0 确认以下两项完全匹配:

Vendor Id: 0x10ec0256
Subsystem Id: 0x1d05e004

然后对实际的 HDA control device 执行前述两个 verb。本方案附带的 test-e004-speaker-pin.sh 会自动核对硬件、DAC 0x02 和 EAPD 状态,并支持 on/off,比手动写死 /dev/snd/hwC1D0 安全:

sudo bash test-e004-speaker-pin.sh on
sudo bash test-e004-speaker-pin.sh off

HDA pin 状态会在关机、驱动重载或某些休眠恢复后丢失。附带的持久化方案由两部分组成:systemd 开机服务,以及 systemd-sleep 恢复钩子。安装命令为:

sudo bash install-e004-speaker-fix.sh

它会安装以下四个文件:

/usr/local/libexec/xingyao-e004-speaker-fix
/etc/systemd/system/xingyao-e004-speaker-fix.service
/etc/systemd/system-sleep/xingyao-e004-speaker-fix
/etc/wireplumber/wireplumber.conf.d/50-xingyao-e004-system.conf

底层 helper 每次运行都会重新匹配 ALC256 + 1d05:e004,并核对 0x1B 仍使用已验证的 DAC 与 EAPD 状态;不匹配就直接退出。它恢复 Master/Speaker 到 0 dB 并解静音,再应用已经试听验证过的两个 verb。服务安排在 ALSA 状态恢复服务之后运行。配合系统级规则,开机后音量已通过实机验证;休眠唤醒仍待单独验证。

更新脚本后重新运行安装命令即可应用新版本。卸载会恢复 0x1B 的输入/静音状态,但不会还原 Master/Speaker 安装前的增益;需要时可自行用 amixer 调整。

检查持久化服务:

systemctl status xingyao-e004-speaker-fix.service
journalctl -u xingyao-e004-speaker-fix.service -b

7. 验证

检查声道映射

pactl list sinks | grep -E 'Name:|Channel Map:'

目标输出应显示:

Channel Map: front-left,front-right

这也会让 KDE 的逐声道测试重新播放 “Front Left”和“Front Right”,而不是对 AUX0/AUX1 播放通用测试噪声。

验证扬声器

aplay -D pipewire /usr/share/sounds/alsa/Front_Left.wav
aplay -D pipewire /usr/share/sounds/alsa/Front_Right.wav

验证麦克风和回放

arecord -D pipewire -f S16_LE -r 48000 -c 2 -d 5 /tmp/mic-test.wav
aplay -D pipewire /tmp/mic-test.wav

检查第二组扬声器节点:

sed -n '/Node 0x1b /,/Node 0x1c /p' /proc/asound/card*/codec#0

目标状态包含:

Amp-Out vals:  [0x00 0x00]
Pin-ctls: 0x40: OUT
EAPD 0x2: EAPD
Connection: 2
   0x02* 0x03

本文机器上最终验证结果:内置麦克风可以正常录音;0x14 与 0x1B 扬声器通路同时工作;WirePlumber 重启后基本扬声器开关不再关闭。现场试听确认,启用 0x1B 后响度、低频和清晰度都明显改善,效果已接近 Windows。

为什么只切换 Pro Audio 还不够

不使用桌面环境时,可以用下面的命令临时切换 profile:

pactl set-card-profile alsa_card.pci-0000_c1_00.6 pro-audio

这适合用来确认 HDA 麦克风是否能工作,但不是本文机器上的最终修复:

  • 它仍使用 ACP 管理 profile 和 mixer;
  • WirePlumber 重启时可能再次关闭 Speaker Playback Switch;
  • Pro Audio 节点使用 AUX0/AUX1 声道标记,部分逐声道测试工具只能播放通用测试信号。

因此最终配置选择针对该声卡设置 api.alsa.use-acp = false。

适用范围

这是一套可移植的排查与配置方法,但不是所有电脑都能原样照抄:

  • 适用于 PipeWire + WirePlumber,与 KDE、GNOME、Sway、Hyprland 等桌面环境无关;
  • PCI 声卡名、ALSA ID 和节点名必须替换成目标机器的实际值;
  • 只有当 HDA PCM 的录音端确实连接到可用麦克风时,这条绕行路径才成立;
  • 如果 amixer scontrols 中没有 Speaker,目标机器需要不同的 mixer 控件或 UCM 修复;
  • 0x1B 修复只在 ALC256 + subsystem 1d05:e004 上经过验证,其他子系统不能直接照抄;
  • 禁用 ACP 会失去自动 profile、端口和插孔策略。如果经常使用耳机,应额外测试耳机插拔与自动静音行为。

回滚

先卸载 E004 的 0x1B 持久化修复。卸载脚本会停止并禁用服务、把节点恢复成固件默认的输入/静音状态,然后删除服务、helper、恢复钩子,以及内容仍与附带样例相同的系统级 WirePlumber 规则(手工改过的规则会保留):

sudo bash uninstall-e004-speaker-fix.sh

再回滚 WirePlumber 配置。

删除配置并重启 WirePlumber:

rm ~/.config/wireplumber/wireplumber.conf.d/51-xingyao-audio.conf
systemctl --user restart wireplumber.service

然后重新选择正常 HiFi profile:

pactl set-card-profile alsa_card.pci-0000_c1_00.6 'HiFi (Mic1, Mic2, Speaker)'

如果默认节点仍指向已经消失的原始 PCM,可以使用:

wpctl clear-default

再从桌面设置或 pactl set-default-* 选择需要的设备。

测试环境

机型:MECHREVO XINGYAO Series-P916F-STX
平台:AMD Strix Point
声卡:Realtek ALC256、AMD ACP70
系统:CachyOS
PipeWire:1.6.8
WirePlumber:0.5.17

参考资料

posted @ 2026-09-22 02:18  GOKORURI  阅读(88)  评论(1)    收藏  举报