How to reset /dev/dsp ?

Luke Dean LukeD at pobox.com
Wed Jan 3 00:41:17 PST 2007



On Tue, 2 Jan 2007, Lowell Gilbert wrote:

> Luke Dean <LukeD at pobox.com> writes:
>
>> I'm running FreeBSD 6.1.
>>
>> My sound device shows up like this in my dmesg:
>> pcm0: <Intel ICH5 (82801EB)> port 0xd800-0xd8ff,0xdc00-0xdc3f mem
>> 0xfc001000-0xfc0011ff,0xfc002000-0xfc0020ff irq 17 at device 31.5 on
>> pci0
>> pcm0: primary codec not ready!
>> pcm0: <Avance Logic ALC658 AC97 Codec>
>>
>> My sound driver is compiled into the kernel:
>> device          sound
>> device          snd_ich
>>
>> I've got a java application that I run through
>> diablo-jdk-1.5.0.07.01_1 that uses sound.  It's a game.  Partway
>> through the game, the sound stops working.  The people who make the
>> game have been aware of the problem for many months, but don't
>> understand what to do about it.
>> Okay, I can accept that.
>>
>> What I can't accept is that this java application breaks the sound in
>> such a way that NOTHING can play sound anymore until I reboot the
>> machine!
>>
>> If I attempt to play a movie with mplayer after the game has broken
>> the sound, it says:
>> [AO OSS] audio_setup: Can't open audio device /dev/dsp: No such file
>> or directory
>>
>> However, the dsp device still exists in /dev:
>> [0:/dev> ll dsp*
>> crw-rw-rw-  1 root  wheel  -   0,  51 Dec 29 21:36 dsp0.0
>> crw-rw-rw-  1 root  wheel  -   0,  54 Dec 29 21:37 dsp0.1
>> crw-rw-rw-  1 root  wheel  -   0,  52 Dec 29 19:24 dspW0.0
>> crw-rw-rw-  1 root  wheel  -   0,  55 Dec 29 19:24 dspW0.1
>> crw-rw-rw-  1 root  wheel  -   0,  57 Dec 29 19:24 dspr0.1
>>
>> The sndstat device doesn't show any problem, if I'm reading the output
>> right:
>> [0:/dev> cat /dev/sndstat
>> FreeBSD Audio Driver (newpcm)
>> Installed devices:
>> pcm0: <Intel ICH5 (82801EB)> at io 0xfc001000, 0xfc002000 irq 17 bufsz
>> 16384  (1p/1r/0v channels duplex default)
>>
>> Is there anything I can do short of rebooting the machine to get my
>> sound working when this happens?  I thought maybe there was something
>> I could do with devd or devctl to reset the device, but I can't figure
>> out how to do that.  I'm not even sure how to "see" the problem except
>> to attempt to play a sound.
>
> Well, it's hard to say, because the hardware could be misbehaving, in
> which case the software may not know what's going on.  It might be
> interesting to see whether fstat(1) sees anything holding the dsp
> devices.  You could also try using vchans, which would (in theory) let
> you access the hardware from another device node after the first one
> hangs.

fstat reveals that nothing is holding the dsp devices after the sound 
breaks.
I read a bit about vchans, then set up a few with "sysctl 
hw.snd.pcm0.vchans=4".  I had to reboot first, because once the sound 
locks up, attempting to adjust this sysctl produces a "device busy" error. 
This produced some new dsp devices in /dev.
I ran the java app again, broke the sound, and found that all of the 
vchans produce the same "device busy" error when I use mplayer switches to 
specify which vchan to use.  (I was using commands like "mplayer -ao 
oss:/dev/dsp0.1 blah.avi" to test this.)

Whatever this java app is doing to break the sound breaks it for all 
device nodes.

Thanks for the idea anyway.  I learned something.


More information about the freebsd-questions mailing list