Initial commit

This commit is contained in:
jack
2026-04-06 21:59:41 +08:00
commit 760bdf2c9b
28 changed files with 2310 additions and 0 deletions

View File

@@ -0,0 +1,128 @@
#!/usr/bin/env bash
# 在安装 kaisa-hdmi-pipewire-fix 或其它大改前采集「Ubuntu / 当前机」音频基线并落盘。
# 输出目录默认audio_topology/baseline-stash/<时间戳>_<hostname>/
# 用法:./scripts/capture-ubuntu-audio-baseline.sh [输出目录]
# 详见docs/linux-hdmi/OPERATION_PipeWire_Kaisa_HDMI.md「基线备份与恢复」
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
STAMP="$(date +%Y%m%d_%H%M%S)_$(hostname)"
if [[ -n "${1:-}" ]]; then
STASH="$(realpath "$1")"
else
STASH="${REPO_ROOT}/audio_topology/baseline-stash/${STAMP}"
fi
mkdir -p "$STASH/backup/root"
write_manifest() {
local mf="$STASH/manifest.txt"
{
echo "# capture-ubuntu-audio-baseline"
echo "created_iso: $(date -Iseconds)"
echo "hostname: $(hostname)"
echo "stash_dir: $STASH"
echo ""
echo "## uname"
uname -a
echo ""
echo "## dpkg (相关包)"
dpkg -l 2>/dev/null | grep -E '^(ii|rc)\s+(alsa-ucm-conf|wireplumber|pipewire|pipewire-pulse|kaisa-hdmi-pipewire-fix)\s' || true
echo ""
if dpkg -s kaisa-hdmi-pipewire-fix &>/dev/null; then
echo "## kaisa-hdmi-pipewire-fix: installed"
dpkg -s kaisa-hdmi-pipewire-fix 2>/dev/null | grep -E '^(Package|Version|Status):' || true
else
echo "## kaisa-hdmi-pipewire-fix: not installed"
fi
echo ""
echo "## deb 相关路径(存在性与 sha256"
} >"$mf"
local paths=(
/etc/wireplumber/wireplumber.conf.d/50-kaisa-sof-rt5682-hdmi.conf
/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf
/usr/share/alsa/ucm2/GoogleKaisa/sof-rt5682/HiFi.conf
)
local p
for p in "${paths[@]}"; do
if [[ -e "$p" ]]; then
echo "PATH $p exists=yes" >>"$mf"
if [[ -f "$p" ]]; then
sha256sum "$p" >>"$mf" 2>/dev/null || echo "(sha256sum failed)" >>"$mf"
fi
else
echo "PATH $p exists=no" >>"$mf"
fi
done
echo "" >>"$mf"
echo "## /usr/share/doc/kaisa-hdmi-pipewire-fix/" >>"$mf"
if [[ -d /usr/share/doc/kaisa-hdmi-pipewire-fix ]]; then
ls -la /usr/share/doc/kaisa-hdmi-pipewire-fix >>"$mf" 2>&1 || true
else
echo "(目录不存在)" >>"$mf"
fi
}
backup_vendor_ucm() {
local src="/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf"
if [[ -f "$src" ]]; then
install -D -m0644 "$src" "$STASH/backup/root/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf"
echo "已备份 vendor UCM: $src -> backup/root/..."
fi
}
backup_user_wireplumber() {
local d="${HOME}/.config/wireplumber/wireplumber.conf.d"
local names=()
if [[ -d "$d" ]]; then
shopt -s nullglob
local f
for f in "$d"/*; do
[[ -e "$f" ]] || continue
local b
b="$(basename "$f")"
if [[ "$b" == *kaisa* ]] || [[ "$b" == 50-kaisa* ]]; then
names+=("$b")
fi
done
fi
if ((${#names[@]} > 0)); then
tar -C "$d" -czf "$STASH/user-wireplumber-conf.tar.gz" "${names[@]}"
echo "已打包用户 WirePlumber 片段: ${names[*]} -> user-wireplumber-conf.tar.gz"
else
echo "(未找到 ~/.config/wireplumber/... 下含 kaisa 的片段,跳过 user-wireplumber-conf.tar.gz)"
fi
}
pack_system_overlay() {
if [[ -f "$STASH/backup/root/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf" ]]; then
tar -C "$STASH/backup/root" -czf "$STASH/system-overlay.tar.gz" \
usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf
echo "已生成 system-overlay.tar.gz可配合 restore 还原安装 deb 前的 vendor sof-rt5682.conf"
else
echo "(未备份 vendor sof-rt5682.conf不生成 system-overlay.tar.gz)"
fi
}
write_manifest
backup_vendor_ucm
backup_user_wireplumber
pack_system_overlay
TOPO="$STASH/topology.txt"
echo "正在调用 collect_linux_audio_topology.sh -> $TOPO"
bash "${REPO_ROOT}/audio_topology/collect_linux_audio_topology.sh" "$TOPO"
echo ""
echo "========== 基线已写入: $STASH =========="
echo " manifest.txt — 包状态与 deb 路径清单"
echo " topology.txt — 完整音频拓扑"
echo " system-overlay.tar.gz — 若存在vendor sof-rt5682.conf 快照"
echo " user-wireplumber-conf.tar.gz — 若存在:用户 kaisa WirePlumber 片段"
echo ""
echo "恢复至「尽量接近本次采集时」的系统文件状态:"
echo " ./scripts/restore-ubuntu-audio-baseline.sh $STASH"
echo ""
echo "若曾启用 §4.3 user systemd 自动 restore恢复基线前可先禁用该 user 单元(见 OPERATION。"

View File

@@ -0,0 +1,80 @@
#!/usr/bin/env bash
# 将系统尽量恢复到某次 capture-ubuntu-audio-baseline 采集时的「安装 deb 前」文件状态。
# 典型purge kaisa-hdmi-pipewire-fix → reinstall alsa-ucm-conf → 可选解压备份 tar。
# 用法:./scripts/restore-ubuntu-audio-baseline.sh [基线目录]
# 若不传参数,使用 audio_topology/baseline-stash/ 下最近修改的子目录。
# 需要sudoapt、解压到 /);建议在桌面会话下执行以便重启 PipeWire。
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
resolve_stash() {
if [[ -n "${1:-}" ]]; then
realpath "$1"
return
fi
local latest
latest="$(ls -td "${REPO_ROOT}/audio_topology/baseline-stash"/*/ 2>/dev/null | head -1 || true)"
if [[ -z "$latest" ]]; then
echo "未找到基线目录。请先运行: ${REPO_ROOT}/scripts/capture-ubuntu-audio-baseline.sh" >&2
exit 1
fi
realpath "${latest%/}"
}
STASH="$(resolve_stash "${1:-}")"
if [[ ! -f "$STASH/manifest.txt" ]]; then
echo "不是有效基线目录(缺少 manifest.txt: $STASH" >&2
exit 1
fi
echo "========== 使用基线: $STASH =========="
echo "manifest 创建于:"
head -5 "$STASH/manifest.txt"
echo ""
if ! command -v sudo &>/dev/null; then
echo "需要 sudo 以执行 apt。" >&2
exit 1
fi
if dpkg -s kaisa-hdmi-pipewire-fix &>/dev/null; then
echo ">>> apt purge kaisa-hdmi-pipewire-fix"
sudo apt purge -y kaisa-hdmi-pipewire-fix
else
echo "(未安装 kaisa-hdmi-pipewire-fix跳过 purge)"
fi
echo ">>> apt install --reinstall alsa-ucm-conf"
sudo apt install --reinstall -y alsa-ucm-conf
if [[ -f "$STASH/system-overlay.tar.gz" ]]; then
echo ">>> 解压 system-overlay.tar.gz -> /(覆盖 vendor sof-rt5682.conf与 reinstall 通常等价)"
sudo tar -xzf "$STASH/system-overlay.tar.gz" -C /
else
echo "(无 system-overlay.tar.gz仅依赖 alsa-ucm-conf reinstall)"
fi
if [[ -f "$STASH/user-wireplumber-conf.tar.gz" ]]; then
echo ">>> 解压 user-wireplumber-conf.tar.gz -> ${HOME}/.config/wireplumber/wireplumber.conf.d/"
mkdir -p "${HOME}/.config/wireplumber/wireplumber.conf.d"
tar -xzf "$STASH/user-wireplumber-conf.tar.gz" -C "${HOME}/.config/wireplumber/wireplumber.conf.d"
echo "已恢复用户 WirePlumber 片段。"
else
echo "(无 user-wireplumber-conf.tar.gz跳过用户配置)"
fi
if systemctl --user is-system-running &>/dev/null; then
echo ">>> systemctl --user restart wireplumber pipewire pipewire-pulse"
systemctl --user restart wireplumber pipewire pipewire-pulse 2>/dev/null || {
echo "user 会话重启 pipewire 失败,请手动重登或重启)" >&2
}
else
echo "(无可用 user systemd 会话,请登录图形界面后执行: systemctl --user restart wireplumber pipewire pipewire-pulse"
fi
echo ""
echo "========== 恢复步骤已完成 =========="
echo "若曾启用登录自动 restoreuser systemd恢复前可先禁用 kaisa-hdmi-iec958-pipewire 单元(见 OPERATION §4.3 / §4.5)。"
echo "建议核对: pactl list cards | head -40 ; aplay -l"