52b539cdfb
根因: 菜单音量桥的约定是「虚拟声卡=音量真源, 物理输出=执行器」, 但桥只监视虚拟声卡 的变化(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
42 lines
1.6 KiB
Bash
Executable File
42 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# 启动 Collaplex 音效 Web 控制台(后台运行, 重复执行不会起第二个)
|
|
PORT="${1:-8788}"
|
|
P=$(ss -ltnp 2>/dev/null | grep ":$PORT" | grep -oP 'pid=\K[0-9]+' | head -1)
|
|
if [ -n "$P" ]; then
|
|
echo "已在运行 (PID $P): http://127.0.0.1:$PORT/"
|
|
exit 0
|
|
fi
|
|
cd "$(dirname "$(readlink -f "$0")")" || exit 1
|
|
nohup python3 webui.py --port "$PORT" >/tmp/cinema-webui.log 2>&1 &
|
|
sleep 1
|
|
if ss -ltn 2>/dev/null | grep -q ":$PORT"; then
|
|
echo "已启动: http://127.0.0.1:$PORT/"
|
|
else
|
|
echo "启动失败, 见 /tmp/cinema-webui.log"
|
|
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
|