diff options
Diffstat (limited to 'games/plib/patches/patch-ab')
-rw-r--r-- | games/plib/patches/patch-ab | 145 |
1 files changed, 142 insertions, 3 deletions
diff --git a/games/plib/patches/patch-ab b/games/plib/patches/patch-ab index 0f3bb7db003..91a30cef7a8 100644 --- a/games/plib/patches/patch-ab +++ b/games/plib/patches/patch-ab @@ -1,13 +1,152 @@ -$NetBSD: patch-ab,v 1.7 2007/09/16 09:25:03 joerg Exp $ +$NetBSD: patch-ab,v 1.8 2013/01/06 00:59:47 ryoon Exp $ ---- src/sl/slDSP.cxx.orig 2007-09-16 08:55:07.000000000 +0000 +--- 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(__FreeBSD__) &&!defined(__DragonFly__)) || 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 <poll.h> ++ ++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 |