summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Kortkamp <tobik@FreeBSD.org>2017-03-28 14:45:59 +0000
committerTobias Kortkamp <tobik@FreeBSD.org>2017-03-28 14:45:59 +0000
commit6f270b397f959c5b55dd0a53e4c120a533e9226c (patch)
treeb3050c585e44ea0b7ba687ad5babc91ce0e1b31f
parentHave you ever wanted to blow something up? Or maybe you always (diff)
With incompletely specified parameters the OSS backend will always
fallback to s16le for no good reason. Replace them with default values, so the format table lookup can work. This should fix playback of 24-bit/32-bit files in e.g. cmus without a running sndiod. Approved by: mat (mentor) Differential Revision: https://reviews.freebsd.org/D10164
Notes
Notes: svn path=/head/; revision=437130
-rw-r--r--audio/sndio/Makefile2
-rw-r--r--audio/sndio/files/patch-libsndio_sio__oss.c49
2 files changed, 41 insertions, 10 deletions
diff --git a/audio/sndio/Makefile b/audio/sndio/Makefile
index 440e48784ccd..2e0b51681b9b 100644
--- a/audio/sndio/Makefile
+++ b/audio/sndio/Makefile
@@ -3,7 +3,7 @@
PORTNAME= sndio
PORTVERSION= 1.2.0
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= audio
MASTER_SITES= http://www.sndio.org/
diff --git a/audio/sndio/files/patch-libsndio_sio__oss.c b/audio/sndio/files/patch-libsndio_sio__oss.c
index 51964ed64f80..35b5422286cb 100644
--- a/audio/sndio/files/patch-libsndio_sio__oss.c
+++ b/audio/sndio/files/patch-libsndio_sio__oss.c
@@ -1,6 +1,6 @@
--- libsndio/sio_oss.c.orig 2016-11-06 11:21:59 UTC
+++ libsndio/sio_oss.c
-@@ -108,6 +108,8 @@ static int sio_oss_xrun(struct sio_oss_h
+@@ -108,6 +108,8 @@ static int sio_oss_xrun(struct sio_oss_hdl *);
static size_t sio_oss_read(struct sio_hdl *, void *, size_t);
static size_t sio_oss_write(struct sio_hdl *, const void *, size_t);
static void sio_oss_close(struct sio_hdl *);
@@ -20,7 +20,7 @@
};
/*
-@@ -228,12 +230,10 @@ sio_oss_getcap(struct sio_hdl *sh, struc
+@@ -228,12 +230,10 @@ sio_oss_getcap(struct sio_hdl *sh, struct sio_cap *cap
}
static int
@@ -34,7 +34,7 @@
p = _sndio_parsetype(str, "rsnd");
if (p == NULL) {
-@@ -253,7 +253,24 @@ sio_oss_getfd(const char *str, unsigned
+@@ -253,7 +253,24 @@ sio_oss_getfd(const char *str, unsigned int mode, int
DPRINTF("sio_oss_getfd: %s: number expected after '/'\n", str);
return -1;
}
@@ -60,7 +60,7 @@
if (mode == (SIO_PLAY | SIO_REC))
flags = O_RDWR;
else
-@@ -264,6 +281,19 @@ sio_oss_getfd(const char *str, unsigned
+@@ -264,6 +281,19 @@ sio_oss_getfd(const char *str, unsigned int mode, int
DPERROR(path);
return -1;
}
@@ -80,10 +80,41 @@
val = 1;
if (ioctl(fd, SNDCTL_DSP_LOW_WATER, &val) < 0) {
DPERROR("sio_oss_start: LOW_WATER");
-@@ -736,4 +766,40 @@ sio_oss_revents(struct sio_hdl *sh, stru
- return revents;
- }
+@@ -383,13 +413,25 @@ sio_oss_setpar(struct sio_hdl *sh, struct sio_par *par
+ struct sio_oss_hdl *hdl = (struct sio_oss_hdl *)sh;
+ unsigned int i, round, bufsz;
+ int frag_max, frag_shift, frag_count, frag;
++ unsigned int le, sig, msb;
++ le = par->le;
++ sig = par->sig;
++ msb = par->msb;
++
++ if (le == ~0U)
++ le = 0;
++ if (sig == ~0U)
++ sig = 0;
++ if (msb == ~0U)
++ msb = 0;
++
+ hdl->fmt = AFMT_S16_LE;
+ for (i = 0; i < sizeof(formats)/sizeof(formats[0]); i++) {
+ if (formats[i].bits == par->bits &&
+- formats[i].le == par->le &&
+- formats[i].sig == par->sig &&
+- formats[i].msb == par->msb) {
++ formats[i].le == le &&
++ formats[i].sig == sig &&
++ formats[i].msb == msb) {
+ hdl->fmt = formats[i].fmt;
+ break;
+ }
+@@ -734,6 +776,42 @@ sio_oss_revents(struct sio_hdl *sh, struct pollfd *pfd
+ hdl->odelta -= delta;
+ }
+ return revents;
++}
++
+static int
+sio_oss_setvol(struct sio_hdl *sh, unsigned int vol)
+{
@@ -118,6 +149,6 @@
+ /* Use left channel volume and scale to SIO_MAXVOL */
+ vol = SIO_MAXVOL * 1.0 * (vol & 0x7f) / 100;
+ _sio_onvol_cb(&hdl->sio, vol);
-+}
-+
+ }
+
#endif /* defined USE_OSS */