$OpenBSD: patch-dacio-linux_c,v 1.2 2009/12/24 21:43:32 jakemsr Exp $ --- dacio-linux.c.orig Sun Sep 17 05:51:43 1995 +++ dacio-linux.c Sat Dec 19 22:00:33 2009 @@ -1,10 +1,8 @@ #line 2 "dacio-linux.c" +#include #include /*(perror)*/ -#include /*O_WRONLY*/ -#include /*(ioctl)*/ #include /*(write)*/ -#include /*SNDCTL_XXX*/ -#include /*EINTR*/ +#include #include "defs.h" /*u8,u16*/ #include "dacio.h" /*(dacioXXX)*/ #include "mem.h" /*(memPerm)*/ @@ -27,18 +25,14 @@ makeLim(void) } #endif -static int fd; +static struct sio_hdl *hdl; -#ifndef DAC_DEV -#define DAC_DEV "/dev/dsp" -#endif - void dacioInit(void) { - fd = open(DAC_DEV, O_WRONLY); - if (fd < 0) { - perror("dacioInit"); + hdl = sio_open(NULL, SIO_PLAY, 0); + if (hdl == NULL) { + fprintf(stderr, "dacioInit failed"); exit(1); } /*makeLim();*/ @@ -59,52 +53,42 @@ static DacioConfInfo dci; void dacioConf(DacioConfInfo *dcp) { - int tmp; + struct sio_par par; -#if 0 - if (ioctl(fd, SNDCTL_DSP_RESET) < 0) { - perror("dacioConf"); - exit(1); - } -#endif - tmp = AFMT_U8; - if (ioctl(fd, SNDCTL_DSP_SETFMT, &tmp) < 0) { - perror("dacioConf"); - exit(1); - } - /*fprintf(stderr, "fmt = 0x%x\n", tmp);*/ + sio_initpar(&par); + par.bits = 8; + par.sig = 0; + par.pchan = dcp->stereo + 1; + par.rate = dcp->speed; - if (ioctl(fd, SNDCTL_DSP_STEREO, &dcp->stereo) < 0) { - perror("dacioConf"); + if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par)) { + fprintf(stderr, "dacioConf failed: set/get\n"); exit(1); } - /*fprintf(stderr, "stereo = %d\n", dcp->stereo);*/ - if (ioctl(fd, SNDCTL_DSP_SPEED, &dcp->speed) < 0) { - perror("dacioConf"); + if (par.bits != 8 || par.sig != 0 || par.pchan != dcp->stereo + 1 || + par.rate != dcp->speed) { + fprintf(stderr, "dacioConf failed: inappropriate settings\n"); exit(1); } - /*fprintf(stderr, "speed = %d\n", dcp->speed);*/ - if (ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &buf.size) < 0) { - perror("dacioConf"); - exit(1); - } - /*fprintf(stderr, "buffer size = 0x%x\n", buf.size);*/ + buf.size = par.round * par.bps * par.pchan; + dci = *dcp; /*if (buf.top != NULL) free(buf.top);*/ buf.top = memPerm(buf.size * sizeof(u8)); buf.p.p8 = buf.top; buf.bot = buf.top + buf.size; + + if (!sio_start(hdl)) { + fprintf(stderr, "dacioConf failed: couldn't start\n"); + exit(1); + } } void dacioSync(void) { - if (ioctl(fd, SNDCTL_DSP_SYNC, NULL) < 0) { - perror("dacioSync"); - exit(1); - } } /* OS independent part (?) */ @@ -116,12 +100,10 @@ dacioFlush(void) if (buf.p.p8 <= buf.top) return; for ( ; buf.p.p8 < buf.bot; buf.p.p8++) *buf.p.p8 = 128; - RETRY: - s = write(fd, buf.top, buf.size); + s = sio_write(hdl, buf.top, buf.size); if (s < buf.size) { - if (s < 0) { - if (errno == EINTR) goto RETRY; - perror("dacioFlush"); + if (s == 0) { + fprintf(stderr, "dacioFlush: write failed\n"); } else fprintf(stderr, "wrote only %d bytes\n", s); exit(1); }