[О блоге] [наверх] [пред] [2021-12-11 15:11:35+03:00] [c96b75bef630f7166ba49e0265d4f87843e81490]
Темы: [multimedia][tip]

Зависание 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 проблем нет.

    [оставить комментарий]