release: v1.0.1 -- 空间音频设备自检 + README 补4条实测坑(峰值因子/音量分层/USB profile/pw-cli info)

This commit is contained in:
edgevoid
2026-09-13 06:50:35 +08:00
parent 589244d4c3
commit 38e2e2f68a
3 changed files with 34 additions and 64 deletions
+12
View File
@@ -99,6 +99,18 @@ mpv-影院 电影.mkv # 只给 mpv 用, 不依赖全局设置(适合 A/B 对比
8. **`adelay` + `join` 合成多声道素材不可靠**:曾静默产出 0.25 秒的单声道文件。
改用 `aevalsrc` 直接合成。
9. **`type=time` 是时域卷积(保真)**;默认的 `type=freq` 走 FFT,会削高频。
10. **★ 测试素材必须匹配真实内容的"峰值因子"**:用平稳的粉噪做压力测试,看着余量充足,
一放电影里爆炸/撞击那种高峰值因子瞬态就削 —— 同样听感响度下,瞬态峰值能再高出 10dB 以上。
**校准要用真实片源,或至少混入冲击型素材。**
11. **★ 每一层音量都吃动态余量,改一处就要记账**:虚拟声卡音量与设备(耳机)音量
**串联在同一条链上**。曾把设备音量从 0.66 提到 1.00(+3.6dB)却没算进余量账,
结果一有瞬态就削。**设备自身的出厂音量是预留余量,不要顺手拉满。**
12. **★ USB 音频设备重启后 profile 会变**(`iec958-stereo``analog-stereo`),
设备 `node.name` 随之后缀改变 → 配置里记的 `node.target` 失效 → WirePlumber 回落到其它输出
(实测落到 HDMI,表现为"没声音"或"声音从显示器出来")。
本项目的 `空间音频 开` 已带自检:设备名失效时自动重新探测并重建配置。
13. **判定设备是否存在不能用 `pw-cli info`**:它对不存在的名字也返回成功。要用 `pw-dump`
`node.name` 精确比对。
## 数据来源
+21 -63
View File
@@ -1,73 +1,31 @@
#!/bin/bash
# 打 release + 上传 deb 资产到 Gitea (2026-09-12)
# 打 release + 上传 deb 到 Gitea。用法: 发布release.sh [版本号]
set -eu
cd "/home/lou/桌面/工作区/实验/空间音频"
DEB="$HOME/桌面/collaplex-cinema-spatial_1.0.0_all.deb"
cd "$(dirname "$(readlink -f "$0")")"
VER="${1:-$(grep -oP '^VER="\K[^"]+' 打包deb.sh)}"
PKG="collaplex-cinema-spatial"
DEB="$HOME/桌面/${PKG}_${VER}_all.deb"
API="http://8.136.202.225:3000/api/v1/repos/edgevoid/cinema-spatial"
AUTH="edgevoid:147427"
echo "=== 1. 重新打包(含最新脚本) ==="
echo "=== 打包 $VER ==="
rm -f "$DEB"
bash 打包deb.sh 2>&1 | tail -4
LOCAL_SIZE=$(stat -c%s "$DEB")
LOCAL_MD5=$(md5sum "$DEB" | cut -d' ' -f1)
echo "本地: $LOCAL_SIZE 字节 md5=$LOCAL_MD5"
bash 打包deb.sh 2>&1 | tail -3
[ -f "$DEB" ] || { echo "打包失败"; exit 1; }
echo "本地: $(stat -c%s "$DEB") 字节"
echo
echo "=== 2. 创建 release v1.0.0 ==="
python3 - <<'PYEOF' > /tmp/rel_body.json
import json
body = """## collaplex-cinema-spatial 1.0.0
echo "=== 建 release v$VER ==="
RID=$(curl -s -X POST "$API/releases" -u edgevoid:147427 -H "Content-Type: application/json" -d "{\"tag_name\":\"v$VER\",\"name\":\"v$VER\",\"body\":\"collaplex-cinema-spatial $VER - 耳机电影院空间音频 (PipeWire filter-chain + SADIE-II HRTF, 96kHz/24bit). 安装: sudo dpkg -i ${PKG}_${VER}_all.deb; systemctl --user restart pipewire. 本版: 空间音频命令增加设备自检(USB profile 变化致 target 失效时自动重建), 输出目标改为自动探测物理设备(优先USB), 去硬编码.\"}" | python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))")
echo "release id: $RID"
[ -n "$RID" ] || exit 1
\u8033\u673a\u4e0a\u7684\u7535\u5f71\u9662\u7a7a\u95f4\u97f3\u9891 \u2014\u2014 PipeWire filter-chain \u865a\u62df\u58f0\u5361 + SADIE-II \u771f\u4eba HRTF\uff0c\u5168\u94fe\u8def 96kHz/24bit\u3002
echo "=== 上传资产 ==="
curl -s -X POST "$API/releases/$RID/assets?name=$(basename "$DEB")" -u edgevoid:147427 -H "Content-Type: application/octet-stream" --data-binary "@$DEB" -o /dev/null -w "上传 HTTP %{http_code}\n"
### \u5b89\u88c5
```
sudo dpkg -i collaplex-cinema-spatial_1.0.0_all.deb
systemctl --user restart pipewire pipewire-pulse wireplumber
```
\u4f9d\u8d56: pipewire libmysofa1 mpv
### \u7528\u6cd5
```
\u7a7a\u95f4\u97f3\u9891 \u5f00 # \u5168\u5c40\u5207\u5230\u7acb\u4f53\u58f0\u4e0a\u6df7\u7248(\u63a8\u8350)
\u7a7a\u95f4\u97f3\u9891 \u5f005.1 # \u5168\u5c40\u5207\u5230 5.1 \u76f4\u901a\u7248
\u7a7a\u95f4\u97f3\u9891 \u5173 # \u5207\u56de\u7269\u7406\u8bbe\u5907
\u7a7a\u95f4\u97f3\u9891 \u72b6\u6001 # \u67e5\u770b\u72b6\u6001
mpv-\u5f71\u9662 \u7535\u5f71.mkv # \u53ea\u7ed9 mpv \u7528
```
### \u8bf4\u660e
- HRTF \u7528 SADIE-II \u771f\u4eba\u53d7\u8bd5\u8005 H4\uff0c96K/24bit/512tap
- \u7acb\u4f53\u58f0\u6e90\u81ea\u52a8\u77e9\u9635\u4e0a\u6df7\uff0c\u4e0d\u9700\u8981\u591a\u58f0\u9053\u7247\u6e90
- \u82e5\u65e0\u58f0: python3 /usr/share/cinema-spatial/\u751f\u6210\u914d\u7f6e.py \u91cd\u65b0\u63a2\u6d4b\u8f93\u51fa\u8bbe\u5907
"""
print(json.dumps({"tag_name": "v1.0.0", "name": "v1.0.0", "body": body}, ensure_ascii=False))
PYEOF
RELEASE_ID=$(curl -s -X POST "$API/releases" -u "$AUTH" -H "Content-Type: application/json" \
--data-binary @/tmp/rel_body.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('id','')); " 2>/dev/null)
echo "release id: $RELEASE_ID"
echo
echo "=== 3. 上传 deb 资产 ==="
curl -s -X POST "$API/releases/$RELEASE_ID/assets?name=collaplex-cinema-spatial_1.0.0_all.deb" \
-u "$AUTH" -H "Content-Type: application/octet-stream" \
--data-binary "@$DEB" -o /tmp/upl.json -w "上传 HTTP %{http_code}\n"
echo
echo "=== 4. ★ 逐字节核对 ==="
curl -s "$API/releases/$RELEASE_ID" -u "$AUTH" | python3 -c "
echo "=== 逐字节核对 ==="
curl -s "$API/releases/$RID" -u edgevoid:147427 | python3 -c "
import sys, json
d = json.load(sys.stdin)
print('release:', d.get('tag_name'), '|', d.get('name'))
for a in d.get('assets', []):
print(' 资产:', a['name'], '|', a['size'], '字节')
print(' 下载:', a.get('browser_download_url',''))
for a in json.load(sys.stdin).get('assets', []):
print(' 远端', a['size'], '字节', a['name'])
print(' 下载', a.get('browser_download_url',''))
"
echo "本地字节: $LOCAL_SIZE 本地md5: $LOCAL_MD5"
echo " 本地 $(stat -c%s "$DEB") 字节"
+1 -1
View File
@@ -4,7 +4,7 @@
set -eu
SRC="/home/lou/桌面/工作区/实验/空间音频"
PKG="collaplex-cinema-spatial"
VER="1.0.0"
VER="1.0.1"
BUILD="/tmp/${PKG}-deb"
ROOT="/usr/share/cinema-spatial"
SOFA_SRC="$SRC/sofa/H4_HRIR_SOFA/H4_HRIR_SOFA/H4_96K_24bit_512tap_FIR_SOFA.sofa"