#!/bin/bash # Clean poll-based volume bridge (pure ALSA, no PipeWire). # Windows "Source/Sink" speaker volume -> gadget control numid=7 (PCM Capture # Volume, 0-100). Applied to ES8323 analog output (Output 1/2, 0-33) only when it # actually changes (poll every 200ms) so we don't hammer the mixer on the gadget's # ~10Hz async rate-feedback events. set -u CG=UAC2Gadget CE=0 last=-1; lastm=-1 while true; do v=$(amixer -c "$CG" cget numid=7 2>/dev/null | awk -F= '/: values=/{print $2; exit}') m=$(amixer -c "$CG" cget numid=6 2>/dev/null | awk -F= '/: values=/{print $2; exit}') if [ -n "$v" ] && { [ "$v" != "$last" ] || [ "$m" != "$lastm" ]; }; then o=$(( v * 25 / 100 )) amixer -c "$CE" sset 'Output 1' "$o" >/dev/null 2>&1 amixer -c "$CE" sset 'Output 2' "$o" >/dev/null 2>&1 case "$m" in off|0) amixer -c "$CE" sset 'Headphone' off >/dev/null 2>&1 ;; *) amixer -c "$CE" sset 'Headphone' on >/dev/null 2>&1 ;; esac last="$v"; lastm="$m" fi sleep 0.2 done