$NetBSD: patch-ab,v 1.8 2013/01/06 00:59:47 ryoon Exp $ --- src/sl/slDSP.cxx.orig Tue Mar 11 02:06:24 2008 +++ src/sl/slDSP.cxx @@ -413,7 +413,7 @@ void slDSP::stop () /* NetBSD/OpenBSD 2.3 this should be very close to SUN Audio */ /* ------------------------------------------------------------ */ -#elif (defined(UL_BSD) && !defined(__FreeBSD__)) || defined(UL_SOLARIS) +#elif (defined(UL_BSD) && !defined(SL_USING_SNDIO) && !defined(__FreeBSD__) && !defined(__DragonFly__)) || defined(UL_SOLARIS) void slDSP::open ( const char *device, int _rate, int _stereo, int _bps ) { @@ -1082,4 +1082,138 @@ float slDSP::secondsUsed () #endif +#if defined(SL_USING_SNDIO) +#include + +static long long realpos, playpos; + +void +movecb(void *v, int delta) +{ + realpos += delta; +} + +void +slDSP::open(const char *device, int _rate, int _stereo, int _bps ) +{ + error = SL_FALSE; + + if (!strncmp(device, "default", FILENAME_MAX)) + hdl = sio_open(NULL, SIO_PLAY, 0); + else + hdl = sio_open(device, SIO_PLAY, 0); + if (hdl == NULL) { + error = SL_TRUE; + fprintf(stderr, "slDSP: open\n"); + return; + } + + sio_initpar(&par); + par.pchan = _stereo ? 2 : 1; + par.bits = _bps; + par.rate = _rate; + par.appbufsz = 4096; + + realpos = playpos = 0; + sio_onmove(hdl, movecb, NULL); + + if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par) || + !sio_start(hdl)) { + fprintf(stderr, "slDSP: sndio params\n"); + error = SL_TRUE; + return; + } + + bps = par.bits; + rate = par.rate; + stereo = par.pchan == 2 ? SL_TRUE : SL_FALSE; +} + +void +slDSP::close() +{ + if (hdl != NULL) + sio_close(hdl); + hdl = NULL; +} + +int +slDSP::getDriverBufferSize() +{ + if (error) + return 0; + + return par.round * par.bps * par.pchan; +} + +void +slDSP::getBufferInfo() +{ + struct pollfd pfd; + nfds_t nfd; + + if (error) + return; + + /* updates counters */ + nfd = sio_pollfd(hdl, &pfd, POLLOUT); + poll(&pfd, nfd, 0); + sio_revents(hdl, &pfd); +} + +void +slDSP::write(void *buffer, size_t length) +{ + int ret, todo, pos; + + if (error || (int)length <= 0) + return; + + pos = 0; + todo = length; + while (todo > 0) { + ret = sio_write(hdl, (char *)buffer + pos, todo); + pos += ret; + todo -= ret; + } + playpos += length / par.bps / par.pchan; +} + +float +slDSP::secondsRemaining() +{ + if (error) + return 0.0f; + + getBufferInfo(); + + /* wtf? tuxkart won't play sounds if less ??? */ + return 0.1f; + return((float)(par.appbufsz - (playpos - realpos)) / par.rate); +} + +float +slDSP::secondsUsed() +{ + if (error) + return 0.0f ; + + getBufferInfo(); + + if (realpos > playpos) + return 0.0f; + + return((float)(playpos - realpos) / par.rate); +} + +void +slDSP::sync() +{ +} + +void slDSP::stop() +{ +} + +#endif