edgevoid
|
52f0004195
|
修: 发布release.sh 的 BODY 内层双引号把 shell 字符串截断
发版 1.3.6 时脚本报 "未预期的记号 ( 附近有语法错误" —— 根因是我在 BODY 正文里
写了内层双引号("没声音" / "一时全空一时拉满"), 直接把 BODY="..." 截断了。
改成中文引号「」。
|
2026-09-14 08:05:00 +08:00 |
|
edgevoid
|
c23936e69f
|
发版 1.3.6: 打包脚本版本号 + release 说明更新
- 打包deb.sh: VER 1.3.0 -> 1.3.6
- 发布release.sh: release 正文补 1.3.1~1.3.6 的改动清单
v1.3.6
|
2026-09-14 08:04:19 +08:00 |
|
edgevoid
|
4bc381604b
|
v1.3.6: 电平表缩放加"平均+变速" —— 消除量程一跳一跳
老板: "我觉的应该给缩放加点平均和变速算法, 这样就不会出现一下出现一下拉满了"
根因: 之前纯按瞬时极值(最近2秒的 max/min)定量程, 单帧瞬态就能把量程猛地张开/
收缩, 观感"一时全空一时拉满"。
两层平滑(思路同压缩器 attack/release):
① 平均: 峰值/谷值各走 EMA —— 峰值涨得快(.28)落得慢(.08), 谷值反过来
-> 单帧毛刺不再定调
② 变速: 目标量程走**非对称** EMA —— 张开快(.30, 大声音进来立刻扩不削顶),
收缩慢(.07, 安静段不急着缩), 避免波形忽大忽小
- 中心走 EMA(.12) 保证"居中"不跳
- 首帧直接就位, 不让开机时慢慢爬
- 显示仍 6dB 步进
模拟实测(安静 -> 一帧 -6dBFS 突发 -> 中等 -> 安静, 帧内跨度 30dB):
最大单帧量程跳变仅 6dB; 突发帧量程 54->60(而不是跳到 90+); 之后 60->66->60 缓慢回落。
|
2026-09-14 07:59:42 +08:00 |
|
edgevoid
|
520b007b54
|
v1.3.5: 电平表波形放大 —— 量程跟随信号实际幅度 (波形占约 2/3)
老板反馈"你只改了一半还有一半还没实现, 现在确实压低了, 波形再放大一点就好看了":
1.3.4 只做了"压低"(波峰从贴顶挪到中线), 但波峰在正中时波形只占上半区、下半区
全空 —— 又小又浪费。这次做"放大"。
改法(把固定量程换成自适应):
- 量程 = 信号跨度 × 1.45 -> 波形固定占画布约 2/3, 上下各留一半余量(垂直居中)
- 跨度只看最近 2 秒(拿整 12 秒极值会被历史瞬态拖住); 用 rms 当"谷"更稳
- 跨度下限 18dB(信号平直时别把噪声放大成锯齿), 上限 72dB
- 6dB 步进 -> 不逐帧抖; 顶线允许超过 0dBFS(多出来的是留白); 0dBFS 单独画亮基准线
- 网格与左侧标签跟着量程走(不再写死 SPAN=48)
顺带修自己引入的 bug: mn 初值曾用 fallback(-60), 把底线拖到 -66, 波形反而更小(21%)。
CDP 实测四档(跨度 10/14/18/24dB): 波形占画布 42% / 47% / 60% / 57%, 上下留白对称。
|
2026-09-14 07:55:16 +08:00 |
|
edgevoid
|
f3645accd5
|
v1.3.4: 两个电平表(原始/处理后)波形垂直居中 —— 波峰落在画布正中
★ 更正上一版改错的对象: 老板说的是「原始电平」和「处理后电平」两个表的波形,
1.3.3 我改成了「响度归一化」的增益曲线。现在把对的这两个也改了(归一化那边保留)。
根因: meterTop() 的顶线 = 最近 2 秒峰值 + 3dB, 于是波峰永远贴在画布最上沿,
看着就是被上面那行标题压住("太靠上波形被盖住了")。
改法:
- 顶线 = 峰值 + SPAN/2 -> 波峰正好落在画布垂直中线, 上下各留半屏
- 顶线允许超过 0dBFS(那只是绘图范围, 多出来的是留白); 上下限放宽到 ±48
- 0dBFS 单独画一条亮基准线(在可见范围内才画), 刻度不失参照
- 6dB 步进保留(不逐帧抖)
CDP 注入三档电平(-6 / -12 / -30 dBFS)实测: 波峰偏离画布中线均为 0px, 上下留白对称。
|
2026-09-14 07:50:37 +08:00 |
|
edgevoid
|
4768b2211d
|
v1.3.3: 响度归一化曲线改动态量程 —— 波峰自动落在图表垂直正中
原来量程固定 ±20dB, 而增益常年偏一边(实测 +4.6dB 整条压在上半区)。现在按最近
120 个样本的 min/max 定中心 mid=(lo+hi)/2 与半幅 half=(hi-lo)/2*1.24:
- 半幅下限 2dB -> 曲线接近平直时不会把噪声放大成锯齿
- 半幅上限 30dB -> 量程不会失控
- mid/half 各走一阶低通(每帧 12%) -> 平移/缩放平滑, 不"呼吸"抖动
- 网格与左侧标签跟着量程走, 显示真实 dB 值(不再固定 +20/0/-20)
- 0dB 基准线只在可见范围内才画
CDP 实测: 三个场景(波峰+12/波谷+2 / 波峰-4/波谷-16 / 几乎平直+4.6)中值偏离
画布正中线均为 0px。
|
2026-09-14 07:47:36 +08:00 |
|
edgevoid
|
1e635f251b
|
v1.3.2: 面板补 favicon + 修响度曲线被压; 纠正"物理输出对齐虚拟声卡"的错误假设
面板:
- 加内联 SVG favicon(深底 + 五根声波柱), 之前没有 favicon 浏览器显示默认破图标
- 响度归一化卡片: 高度 184 装不下(标题22+推子22+文字行20+间距 ≈ 70px), 而 #ln 只扣
46px -> canvas 溢出、上沿被「目标/判据」那行文字压住。改: 卡片 210px、#ln 扣 74px、
网格 430->456(把这 26px 补给上面两个电平表, 免得它们被压矮)。实测无重叠, #ln 126px
★ 重要纠正(2026-09-14 老板当场抓出):
- 物理输出音量是**档位**, 不是"越大越响" —— 响度由 DSP 归一化保证(实测 0.35 就很好)
- 上一版错误地把它"对齐"到虚拟声卡(1.0) -> 进削波保护、动态被压扁: 面板波形顶满
而听感反而更小(老 bug 复现)。已撤掉三处:
· webui.py 桥启动的"对齐一次" -> 只兜静音
· 音频守护.py 第9项"物理≠虚拟就纠" -> 只在静音/近乎归零(<0.02)时才动手
· fix_phys_volume() 不再写正常档位
- config/组件配置单.json: 改记「档位 0.35」+ 写明教训
|
2026-09-14 07:44:08 +08:00 |
|
edgevoid
|
52b539cdfb
|
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
|
2026-09-14 07:31:05 +08:00 |
|
edgevoid
|
d8c3a27821
|
v1.3.0: 离线渲染(音频/视频→空间音频FLAC, 渲染锁+文件就绪检查) + 组件看门狗(30s核对期望状态并自愈)
- 离线渲染.py: pan上混5.1 → sofalizer(H4 SOFA) → 房间IR(afir) → loudnorm → 96k FLAC
视频自动取音轨; 已是5.1的片源不重上混; 实测约 4.4 倍速
两道锁: (1)渲染锁 —— 一轮任务期间拒绝新任务, 不排队堆积
(2)文件就绪检查 —— 相隔1.2s两次stat大小/时间不变且ffprobe能读, 未落盘的跳过
三个入口: 命令行 / 面板「离线渲染」区(拖拽或贴路径, 实时进度+日志+取消) / 右键「打开方式」
- 音频守护.py + config/组件配置单.json: 30s 核对 DSP进程数与槽位新鲜度/链输出连线/
默认设备/虚拟声卡优先级/中间级音量/节点份数/面板/物理设备静音, 扫到就修
(能温和就温和, 链路级才重建), 同类问题 90s 冷却, 连续 3 次修不好转只报警
- 组件配置单.md: 链路拓扑 + 组件表 + 六个必须 + 自愈表
- 面板: 控制滑块从图表卡片独立成「控制」卡片; 数字/模拟输出音量条拉长到各占一半
(合计 = 虚拟声卡开关卡片总高); 新增离线渲染区
- 修: DSP 孤儿抢共享槽位导致重建后无声(claim_slot 抢不到槽位即退出 + 重建前收旧 DSP)
- 修: 打包会把正在用的 PipeWire 配置移开(prune_duplicate_confs 只在自己写到生效目录时清理)
- 修: 离线渲染的 SOFA/混响IR 改为多路径探测(开发目录与 deb 包内布局不同)
- .gitignore: 保留 reverb/ 房间IR(离线渲染要卷积的素材)
v1.3.0
|
2026-09-13 23:24:22 +08:00 |
|
edgevoid
|
18cc030cac
|
v1.2.0: 全系统响度归一化(pipe 插件挂自研 DSP) + 目标响度可调 + 控制台 4 路电平/增益历史
新增功能
- 响度归一化/: 挂未文档化的 filter-chain `pipe` 插件跑自研 DSP, 把任何往虚拟声卡
推流的软件(Chrome/播放器/短视频)响度拉平到同一目标。ITU-R BS.1770 滑窗能量 ->
联合响度 -> 目标增益(6 dB/s 限速 + 峰值保护), 左右声道共享同一增益防声像漂移。
实测: 输入 20 dB 差 -> 输出 0.02 dB 差; 开销约 30% 单核; 延迟 +11 ms
- 目标电平可调(热生效, 不重建链路): 面板「目标响度」滑块(-40 ~ -6 dBFS) /
POST /api/loudness {"target_db"} / 直接改 ~/.local/state/cinema-spatial/loudness.json,
DSP 每秒重读该文件 -> 1 秒内跟上
- 控制台: 电平表拆成 4 路(原始 L/R + 处理后 L/R, 绿/蓝两条线), 新增增益历史曲线
(看得到"锁住 -> 换段 -> 追赶"的全过程); 修表头被长数值挤扁
关键实现决定(都是实测撞出来的)
- 归一化必须做成**独立 filter-chain 实例**串在上混图之前 —— pipe 节点塞进那个
40+ 节点的大图里(图入口/copy 之后/输出末端都试过)会被正常 fork、数据也在流,
但收到的永远是恒定 -43 dBFS 空数据, 音频绕过, 零报错
- pipe 的 command 必须是**纯 ASCII 路径**: 传中文路径时静默失效(节点照建、音频
绕过、DSP 不 fork、无日志) -> 入口固定为 /usr/bin/collaplex-loudness-norm
- 整条链必须有下游消费者, 否则图不被驱动, DSP 收到全 0
- 系统级(/usr/share)与用户级(~/.config)的**同名 conf 会被同时加载**(不是覆盖),
会建出两份同名节点让音频进错实例 -> 铁律: 同名只留一份
打包
- 补入 loudness/loudness_norm.py 与 /usr/bin/collaplex-loudness-norm(ASCII 路径)
- 生成配置时用 CINEMA_SPATIAL_LN 指定包内入口(开发机是 ~/.local/bin)
- postinst: 装完自动启动控制台并打开浏览器(su 到登录用户 + 补 XDG_RUNTIME_DIR)
- 依赖加 xdg-utils
v1.2.0
|
2026-09-13 18:06:52 +08:00 |
|
edgevoid
|
3d3ce35507
|
验收测试.sh: 包名不再写死版本(取最新构建)
|
2026-09-13 16:43:51 +08:00 |
|
edgevoid
|
f1a1199ae3
|
v1.1.1: README 重写为正式文档(概述/核心技术/信号链/参数/已知问题/实测数据/版本记录); 打包版本跟随 VER
|
2026-09-13 16:43:36 +08:00 |
|
edgevoid
|
a7d0e88bec
|
v1.1.0: 单声道合并 / 运行期重连(切设备不重启) / 等目标回来(蓝牙重连) / 能量归一修削波 / 电平显式连线不经麦克风 / 面板核心技术区 / 打包修 control 版本+补音频状态.py与web目录
v1.1.1
|
2026-09-13 16:38:00 +08:00 |
|
edgevoid
|
06f8680e63
|
fix: 音量持久化(node.volume 进配置 + 开时补写) -- 根因是 filter-chain 重建后音量回 1.0 导致爆音反复; feat: 电平贝塞尔图 + Web 控制台
v1.1.0
|
2026-09-13 07:10:53 +08:00 |
|
edgevoid
|
cddb174ee3
|
chore: gitignore 忽略 __pycache__
|
2026-09-13 07:04:52 +08:00 |
|
edgevoid
|
d3dfa73b7b
|
feat: Web 控制台(web/) -- 状态总览/模式切换/音量/一键修复失声, 零依赖 stdlib
|
2026-09-13 07:04:44 +08:00 |
|
edgevoid
|
38e2e2f68a
|
release: v1.0.1 -- 空间音频设备自检 + README 补4条实测坑(峰值因子/音量分层/USB profile/pw-cli info)
|
2026-09-13 06:50:35 +08:00 |
|
edgevoid
|
589244d4c3
|
feat: 空间音频命令带设备自检 —— USB 耳机 profile 变化(iec958<->analog)导致 node.target 失效时自动重新探测并重建
v1.0.1
|
2026-09-13 06:45:14 +08:00 |
|
edgevoid
|
9d3265aa28
|
fix: 输出目标自动探测物理设备(去硬编码, 可移植); 加 91-clock 与 release 发布脚本
|
2026-09-13 00:00:46 +08:00 |
|
edgevoid
|
68db84a10c
|
初始化: 耳机电影院空间音频(PipeWire filter-chain + SADIE-II HRTF)
- 两个虚拟声卡: 5.1 直通版 / 立体声矩阵上混版
- 全链路 96kHz/24bit, SADIE-II 真人 HRTF 96K/512tap
- 命令: 空间音频(开关) / mpv-影院(单程序)
- deb 打包 + 验收测试脚本
- README 记录 9 个实测踩坑(增益校准/采样率/相位等)
v1.0.0
|
2026-09-12 23:52:43 +08:00 |
|