summaryrefslogtreecommitdiff
path: root/games/plib/patches/patch-ab
diff options
context:
space:
mode:
Diffstat (limited to 'games/plib/patches/patch-ab')
-rw-r--r--games/plib/patches/patch-ab145
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