Virtual sound channels in FreeBSD

Following on from my earlier post about nspluginwrapper and Firefox; I noticed that the plugin likes to keep its file handles open even after you’ve finished viewing a flash-based site. This is a bit of an issue with things like the sound device – /dev/dsp0:


[rob@tachikoma] >> fstat | grep dsp
rob mplayer 80327 9 /dev 45 crw-rw-rw- dsp0.1 w
rob npviewer.bin 80305 63 /dev 42 crw-rw-rw- dsp0.0 rw
rob npviewer.bin 80299 63 /dev 42 crw-rw-rw- dsp0.0 rw

So if you happen to forget about this and go to play an mp3 or something later on, you’ll be left scratching your head. I didn’t feel like running a sound daemon like esound or arts, luckily FreeBSD has a kernel-based solution to this problem in the form of virtual sound channels which can be configured using the standard sysctl MIBs.

So we’ll try to allocate out 4 virtual sound channels:


[rob@tachikoma] >> sudo sysctl hw.snd.pcm0.vchans=4
hw.snd.pcm0.vchans: 0
sysctl: hw.snd.pcm0.vchans: Device busy

Oops, of course we must first close any programs that are using the sound card.


[rob@tachikoma] >> sudo sysctl hw.snd.pcm0.vchans=4
hw.snd.pcm0.vchans: 0 -> 4
[rob@tachikoma] >> sudo sysctl hw.snd.maxautovchans=4
hw.snd.maxautovchans: 0 -> 4

hw.snd.pcm0.vchans is the number of virtual channels pcm0 has and hw.snd.maxautovchans is the number of virtual channels given to new devices. All the virtual channels are automagically allocated using devfs.

I was then able to view flash sites, and open up audio applications afterwards without any problems – I’m starting to see the benefits of the move to devfs :)