Files
cinema-spatial/打包deb.sh
T

132 lines
6.0 KiB
Bash
Raw Normal View History

#!/bin/bash
# 把电影院空间音频全链打包成 deb (2026-09-12 首版; 2026-09-13 v1.2.0 加响度归一化)
# 包名 collaplex-cinema-spatial, Arch: all (纯脚本+数据, 无编译)
set -eu
SRC="/home/lou/桌面/工作区/实验/空间音频"
PKG="collaplex-cinema-spatial"
VER="1.2.0"
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"
echo "=== 1. 准备目录 ==="
rm -rf "$BUILD"
mkdir -p "$BUILD/DEBIAN" "$BUILD/usr/bin" \
"$BUILD${ROOT}/hrir" "$BUILD${ROOT}/sofa" "$BUILD${ROOT}/loudness" \
"$BUILD/usr/share/pipewire/pipewire.conf.d"
# ★ 源必须是项目目录: 旧版从 ~/.local/bin 拷, 那份可能落后于项目(2026-09-13 补回丢失的 cp)
cp "$SRC/空间音频" "$SRC/mpv-影院" "$BUILD/usr/bin/"
chmod 755 "$BUILD/usr/bin/空间音频" "$BUILD/usr/bin/mpv-影院"
echo "=== 3. HRTF 数据 (12 个 IR + SOFA) ==="
cp "$SRC/hrir/H4-96k/"*.wav "$BUILD${ROOT}/hrir/"
cp "$SOFA_SRC" "$BUILD${ROOT}/sofa/"
echo "=== 4. 项目脚本与文档 ==="
# ★ 音频状态.py 是 CLI 的设备/状态后端(CLI 会去找 $ROOT/音频状态.py), 漏打会致
# "切设备/诊断"直接报"缺 音频状态.py" —— 2026-09-13 补
cp "$SRC/生成配置.py" "$SRC/音频状态.py" "$SRC/换HRTF.sh" "$SRC/README.md" "$BUILD${ROOT}/"
chmod 755 "$BUILD${ROOT}/换HRTF.sh"
echo "=== 4b. 响度归一化 (pipe 插件挂的自研 DSP) ==="
# ★ 包内一律用 ASCII 路径。pipe 插件的 command 传中文路径时**静默失效**
# —— 节点照建、音频绕过、DSP 不 fork、零日志(2026-09-13 排了一整轮)。
# DSP = $ROOT/loudness/loudness_norm.py
# wrapper = /usr/bin/collaplex-loudness-norm
# 项目开发目录仍是中文(响度归一化/), 只在打包时改名。
cp "$SRC/响度归一化/loudness_norm.py" "$SRC/响度归一化/read_state.py" "$BUILD${ROOT}/loudness/"
cat > "$BUILD/usr/bin/collaplex-loudness-norm" <<'WRAP'
#!/bin/sh
# Collaplex 响度归一化 — pipe 插件入口(wrapper)
# ★ pipe 的 command 只支持「程序 + 一个参数」, 参数只能在这个脚本里设;
# ★ 路径必须纯 ASCII —— 中文路径会被 pipe 插件静默忽略
# (wrapper 是 ASCII, 它内部再去 exec 什么名字都没关系)。
export LN_MAX_BOOST=20
export LN_MAX_CUT=20
export LN_RATE=96000
exec /usr/bin/python3 /usr/share/cinema-spatial/loudness/loudness_norm.py
WRAP
chmod 755 "$BUILD/usr/bin/collaplex-loudness-norm"
echo "=== 5. PipeWire 配置 (用安装路径生成) ==="
mkdir -p "$BUILD${ROOT}/web"
cp "$SRC/web/index.html" "$SRC/web/webui.py" "$SRC/web/启动.sh" "$BUILD${ROOT}/web/"
chmod 755 "$BUILD${ROOT}/web/启动.sh"
# LN 入口用包内 ASCII 路径(不是开发机的 ~/.local/bin)
CINEMA_SPATIAL_IR="${ROOT}/hrir" \
CINEMA_SPATIAL_LN="/usr/bin/collaplex-loudness-norm" \
CINEMA_SPATIAL_OUT="$BUILD/usr/share/pipewire/pipewire.conf.d/90-cinema-spatial.conf" \
python3 "$SRC/生成配置.py"
cp "$SRC/91-clock.conf" \
"$BUILD/usr/share/pipewire/pipewire.conf.d/"
echo "=== 6. control ==="
cat > "$BUILD/DEBIAN/control" <<EOF
Source: collaplex-cinema-spatial
Package: collaplex-cinema-spatial
Section: sound
Priority: optional
Architecture: all
Version: $VER
Maintainer: edgevoid <edgevoid@users.noreply.github.com>
Depends: pipewire, libmysofa1, mpv, xdg-utils
Description: Cinema spatial audio for headphones (HRTF virtual surround)
Renders audio into binaural using a SADIE-II human HRTF through a PipeWire
filter-chain virtual sink, so ordinary headphones give a cinema-like
sense of direction and space.
.
Provides two virtual sinks (5.1 passthrough and stereo-upmixed), the
space-audio / mpv-cinema commands, and a web console on 127.0.0.1:8788.
.
Core: image-source room acoustics tracing (8473 early-reflection paths,
0-80 ms) + Sabine statistical tail (80 ms-2 s) -> a 96 kHz true room
impulse response, convolved binaurally; wet path energy-normalised.
.
Loudness normalisation: an external DSP fed by the filter-chain "pipe"
plugin levels every application to one adjustable target (-40..-6 dBFS)
at 6 dB/s slew, both channels sharing one gain so the image never drifts.
EOF
echo "=== 7. 打包 ==="
cat > "$BUILD/DEBIAN/postinst" <<'EOF'
#!/bin/sh
set -e
if [ "$1" = "configure" ]; then
echo "collaplex-cinema-spatial 已安装。"
echo " 命令: 空间音频 开|开5.1|关|状态 mpv-影院 电影.mkv"
echo " 控制台: http://127.0.0.1:8788/ (Collaplex 音效)"
echo " 虚拟声卡: /usr/share/pipewire/pipewire.conf.d/"
echo " 生效: systemctl --user restart pipewire pipewire-pulse wireplumber"
# 装完把控制台直接推给用户看: 先把面板起起来(已经在跑就不重复起), 再开浏览器。
# 注意本脚本是 root 身份跑的, 要 su 到登录用户 + 补上 XDG_RUNTIME_DIR,
# 否则 xdg-open 找不到会话总线/显示, 一声不吭什么都不发生。
U=""
if command -v loginctl >/dev/null 2>&1; then
U=$(loginctl list-sessions --no-legend 2>/dev/null | awk '{print $3}' | grep -v '^root$' | head -1 || true)
fi
if [ -z "$U" ] && command -v who >/dev/null 2>&1; then
U=$(who 2>/dev/null | awk 'NR==1{print $1}' || true)
fi
if [ -n "$U" ] && [ "$U" != "root" ]; then
UID_=$(id -u "$U" 2>/dev/null || true)
if [ -n "$UID_" ]; then
su - "$U" -c "XDG_RUNTIME_DIR=/run/user/$UID_ /usr/share/cinema-spatial/web/启动.sh" >/dev/null 2>&1 || true
sleep 2
su - "$U" -c "XDG_RUNTIME_DIR=/run/user/$UID_ setsid -f xdg-open http://127.0.0.1:8788/ >/dev/null 2>&1" || true
echo " (已为用户 $U 启动控制台并打开浏览器)"
fi
fi
fi
EOF
chmod 755 "$BUILD/DEBIAN/postinst"
dpkg-deb -b --root-owner-group "$BUILD" "$HOME/桌面/${PKG}_${VER}_all.deb"
echo
echo "=== 结果 ==="
ls -lh "$HOME/桌面/${PKG}_${VER}_all.deb"
echo
dn=$(dpkg-deb -c "$HOME/桌面/${PKG}_${VER}_all.deb" | wc -l)
echo "包内文件数: $dn"
dpkg-deb -c "$HOME/桌面/${PKG}_${VER}_all.deb" | awk '{print $6}' | grep -v "/$"