bbe16afa64
ok MAINTAINER
152 lines
2.7 KiB
Plaintext
152 lines
2.7 KiB
Plaintext
$OpenBSD: patch-src_sl_slDSP_cxx,v 1.1 2009/12/26 13:21:21 jakemsr Exp $
|
|
--- src/sl/slDSP.cxx.orig Mon Mar 10 19:06:24 2008
|
|
+++ src/sl/slDSP.cxx Wed Dec 16 13:17:24 2009
|
|
@@ -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(UL_SOLARIS)
|
|
void slDSP::open ( const char *device, int _rate, int _stereo, int _bps )
|
|
{
|
|
|
|
@@ -1083,3 +1083,138 @@ float slDSP::secondsUsed ()
|
|
#endif
|
|
|
|
|
|
+#ifdef 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
|