audio: improve tethys uac recovery hints

This commit is contained in:
Brad Stein 2026-05-12 14:31:23 -03:00
parent 0205b85daa
commit cf89b15573
2 changed files with 25 additions and 6 deletions

View File

@ -25,14 +25,28 @@ run_pactl() { timeout "${PULSE_TIMEOUT}s" pactl "$@"; }
run_wpctl() { timeout "${PULSE_TIMEOUT}s" wpctl "$@"; }
print_rebind_hint() {
local card iface driver
card=$(aplay -l 2>/dev/null | awk '/Lesavka|Composite|UAC2|USB Audio/ {if (match($0, /card [0-9]+/)) {print substr($0, RSTART + 5, RLENGTH - 5); exit}}' || true)
local card iface driver device_root audio_ifaces
card=$({
aplay -l 2>/dev/null | awk '/Lesavka|Composite|UAC2|USB Audio/ {if (match($0, /card [0-9]+/)) {print substr($0, RSTART + 5, RLENGTH - 5); exit}}'
awk '/Lesavka|Composite|UAC2|USB Device 0x1d6b:0x104|1d6b:0x104/ {print $1; exit}' /proc/asound/cards 2>/dev/null
} | awk 'NF {print; exit}' || true)
if [[ -n ${card:-} && -e /sys/class/sound/card${card}/device ]]; then
iface=$(basename "$(readlink -f "/sys/class/sound/card${card}/device")")
driver=$(basename "$(readlink -f "/sys/class/sound/card${card}/device/driver" 2>/dev/null || true)")
if [[ -n $iface && -n $driver ]]; then
echo "Tethys root-level soft rebind, if the user audio graph is wedged:" >&2
echo " sudo sh -c 'echo -n \"$iface\" > /sys/bus/usb/drivers/$driver/unbind; sleep 2; echo -n \"$iface\" > /sys/bus/usb/drivers/$driver/bind'" >&2
device_root=${iface%:*}
if [[ -n $iface && -n $driver && -n $device_root ]]; then
audio_ifaces=$(for candidate in "/sys/bus/usb/devices/${device_root}":*; do
[[ -e $candidate/bInterfaceClass && -e $candidate/bInterfaceSubClass ]] || continue
[[ $(cat "$candidate/bInterfaceClass" 2>/dev/null) == "01" ]] || continue
case "$(cat "$candidate/bInterfaceSubClass" 2>/dev/null)" in
01|02) basename "$candidate" ;;
esac
done | sort -V | xargs echo)
[[ -n $audio_ifaces ]] || audio_ifaces=$iface
echo "Tethys root-level audio-interface rebind, if the UAC graph is wedged:" >&2
echo " sudo sh -c 'for i in $audio_ifaces; do echo -n \"\$i\" > /sys/bus/usb/drivers/$driver/unbind 2>/dev/null || true; done; sleep 2; for i in $audio_ifaces; do echo -n \"\$i\" > /sys/bus/usb/drivers/$driver/bind 2>/dev/null || true; done'" >&2
echo "Tethys full composite re-enumeration, if audio interfaces bind but ALSA creates no PCM:" >&2
echo " sudo sh -c 'echo 0 > /sys/bus/usb/devices/$device_root/authorized; sleep 3; echo 1 > /sys/bus/usb/devices/$device_root/authorized'" >&2
fi
fi
}
@ -52,6 +66,7 @@ sink_line=$(run_pactl list short sinks | awk '/alsa_output\.usb-Lesavka|Lesavka|
if [[ -z ${sink_line:-} ]]; then
fail "no Lesavka USB speaker sink is visible to PipeWire/Pulse"
run_pactl list short sinks >&2 || true
print_rebind_hint
exit 1
fi
sink_name=$(awk '{print $2}' <<<"$sink_line")

View File

@ -36,7 +36,11 @@ fn tethys_audio_probe_keeps_repair_explicit_and_non_sudo_by_default() {
"LESAVKA_TETHYS_AUDIO_REPAIR:-0",
"LESAVKA_TETHYS_AUDIO_RESTART:-0",
"restart Tethys user audio or replug/rebind",
"Tethys root-level soft rebind, if the user audio graph is wedged",
"Tethys root-level audio-interface rebind, if the UAC graph is wedged",
"bInterfaceSubClass",
"/proc/asound/cards",
"print_rebind_hint",
"Tethys full composite re-enumeration, if audio interfaces bind but ALSA creates no PCM",
] {
assert!(
SCRIPT.contains(expected),