head 1.2; access; symbols pkgsrc-2023Q4:1.2.0.174 pkgsrc-2023Q4-base:1.2 pkgsrc-2023Q3:1.2.0.172 pkgsrc-2023Q3-base:1.2 pkgsrc-2023Q2:1.2.0.170 pkgsrc-2023Q2-base:1.2 pkgsrc-2023Q1:1.2.0.168 pkgsrc-2023Q1-base:1.2 pkgsrc-2022Q4:1.2.0.166 pkgsrc-2022Q4-base:1.2 pkgsrc-2022Q3:1.2.0.164 pkgsrc-2022Q3-base:1.2 pkgsrc-2022Q2:1.2.0.162 pkgsrc-2022Q2-base:1.2 pkgsrc-2022Q1:1.2.0.160 pkgsrc-2022Q1-base:1.2 pkgsrc-2021Q4:1.2.0.158 pkgsrc-2021Q4-base:1.2 pkgsrc-2021Q3:1.2.0.156 pkgsrc-2021Q3-base:1.2 pkgsrc-2021Q2:1.2.0.154 pkgsrc-2021Q2-base:1.2 pkgsrc-2021Q1:1.2.0.152 pkgsrc-2021Q1-base:1.2 pkgsrc-2020Q4:1.2.0.150 pkgsrc-2020Q4-base:1.2 pkgsrc-2020Q3:1.2.0.148 pkgsrc-2020Q3-base:1.2 pkgsrc-2020Q2:1.2.0.144 pkgsrc-2020Q2-base:1.2 pkgsrc-2020Q1:1.2.0.124 pkgsrc-2020Q1-base:1.2 pkgsrc-2019Q4:1.2.0.146 pkgsrc-2019Q4-base:1.2 pkgsrc-2019Q3:1.2.0.142 pkgsrc-2019Q3-base:1.2 pkgsrc-2019Q2:1.2.0.140 pkgsrc-2019Q2-base:1.2 pkgsrc-2019Q1:1.2.0.138 pkgsrc-2019Q1-base:1.2 pkgsrc-2018Q4:1.2.0.136 pkgsrc-2018Q4-base:1.2 pkgsrc-2018Q3:1.2.0.134 pkgsrc-2018Q3-base:1.2 pkgsrc-2018Q2:1.2.0.132 pkgsrc-2018Q2-base:1.2 pkgsrc-2018Q1:1.2.0.130 pkgsrc-2018Q1-base:1.2 pkgsrc-2017Q4:1.2.0.128 pkgsrc-2017Q4-base:1.2 pkgsrc-2017Q3:1.2.0.126 pkgsrc-2017Q3-base:1.2 pkgsrc-2017Q2:1.2.0.122 pkgsrc-2017Q2-base:1.2 pkgsrc-2017Q1:1.2.0.120 pkgsrc-2017Q1-base:1.2 pkgsrc-2016Q4:1.2.0.118 pkgsrc-2016Q4-base:1.2 pkgsrc-2016Q3:1.2.0.116 pkgsrc-2016Q3-base:1.2 pkgsrc-2016Q2:1.2.0.114 pkgsrc-2016Q2-base:1.2 pkgsrc-2016Q1:1.2.0.112 pkgsrc-2016Q1-base:1.2 pkgsrc-2015Q4:1.2.0.110 pkgsrc-2015Q4-base:1.2 pkgsrc-2015Q3:1.2.0.108 pkgsrc-2015Q3-base:1.2 pkgsrc-2015Q2:1.2.0.106 pkgsrc-2015Q2-base:1.2 pkgsrc-2015Q1:1.2.0.104 pkgsrc-2015Q1-base:1.2 pkgsrc-2014Q4:1.2.0.102 pkgsrc-2014Q4-base:1.2 pkgsrc-2014Q3:1.2.0.100 pkgsrc-2014Q3-base:1.2 pkgsrc-2014Q2:1.2.0.98 pkgsrc-2014Q2-base:1.2 pkgsrc-2014Q1:1.2.0.96 pkgsrc-2014Q1-base:1.2 pkgsrc-2013Q4:1.2.0.94 pkgsrc-2013Q4-base:1.2 pkgsrc-2013Q3:1.2.0.92 pkgsrc-2013Q3-base:1.2 pkgsrc-2013Q2:1.2.0.90 pkgsrc-2013Q2-base:1.2 pkgsrc-2013Q1:1.2.0.88 pkgsrc-2013Q1-base:1.2 pkgsrc-2012Q4:1.2.0.86 pkgsrc-2012Q4-base:1.2 pkgsrc-2012Q3:1.2.0.84 pkgsrc-2012Q3-base:1.2 pkgsrc-2012Q2:1.2.0.82 pkgsrc-2012Q2-base:1.2 pkgsrc-2012Q1:1.2.0.80 pkgsrc-2012Q1-base:1.2 pkgsrc-2011Q4:1.2.0.78 pkgsrc-2011Q4-base:1.2 pkgsrc-2011Q3:1.2.0.76 pkgsrc-2011Q3-base:1.2 pkgsrc-2011Q2:1.2.0.74 pkgsrc-2011Q2-base:1.2 pkgsrc-2011Q1:1.2.0.72 pkgsrc-2011Q1-base:1.2 pkgsrc-2010Q4:1.2.0.70 pkgsrc-2010Q4-base:1.2 pkgsrc-2010Q3:1.2.0.68 pkgsrc-2010Q3-base:1.2 pkgsrc-2010Q2:1.2.0.66 pkgsrc-2010Q2-base:1.2 pkgsrc-2010Q1:1.2.0.64 pkgsrc-2010Q1-base:1.2 pkgsrc-2009Q4:1.2.0.62 pkgsrc-2009Q4-base:1.2 pkgsrc-2009Q3:1.2.0.60 pkgsrc-2009Q3-base:1.2 pkgsrc-2009Q2:1.2.0.58 pkgsrc-2009Q2-base:1.2 pkgsrc-2009Q1:1.2.0.56 pkgsrc-2009Q1-base:1.2 pkgsrc-2008Q4:1.2.0.54 pkgsrc-2008Q4-base:1.2 pkgsrc-2008Q3:1.2.0.52 pkgsrc-2008Q3-base:1.2 cube-native-xorg:1.2.0.50 cube-native-xorg-base:1.2 pkgsrc-2008Q2:1.2.0.48 pkgsrc-2008Q2-base:1.2 cwrapper:1.2.0.46 pkgsrc-2008Q1:1.2.0.44 pkgsrc-2008Q1-base:1.2 pkgsrc-2007Q4:1.2.0.42 pkgsrc-2007Q4-base:1.2 pkgsrc-2007Q3:1.2.0.40 pkgsrc-2007Q3-base:1.2 pkgsrc-2007Q2:1.2.0.38 pkgsrc-2007Q2-base:1.2 pkgsrc-2007Q1:1.2.0.36 pkgsrc-2007Q1-base:1.2 pkgsrc-2006Q4:1.2.0.34 pkgsrc-2006Q4-base:1.2 pkgsrc-2006Q3:1.2.0.32 pkgsrc-2006Q3-base:1.2 pkgsrc-2006Q2:1.2.0.30 pkgsrc-2006Q2-base:1.2 pkgsrc-2006Q1:1.2.0.28 pkgsrc-2006Q1-base:1.2 pkgsrc-2005Q4:1.2.0.26 pkgsrc-2005Q4-base:1.2 pkgsrc-2005Q3:1.2.0.24 pkgsrc-2005Q3-base:1.2 pkgsrc-2005Q2:1.2.0.22 pkgsrc-2005Q2-base:1.2 pkgsrc-2005Q1:1.2.0.20 pkgsrc-2005Q1-base:1.2 pkgsrc-2004Q4:1.2.0.18 pkgsrc-2004Q4-base:1.2 pkgsrc-2004Q3:1.2.0.16 pkgsrc-2004Q3-base:1.2 pkgsrc-2004Q2:1.2.0.14 pkgsrc-2004Q2-base:1.2 pkgsrc-2004Q1:1.2.0.12 pkgsrc-2004Q1-base:1.2 pkgsrc-2003Q4:1.2.0.10 pkgsrc-2003Q4-base:1.2 netbsd-1-6-1:1.2.0.6 netbsd-1-6-1-base:1.2 netbsd-1-6:1.2.0.8 netbsd-1-6-RELEASE-base:1.2 pkgviews:1.2.0.4 pkgviews-base:1.2 buildlink2:1.2.0.2 buildlink2-base:1.2 netbsd-1-5-PATCH003:1.2 netbsd-1-5-PATCH001:1.2 netbsd-1-5-RELEASE:1.2 netbsd-1-4-PATCH003:1.2 netbsd-1-4-PATCH002:1.2 comdex-fall-1999:1.2 netbsd-1-4-PATCH001:1.2 netbsd-1-4-RELEASE:1.2 netbsd-1-3-PATCH003:1.2 netbsd-1-3-PATCH002:1.1; locks; strict; comment @# @; 1.2 date 98.08.07.10.36.06; author agc; state Exp; branches; next 1.1; 1.1 date 98.03.07.09.58.06; author mycroft; state Exp; branches; next ; desc @@ 1.2 log @Add NetBSD RCS Ids. @ text @$NetBSD$ *** /dev/null Fri Mar 6 05:54:22 1998 --- dacio-netbsd.c Fri Mar 6 06:51:04 1998 *************** *** 0 **** --- 1,278 ---- + #include /*(perror)*/ + #include /*O_WRONLY*/ + #include /*(ioctl)*/ + #include /*(memset)*/ + #include /*(write)*/ + #include /*SNDCTL_XXX*/ + #include /*EINTR*/ + #include "defs.h" /*u8,u16*/ + #include "dacio.h" /*(dacioXXX)*/ + #include "mem.h" /*(memPerm)*/ + + #if 0 + #define LIM_SIZE (32 * 256) /* 32ch * 8bit */ + + static u8 *lim; + + static void + makeLim(void) + { + u8 *p; + i15x i; + + lim = (u8 *)memPerm(LIM_SIZE) + LIM_SIZE/2; + p = lim-128; + for (i = 0; i < 256; i++, p++) *p = i; + for (; p < lim + LIM_SIZE/2; p++) *p = 255; + } + #endif + + static int fd; + + #ifndef DAC_DEV + #define DAC_DEV "/dev/audio" + #endif + + void + dacioInit(void) + { + fd = open(DAC_DEV, O_WRONLY); + if (fd < 0) { + perror("dacioInit"); + exit(1); + } + /*makeLim();*/ + } + + static struct { + union { + u8 *p8; + i15 *p16; + } p; + u8 *top; + u8 *bot; + int size; + int shift; + } buf; + + #define bufRest() ((buf.bot - buf.p.p8) >> buf.shift) + + static DacioConfInfo dci; + + void + dacioConf(DacioConfInfo *dcp) + { + audio_info_t info; + + #if 0 + if (ioctl(fd, AUDIO_FLUSH, 0) < 0) { + perror("dacioConf"); + exit(1); + } + #endif + AUDIO_INITINFO(&info); + info.play.encoding = AUDIO_ENCODING_LINEAR; + info.play.precision = dcp->bits; + info.play.channels = dcp->stereo ? 2 : 1; + info.play.sample_rate = dcp->speed; + if (ioctl(fd, AUDIO_SETINFO, &info) < 0) { + perror("dacioConf"); + exit(1); + } + /*fprintf(stderr, "fmt = 0x%x\n", tmp);*/ + + if (ioctl(fd, AUDIO_GETINFO, &info) < 0) { + perror("dacioConf"); + exit(1); + } + buf.size = info.play.buffer_size; + /*fprintf(stderr, "buffer size = 0x%x\n", buf.size);*/ + dci = *dcp; + /*if (buf.top != NULL) free(buf.top);*/ + buf.top = memPerm(buf.size); + buf.p.p8 = buf.top; + buf.bot = buf.top + buf.size; + buf.shift = dci.stereo + ffs(dci.bits / 8) - 1; + } + + void + dacioSync(void) + { + if (ioctl(fd, AUDIO_DRAIN, 0) < 0) { + perror("dacioSync"); + exit(1); + } + } + + /* OS independent part (?) */ + + void + dacioFlush(void) + { + i15x n; + u8 *u8p; + i15 *i15p; + int s; + + if (buf.p.p8 <= buf.top) return; + + n = bufRest() << dci.stereo; + switch (dci.bits) { + case 8: + u8p = buf.p.p8; + for (; n > 0; n--) + *u8p++ = 128; + buf.p.p8 = u8p; + break; + case 16: + i15p = buf.p.p16; + for (; n > 0; n--) + *i15p++ = 0; + buf.p.p16 = i15p; + break; + } + + RETRY: + s = write(fd, buf.top, buf.size); + if (s < buf.size) { + if (s < 0) { + if (errno == EINTR) goto RETRY; + perror("dacioFlush"); + } else fprintf(stderr, "wrote only %d bytes\n", s); + exit(1); + } + buf.p.p8 = buf.top; + } + + static struct { + const i31 *p0; + const i31 *p; + i15x len; + } inbuf; + + void + dacioIncomingBuf(const i31 *bp) + { + inbuf.p0 = bp; + } + + void + dacioIncomingBufLen(i15x len) + { + inbuf.len = len; + } + + static i15x gv = 0x40*0x40; /* default g.v = m.v = 64 */ + + /* gv = 0(min)..64*128(max) */ + void + dacioGlobalVol(i15x v) + { + gv = v; + } + + #define VOL_MAX (64*64*128) /* vol max * g.v max * m.v max */ + #define VOL_MAX_LOG ( 6+ 6+ 7) /* 1 << VOL_MAX_LOG == VOL_MAX */ + #define LEV_MAX (128*VOL_MAX) + + #if 0 + #define to8bit(x, /*i31x*/tmpvar) \ + ( tmpvar = (x) * gv, \ + (tmpvar >= LEV_MAX) ? 255 : \ + (tmpvar < -LEV_MAX) ? 0 : \ + (u32x)tmpvar/VOL_MAX ^ 128 ) + /* ^^^^^^ see asm output w/o this */ + #define to8bit(x, /*i31x*/tmpvar) \ + ( tmpvar = (x) * gv + LEV_MAX, \ + (tmpvar & ~(LEV_MAX*2-1)) ? \ + ((tmpvar < 0)? 0 : 255) : \ + (u32x)tmpvar/VOL_MAX) + #define to8bit(x, /*i31x*/tmpvar) lim[(x) * gv >> VOL_MAX_LOG] + #else + /* almost the same CPU usage as lim[] table mathod */ + #define to8bit(x, /*i31x*/tmpvar) \ + ( tmpvar = ((x) * gv + LEV_MAX) >> VOL_MAX_LOG, \ + (tmpvar & ~255)? ~tmpvar >> 16 : tmpvar ) /* 16 will be OK */ + /* ~(tmpvar >> 16) makes longer asm */ + #endif + #define to16bit(x) \ + ( ((x) * gv) >> 12 ) + + /* stereo */ + static void + dacioOutHirevS(i15x n) + { + const i31 *inbufp = inbuf.p; + u8 *u8p; + i15 *i15p; + + switch (dci.bits) { + case 8: + u8p = buf.p.p8; + for (; n > 0; n--) { + i31x tmp; + *u8p++ = to8bit(*inbufp++, tmp); /* L */ + *u8p++ = to8bit(*inbufp++, tmp); /* R */ + } + buf.p.p8 = u8p; + break; + case 16: + i15p = buf.p.p16; + for (; n > 0; n--) { + *i15p++ = to16bit(*inbufp++); /* L */ + *i15p++ = to16bit(*inbufp++); /* R */ + } + buf.p.p16 = i15p; + break; + } + inbuf.p = inbufp; + } + + /* mono */ + static void + dacioOutHirevM(i15x n) + { + const i31 *inbufp = inbuf.p; + u8 *u8p; + i15 *i15p; + + switch (dci.bits) { + case 8: + u8p = buf.p.p8; + for (; n > 0; n--) { + i31x tmp; + *u8p++ = to8bit(*inbufp, tmp); + inbufp += 2; + } + buf.p.p8 = u8p; + break; + case 16: + i15p = buf.p.p16; + for (; n > 0; n--) { + *i15p++ = to16bit(*inbufp); + inbufp += 2; + } + buf.p.p16 = i15p; + break; + } + inbuf.p = inbufp; + } + + #define dacioOutHirev(x) \ + if (dci.stereo) dacioOutHirevS(x); else dacioOutHirevM(x) + + void + dacioOut(void) + { + i31x iLen; + i31x oLen; + + inbuf.p = inbuf.p0; + iLen = inbuf.len; + while ((oLen = bufRest()) <= iLen) { + iLen -= oLen; + dacioOutHirev(oLen); + dacioFlush(); + } + dacioOutHirev(iLen); + } @ 1.1 log @Use native audio method. @ text @d1 2 @