#!/usr/bin/env bash # 在用户会话里把 cml_rt5682 拉回 pro-audio + 默认 pro-output-2 + IEC958。 # 用于:开机/登录后 profile 变回 stereo-fallback,导致 pro-output-*「出现又消失」。 # 根因常为 ~/.local/state/wireplumber/default-profile 里持久了 stereo-fallback(见 strip-kaisa-default-profile-state.sh)。 # 可重复执行;建议由 systemd --user oneshot 在 pipewire-pulse 之后延迟调用(见 systemd-user/kaisa-pro-audio-reapply.service)。 set -euo pipefail # 与 strip-kaisa-default-profile-state.sh 同逻辑(本脚本常被单独 symlink 到 ~/.local/bin,勿依赖同目录 strip) _wp_state="${HOME}/.local/state/wireplumber/default-profile" if [[ -f "$_wp_state" ]] && grep -q 'cml_rt5682' "$_wp_state" 2>/dev/null; then _tmp="${_wp_state}.tmp.$$" grep -v 'cml_rt5682' "$_wp_state" > "$_tmp" mv -f -- "$_tmp" "$_wp_state" echo "kaisa-reapply-pro-audio-session: 已清除 default-profile 中含 cml_rt5682 的持久行" >&2 fi if ! command -v pactl &>/dev/null; then echo "kaisa-reapply-pro-audio-session: 未找到 pactl" >&2 exit 1 fi apply_once() { local card sink card="$(pactl list cards short 2>/dev/null | awk '/cml_rt5682/ {print $2; exit}')" || true [[ -z "$card" ]] && return 1 pactl set-card-profile "$card" pro-audio 2>/dev/null || true # 给 WirePlumber 一点时间生成 sink sleep 0.4 sink="$(pactl list short sinks 2>/dev/null | awk '/cml_rt5682/ && /\.pro-output-2/ {print $2; exit}')" || true [[ -n "$sink" ]] && pactl set-default-sink "$sink" 2>/dev/null || true if command -v amixer &>/dev/null; then amixer -c0 sset 'IEC958',0 on 2>/dev/null || true amixer -c0 sset 'IEC958',1 on 2>/dev/null || true amixer -c0 sset 'IEC958',2 on 2>/dev/null || true fi return 0 } # 首次:栈可能尚未完全就绪 for _ in 1 2 3 4 5 6 7 8 9 10; do if apply_once; then # 再等一会:GNOME 常在登录后数秒内改 profile,第二次拉回去 sleep 6 apply_once || true exit 0 fi sleep 1 done echo "kaisa-reapply-pro-audio-session: 超时未找到 cml_rt5682 卡(pactl list cards short)" >&2 exit 1