v1.3.1: 修断电隔夜重启后"又没声音"(物理输出从存档恢复成旧值, 桥只监视变化不兜底)

根因: 菜单音量桥的约定是「虚拟声卡=音量真源, 物理输出=执行器」, 但桥只监视虚拟声卡
的变化(v != ref 才折算写物理)。断电重启后物理输出从 WirePlumber 存档恢复成旧值
(实测 0.35, 而虚拟声卡 1.0 = 小 9 dB), 虚拟声卡没变 -> 桥永远不动物理 -> 声音就小着。
而看门狗没起来(非自启), 整晚没人兜底。

- web/webui.py: 桥启动时(BRIDGE_REF is None 那次)把物理输出对齐一次
- 音频守护.py: 新增第 9 项检查「物理输出音量 ≠ 虚拟声卡」(容差 0.03; 虚拟声卡自身
  <0.1 时不判 —— 那是真被调小了) -> 自动纠回, 破坏测试实测 22 秒纠回
- config/组件配置单.json: 登记「音量应与虚拟声卡一致」期望项
- web/启动.sh: 起来时顺带拉起看门狗(已在跑不重复起) —— 不违背"不自启"的习惯,
  但重启后一用面板就有人守; 看门狗 setsid 脱离, 挂在 systemd --user 下
- README: 版本记录 1.3.1
This commit is contained in:
edgevoid
2026-09-14 07:31:05 +08:00
parent d8c3a27821
commit 52b539cdfb
5 changed files with 92 additions and 1 deletions
+10
View File
@@ -722,6 +722,16 @@ def vol_bridge_tick() -> str | None:
# ★ 不能采信 VOL_FILE(存档): 重建/别处改动之后实况可能与存档不一致,
# 那桥会把这个差值当成"菜单音量"折算一次 → 音量无故跳一下(2026-09-13 教训)。
BRIDGE_REF = v if v > 0.01 else 0.35
# ★★ 启动时顺手把**物理输出对齐一次**(2026-09-14 教训): 断电隔夜重启后物理输出会
# 从 WirePlumber 存档恢复成旧值(实测 0.35 而虚拟声卡是 1.0) —— 桥只"监视变化",
# 虚拟没变它就永远不动物理, 于是整晚/整天的声音都小 9 dB。启动时对齐一次即可。
p0, pm0 = vol_of(BRIDGE_PID, timeout=4)
if pm0:
sh("wpctl", "set-mute", str(BRIDGE_PID), "0", timeout=4)
return "启动同步: 物理输出原本静音 → 已解除"
if p0 >= 0.0 and abs(p0 - BRIDGE_REF) > 0.02:
msg = set_speaker(BRIDGE_REF)
return "启动同步: 物理输出 %.3f%.3f (对齐虚拟声卡) — %s" % (p0, BRIDGE_REF, msg)
return None
ref = BRIDGE_REF
p, _pm = vol_of(BRIDGE_PID, timeout=4)
+23
View File
@@ -16,3 +16,26 @@ else
cat /tmp/cinema-webui.log
exit 1
fi
# ---------------------------------------------------------------- 看门狗
# ★ 2026-09-14: 隔夜断电重启后"又没声音"的真因之一 = 看门狗没起来(它刻意不做开机自启,
# 这是老板的习惯), 于是重启后没人看着链路(那次是物理输出被恢复成旧值 0.35)。
# 面板是日常入口, 由它顺手把看门狗拉起最自然 —— 不算"自启", 但重启后一用面板就有人守。
# 判在不在跑一律读 /proc/<pid>/cmdline: grep -f 会匹配到自己的命令行把自己算进去。
n=0
for d in /proc/[0-9]*; do
[ -r "$d/cmdline" ] || continue
if tr '\0' ' ' < "$d/cmdline" 2>/dev/null | grep -q '音频守护\.py'; then
n=$((n + 1))
fi
done
if [ "$n" -eq 0 ]; then
GD="$(dirname "$(readlink -f "$0")")/.."
mkdir -p "$HOME/.local/state/cinema-spatial"
( cd "$GD" && setsid -f python3 音频守护.py \
> "$HOME/.local/state/cinema-spatial/guardian-console.log" 2>&1 )
sleep 1
echo "看门狗: 已拉起(30 秒一轮, 扫到问题自动修)"
else
echo "看门狗: 已在跑($n 个)"
fi