/dev/dsp, blocking IO & SDL 1.2

Romick yellowrabbit2010 at gmail.com
Thu Mar 5 21:49:33 PST 2015


Hello,
Old games (I sometimes play UFO or DOOM2) under dosbox became silent.
Reason? SDL library wants a blocking `write` call to /dev/dsp.
Sounf thread looks like:
 while(enabled) {
	err = write(dsp_fd, audio_buf, buf_len);
	if (err <=0) {
		enabled = 0;
	}
 }

So EAGAIN in non-blocking write leads to silence.
/dev/dsp device is opened like:

dsp_fd = open("/dev/dsp", O_WRONLY|O_NONBLOCK);
if (dsp_fd < 0) return(-1);

flags = fcntl(dsp_fd, F_GETFL);
flags &= ~O_NONBLOCK;

if ( fcntl(dsp_fd, F_SETFL, flags) < 0 ) {
    SDL_SetError("Couldn't set audio blocking mode");
    DSP_CloseAudio(this);
    return(-1);
}

Unfortunely fcntl() changes some internal flags while 'wrch->flags' remains 
unchanged so we still have non-blocking mode.

Then I discovered dsp_ioctl(struct dev_ioctl_args *ap) function at 
sys/dev/sound/pcm/dsp.c:1092 with SNDCTL_DSP_NONBLOCK and FIONBIO ioctls 
(sys/dev/sound/pcm/dsp.c:1365).
SNDCTL_DSP_NONBLOCK only sets non-blocking io.
And FIONBIO... well this line will never get control: 
FIONBIO is intercepted somewhere in generic device code.

So what we have here...
There is no way to change blocking mode for /dev/dsp after opening :(

TBH I'm not sure that I read all the code correctly, may be there is a simple
solution?

P.S. Like ``Don't use SDL'' :)

-- 
  with best reagrds, Yellow Rabbit
  DragonFly 4.1-DEVELOPMENT x86_64



More information about the Kernel mailing list