Compare commits

...

2 Commits

Author SHA1 Message Date
0ff35915ed Fix NuForce uDAC USB disconnects
Cheap Savitech chip firmware stalls on rapid SET_INTERFACE / sample-rate
renegotiation, eventually dropping off the USB bus and requiring a
physical replug. Two fixes, both scoped to this exact device only:

- snd_usb_audio quirk_flags (262a:10aa): fixed_rate + ctl_msg_delay +
  iface_delay, applied via /etc/modprobe.d during bootstrap.
- WirePlumber: disable idle-suspend for the device's ALSA node so
  PipeWire doesn't repeatedly reopen the stream during normal use.
2026-08-16 09:49:14 +02:00
6476c98e8f Fix syntax error in apply-screen-layout.sh breaking display config
Missing space before ]] on the "vos" branch caused a bash parse
error, which made the whole script fail silently on every host
(including arch-bepis) before it could dispatch to the per-host
layout script. Also dropped the $(...) wrapping around each script
call, which captured swaymsg's JSON stdout and tried to execute it
as a command.
2026-08-16 08:02:00 +02:00
3 changed files with 46 additions and 7 deletions

View File

@@ -2,16 +2,16 @@
hostname=$(cat ~/hostname)
if [[ $hostname == "bepis" ]]; then
$(~/.config/screenlayout/desktop.sh)
~/.config/screenlayout/desktop.sh
elif [[ $hostname == "arch-bepis" ]]; then
$(~/.config/screenlayout/arch-bepis-desktop-sway.sh)
~/.config/screenlayout/arch-bepis-desktop-sway.sh
elif [[ $hostname == "printer" ]]; then
$(~/.config/screenlayout/printer.sh)
~/.config/screenlayout/printer.sh
elif [[ $hostname == "surface" ]]; then
$(~/.config/screenlayout/surface.sh)
~/.config/screenlayout/surface.sh
elif [[ $hostname == "bepis-laptop" ]]; then
$(~/.config/screenlayout/laptop.sh)
elif [[ $hostname == "vos"]]; then
$(~/.config/screenlayout/vos.sh)
~/.config/screenlayout/laptop.sh
elif [[ $hostname == "vos" ]]; then
~/.config/screenlayout/vos.sh
fi

View File

@@ -0,0 +1,23 @@
# The NuForce uDAC (Savitech chip) has flaky firmware: when PipeWire
# idles and then resumes its ALSA node, the device often fails the
# resulting SET_INTERFACE / sample-rate renegotiation with a USB stall
# (spa.alsa: set_hw_params: Broken pipe). Enough of these in a row make
# the device drop off the USB bus and require a physical replug.
#
# Keeping the node's hardware stream open (no idle-suspend) avoids the
# repeated renegotiation and stops the crashes.
monitor.alsa.rules = [
{
matches = [
{
node.name = "~alsa_output.usb-Nuforce_Inc\\._NuForce_USB_Audio-.*"
}
]
actions = {
update-props = {
session.suspend-timeout-seconds = 0
}
}
}
]

View File

@@ -68,6 +68,22 @@ EOF
sudo systemctl reload sshd
# --- NuForce uDAC USB audio quirks --------------------------------------
# This DAC's firmware (262a:10aa) stalls on rapid SET_INTERFACE / sample
# rate renegotiation, which without these quirks eventually drops the
# device off the USB bus and requires a physical replug. Scoped to this
# exact VID:PID so it's a no-op on any machine without the device
# attached. Takes effect next time snd_usb_audio (re)probes the device
# (reboot, module reload, or replug) -- not applied retroactively here.
sudo install -d -m 755 /etc/modprobe.d
sudo tee /etc/modprobe.d/nuforce-udac-quirks.conf > /dev/null <<'EOF'
# fixed_rate (bit 21): device only offers one sample rate; stop the
# driver re-sending SET_CUR for it ("cannot set freq 48000 to ep 0x3").
# ctl_msg_delay (bit 8): 20ms pause around each USB control message.
# iface_delay (bit 11): 50ms pause around each SET_INTERFACE call.
options snd_usb_audio quirk_flags=262a:10aa:0x200900
EOF
if [ ! -d "$HOME/repos/yay" ]; then
mkdir -p "$HOME/repos"
cd "$HOME/repos"