Files
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

95 lines
4.1 KiB
JSON

{
"_说明": "电影院空间音频链路 —— 组件期望状态单。音频守护.py 读本文件逐项核对, 不符合就自动修复。",
"_版本": "2026-09-13",
"_依据": "2026-09-13 全链路修复后实测的稳定状态(当晚修掉 6 个坑: 双份conf/中间级被写坏/两滑块同源/上混未归一/HDMI抢默认/DSP孤儿)",
"项目目录": "/home/lou/桌面/工作区/实验/空间音频",
"配置真源": "~/.config/pipewire/pipewire.conf.d/{90-cinema-spatial.conf,91-clock.conf}",
"状态目录": "~/.local/state/cinema-spatial",
"日志": "~/.local/state/cinema-spatial/guardian.log",
"节点": {
"_说明": "滤波链的全部节点, 每个名字必须**恰好 1 份**(双份同名 conf 会各建一套 → 整链静默)",
"全部": [
"cinema_spatial_sink",
"cinema_spatial_out",
"cinema_spatial_up_sink",
"cinema_spatial_up_norm",
"cinema_spatial_up_raw",
"cinema_spatial_up_out"
],
"必须单位增益": [
"cinema_spatial_up_norm",
"cinema_spatial_up_raw"
],
"_单位增益说明": "中间两级是链内部节点, 不归用户调。被写低会凭空掉十几 dB, 而账面只算首尾两级 → 看着正常却没声音",
"虚拟声卡": [
"cinema_spatial_up_sink",
"cinema_spatial_sink"
],
"虚拟声卡最低优先级": 2000,
"_优先级说明": "priority.session 必须压过所有物理输出(本机 HDMI 1196 / USB 1108 / 板载 1009), 否则默认设备被 HDMI 抢走且点不回来"
},
"默认输出": {
"必须是": "cinema_spatial_up_sink",
"_说明": "媒体键/GNOME 顶栏改的就是这一级的音量, 由面板的菜单音量桥折算到物理输出"
},
"DSP": {
"脚本": "响度归一化/loudness_norm.py",
"进程数": 2,
"_进程数说明": "左右声道各一。多于 2 个 = 孤儿抢共享槽位 → 整链静音; 0 个 = 链里没有消费者 → 静音",
"共享区": "/dev/shm/collaplex-loudness",
"槽位数": 2,
"槽位新鲜秒": 5,
"_新鲜度说明": "每个槽 +16 是 f64 时刻, 超过该秒数没更新即为僵死",
"目标响度dBFS": -14.0,
"输出峰值上限": 0.985,
"_输出峰值说明": "PEAK_CEIL, DSP 输出不会超过 -0.13 dBFS",
"参数": {
"LN_MAX_BOOST": 12,
"LN_PEAK_CEIL": 0.985,
"LN_FADE_BLOCKS": 4,
"LN_FADE_GAP_BLOCKS": 24
}
},
"物理输出": {
"匹配": "alsa_output.usb-EDIFIER_Technology_EDIFIER_Fit900NB_4250315939393214-00.iec958-stereo",
"_匹配说明": "USB 耳机重启后 profile 可能在 iec958-stereo / analog-stereo 之间变, 名字会变; 所以按 EDIFIER 前缀匹配即可",
"_路由": "数字(S/PDIF) 优先, 96kHz/24bit(S24LE); 实测音质优于模拟",
"档位": 0.35,
"_档位说明": "★★ 2026-09-14 修正(重要): 本级音量是一个**档位**, 实测 0.35 已经很响(响度由 DSP 归一化保证), **不是**\"越小越弱、越大越响\"。曾经错误地把它对齐到虚拟声卡(1.0) → 进削波保护、动态被压扁: 面板波形顶满而听感反而更小(老 bug 复现, 老板当场抓出)。看门狗只允许兜\"静音\"和\"近乎归零(<0.02)\", **绝不改正常档位**",
"静音应被解除": true,
"近乎归零阈值": 0.02
},
"上混链": {
"输出端": "cinema_spatial_up_out",
"_输出端说明": "它的 output_FL/FR 必须显式连到物理设备的 playback_FL/FR",
"六路能量归一": 0.4082,
"_归一说明": "mixL/mixR 的 6 路 Gain 必须都是 1/sqrt(6)=0.4082; 每路 1.0 会让上混净增益 +6dB, 顶穿满刻度"
},
"时钟": {
"采样率": 96000,
"允许": [96000],
"_说明": "链路全程 96kHz; HRTF=SADIE-II H4 96k/512tap"
},
"面板": {
"端口": 8788,
"脚本": "web/webui.py",
"启动": "web/启动.sh",
"_说明": "常驻; 内含菜单音量桥(系统音量键 → 扬声器电平)和电平采集"
},
"看门狗": {
"间隔秒": 30,
"冷却秒": 90,
"连续失败告警": 3,
"_说明": "同一类问题在冷却期内不重复动手; 连续 3 次修不好就只报警不再折腾"
}
}