From: Sergey Matveev Date: Sat, 11 Dec 2021 12:11:35 +0000 (+0300) Subject: Зависание USB при пропаже USB аудио X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=c96b75bef630f7166ba49e0265d4f87843e81490;p=stargrave-blog.git Зависание USB при пропаже USB аудио https://forums.freebsd.org/threads/usb-dac-unplugged-hangs-up-rest-of-usb-devices.72061/ https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=194727 Давным давно у меня особенность (проблема) есть со звуком: если вывод происходит на USB DAC, то mpv/mplayer держат открытым файл /dev/dspX.X и когда USB вынимается, то драйвер в dmesg ругается: [10409] pcm4: unregister: channel pcm4:virtual:dsp4.vp0 busy (pid 65234) [10409] pcm4: Waiting for sound application to exit! mpv при этом остаётся жив, и в целом всё что подключено к этому USB контроллеру становится неработоспособным (спустя какое-то время чаще). Было это на ноутбуках прежде, где клавиатура была PS/2 и я мог открыть крышку и грохнуть программу (mpv). Но на NUC у меня только USB, который может стать unresponsive для клавы и я ничего не могу сделать кроме нажатия кнопки питания. Проблема известна и предлагают: писать грамотно OSS-related софт, чтобы обрабатывал ошибки и выходил. Не знаю относится ли это к mpv. Ну или использовать virtual_oss. Я же решил просто насильно грохать софт занимающий звуковые устройства для которых более нет аппаратуры: /etc/devd/myaudio.conf: attach 20 { device-name "uaudio[0-9]"; match "vendor" "0x0b05"; match "product" "0x17f3"; action "/etc/devd/myaudio-bitperfect.sh $vendor $product"; }; notify 21 { match "system" "USB"; match "subsystem" "INTERFACE"; match "type" "DETACH"; match "vendor" "0x0b05"; match "product" "0x17f3"; action "/etc/devd/myaudio-killer.sh"; }; /etc/devd/myaudio-killer.sh: #!/bin/sh -x export PATH=/usr/local/bin:$PATH for uaudio in $(sysctl dev.uaudio | perl -F\\. -lane '/%pnpinfo:\s*$/ and print $F[2]') ; do pcm=$(sysctl dev.pcm | perl -F\\. -lane "/%parent: uaudio${uaudio}$/ and print \$F[2]") [ -n "$pcm" ] || continue for dsp in /dev/dsp${pcm}* ; do pid=$(fstat $dsp | perl -lane "next if /^USER/ ; print \$F[2]") [ -z "$pid" ] || kill $pid done done Такой геморрой потому что в devd приходит только событие о пропаже ugen устройства, ничего не известно про аудио подсистему, которая не шлёт ничего о том что у неё пропал родитель. В bugreport-ах видел есть коммиты на эту тему -- возможно в новых версиях FreeBSD проблем нет. ---