Re: uaudio device re-attach and persisting dev.pcm.$pcm.bitperfect sysctl
Date: Sat, 05 Oct 2024 12:01:23 UTC
> On 2 Oct 2024, at 23:53, Christos Margiolis <christos@freebsd.org> wrote: > > Alban Hertroys wrote: >> Meanwhile, several people here suggested that devd is the way to go >> about this. I had actually looked into that a bit, but that seemed to >> require a related device node in /dev, and there’s neither one for pcm >> nor for uaudio, so I discarded that as not being a viable option. >> Perhaps too soon. > > Audio device nodes are /dev/dspX, where X is the unit number, which has > a 1-1 relation with the pcmX unit number, so pcm2's device node is > /dev/dsp2. Doh! I knew that, just didn’t realise it while writing that devd config. I got it working now. Here’s what I came up with: > cat /usr/local/etc/devd/uaudio.conf notify 100 { match "system" "USB"; match "subsystem" "DEVICE"; match "type" "ATTACH"; match "vendor" "0x152a"; match "product" "0x8750"; action "/usr/bin/touch /var/run/usb.0x152a.0x8750"; }; notify 100 { match "system" "USB"; match "subsystem" "DEVICE"; match "type" "DETACH"; match "vendor" "0x152a"; match "product" "0x8750"; action "/bin/rm -f /var/run/usb.0x152a.0x8750"; }; notify 100 { match "system" "DEVFS"; match "subsystem" "CDEV"; match "type" "CREATE"; match "cdev" "dsp[0-9]"; action "test -f /var/run/usb.0x152a.0x8750 && \ PCM=`echo $cdev | sed 's@^dsp@@'` && \ sysctl hw.snd.default_unit=${PCM} \ dev.pcm.${PCM}.play.vchans=0 \ dev.pcm.${PCM}.bitperfect=1"; }; As you can see, I build in a check that it’s the correct device before starting to set sysctl’s, by checking against a file created in /var/run. I’m not too enthusiastic about that solution… Better suggestions are welcome. It would be nice if I could set a variable in the USB ATTACH and ‘match’ that in the CDEV CREATE step to filter the rule, or something like that. Originally I tried checking for the device using: test "`sysctl -n dev.pcm.${PCM}.%desc`" = 'Topping D90SE’ , but that statement seems to require the double-quotes for test to accept it, which conflict with the double-quotes of the action string. I couldn’t find a way to escape those inner quotes. So that’s another issue I ran into, although approaches to use the USB attach event for matching the dsp device to the usb device are clearly superior to reading out a sysctl that’s an effect of it. Additionally, I noticed that other people also use sed or similar to cut the device number off the cdev variable in their devd configs. That would have been a convenient variable to have available by default, I think. I mean, obviously it’s cool that we can show off how good we are at looking up sed expressions on Google, but as a data engineer I can’t help but feel that the data that we need for these configs could be easier to get at. All in all, I got it working, thanks to the help here. Regards, Alban Hertroys -- There is always an exception to always.