#!/bin/bash # 配置 CHARS="▁▂▃▄▅▆▇█" BARS=10 CONF="/tmp/waybar_cava_config" # 初始化 len=$((${#CHARS}-1)) idle_char="${CHARS:0:1}" idle_output=$(printf "%0.s$idle_char" $(seq 1 $BARS)) # 生成 Cava 配置 cat > "$CONF" </dev/null echo "$idle_output" exit 0 } trap cleanup EXIT INT TERM # 核心检测:是否存在未暂停的音频流 is_audio_active() { pactl list sink-inputs 2>/dev/null | grep -q "Corked: no" } # 初始状态 echo "$idle_output" while true; do # 如果存在未静音的音频 if is_audio_active; then if ! pgrep -P $$ -x cava >/dev/null; then # 这里的 sed 字典是根据你的 CHARS 动态生成的 sed_dict="s/;//g;" for ((i=0; i<=${len}; i++)); do sed_dict="${sed_dict}s/$i/${CHARS:$i:1}/g;" done cava -p "$CONF" 2>/dev/null | sed -u "$sed_dict" & fi # 正在播放时,稍微降低检查频率减少 CPU 占用 sleep 1 else if pgrep -P $$ -x cava >/dev/null; then pkill -P $$ -x cava 2>/dev/null wait 2>/dev/null echo "$idle_output" fi # 没声音时,使用 subscribe 等待事件,被动唤醒,不产生任何循环开销 timeout 5s pactl subscribe 2>/dev/null | grep --line-buffered "sink-input" | head -n 1 >/dev/null fi done