svn commit: r433052 - in head/audio/sndio: . files

Carlos J. Puga Medina cpm at FreeBSD.org
Wed Feb 1 17:04:30 UTC 2017


Author: cpm
Date: Wed Feb  1 17:04:29 2017
New Revision: 433052
URL: https://svnweb.freebsd.org/changeset/ports/433052

Log:
  audio/sndio: Various fixes
  
  - Success in opening /dev/dsp* O_RDWR does not mean the device
    supports play/recording.  Add an extra check to see if the requested
    mode is really supported.
  - sndiod cannot currently be started in jails as root, because it
    tries to setpriority(-20).  Allow setpriority to fail and start the
    daemon anyway.
  - Fallback to /dev/dsp instead of /dev/dsp0 when using libsndio directly
    without a running sndiod.
  - Implement sio_setvol in the OSS backend for application level volume
    control with just libsndio.
  
  PR:		216571
  Submitted by:	Tobias Kortkamp <t at tobik.me> (maintainer)

Added:
  head/audio/sndio/files/patch-libsndio_sio.c   (contents, props changed)
  head/audio/sndio/files/patch-libsndio_sio__oss.c   (contents, props changed)
Deleted:
  head/audio/sndio/pkg-message
Modified:
  head/audio/sndio/Makefile

Modified: head/audio/sndio/Makefile
==============================================================================
--- head/audio/sndio/Makefile	Wed Feb  1 16:59:24 2017	(r433051)
+++ head/audio/sndio/Makefile	Wed Feb  1 17:04:29 2017	(r433052)
@@ -3,6 +3,7 @@
 
 PORTNAME=	sndio
 PORTVERSION=	1.2.0
+PORTREVISION=	1
 CATEGORIES=	audio
 MASTER_SITES=	http://www.sndio.org/
 
@@ -24,6 +25,11 @@ GROUPS=		_sndio
 # as is so not worth fixing
 MAKE_JOBS_UNSAFE=	yes
 
+post-patch:
+# Make sure sndiod can be started inside jails as root
+	@${REINPLACE_CMD} 's|err(1, "setpriority")|warn("setpriority")|' \
+		${WRKSRC}/sndiod/sndiod.c
+
 post-install:
 	@${STRIP_CMD} \
 		${STAGEDIR}${PREFIX}/lib/libsndio.so.6.1 \

Added: head/audio/sndio/files/patch-libsndio_sio.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/audio/sndio/files/patch-libsndio_sio.c	Wed Feb  1 17:04:29 2017	(r433052)
@@ -0,0 +1,11 @@
+--- libsndio/sio.c.orig	2016-11-06 11:21:59 UTC
++++ libsndio/sio.c
+@@ -65,7 +65,7 @@ sio_open(const char *str, unsigned int m
+ #if defined(USE_SUN)
+ 		return _sio_sun_open("rsnd/0", mode, nbio);
+ #elif defined(USE_OSS)
+-		return _sio_oss_open("rsnd/0", mode, nbio);
++		return _sio_oss_open(SIO_DEVANY, mode, nbio);
+ #elif defined(USE_ALSA)
+ 		return _sio_alsa_open("rsnd/0", mode, nbio);
+ #else

Added: head/audio/sndio/files/patch-libsndio_sio__oss.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/audio/sndio/files/patch-libsndio_sio__oss.c	Wed Feb  1 17:04:29 2017	(r433052)
@@ -0,0 +1,123 @@
+--- 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
+ 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 *);
++static int sio_oss_setvol(struct sio_hdl *, unsigned int);
++static void sio_oss_getvol(struct sio_hdl *);
+ 
+ static struct sio_ops sio_oss_ops = {
+ 	sio_oss_close,
+@@ -121,8 +123,8 @@ static struct sio_ops sio_oss_ops = {
+ 	sio_oss_nfds,
+ 	sio_oss_pollfd,
+ 	sio_oss_revents,
+-	NULL, /* setvol */
+-	NULL, /* getvol */
++	sio_oss_setvol,
++	sio_oss_getvol,
+ };
+ 
+ /*
+@@ -228,12 +230,10 @@ sio_oss_getcap(struct sio_hdl *sh, struc
+ }
+ 
+ static int
+-sio_oss_getfd(const char *str, unsigned int mode, int nbio)
++_sio_oss_getdev(const char *str, char *path, size_t len)
+ {
+ 	const char *p;
+-	char path[DEVPATH_MAX];
+ 	unsigned int devnum;
+-	int fd, flags, val;
+ 
+ 	p = _sndio_parsetype(str, "rsnd");
+ 	if (p == NULL) {
+@@ -253,7 +253,24 @@ sio_oss_getfd(const char *str, unsigned 
+ 		DPRINTF("sio_oss_getfd: %s: number expected after '/'\n", str);
+ 		return -1;
+ 	}
+-	snprintf(path, sizeof(path), DEVPATH_PREFIX "%u", devnum);
++	snprintf(path, len, DEVPATH_PREFIX "%u", devnum);
++	return 0;
++}
++
++static int
++sio_oss_getfd(const char *str, unsigned int mode, int nbio)
++{
++	char path[DEVPATH_MAX];
++	int fd, flags, val;
++	audio_buf_info bi;
++
++	if (strcmp(str, SIO_DEVANY) == 0) {
++		/* Use /dev/dsp (the default device) directly */
++		snprintf(path, sizeof(path), DEVPATH_PREFIX);
++	} else if (_sio_oss_getdev(str, path, sizeof(path)) < 0) {
++		return -1;
++	}
++
+ 	if (mode == (SIO_PLAY | SIO_REC))
+ 		flags = O_RDWR;
+ 	else
+@@ -264,6 +281,19 @@ sio_oss_getfd(const char *str, unsigned 
+ 		DPERROR(path);
+ 		return -1;
+ 	}
++	/*
++	 * Check if the device supports playing/recording.
++	 * Unfortunately, it's possible for devices to be opened RDWR
++	 * even when they don't support playing/recording.
++	 */
++	if (mode & SIO_PLAY && ioctl(fd, SNDCTL_DSP_GETOSPACE, &bi) < 0) {
++		close(fd);
++		return -1;
++	}
++	if (mode & SIO_REC && ioctl(fd, SNDCTL_DSP_GETISPACE, &bi) < 0) {
++		close(fd);
++		return -1;
++	}
+ 	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;
+ }
+ 
++static int
++sio_oss_setvol(struct sio_hdl *sh, unsigned int vol)
++{
++	struct sio_oss_hdl *hdl = (struct sio_oss_hdl *)sh;
++	int newvol;
++
++	/* Scale to 0..100 */
++	newvol = 1.0 * 100 * vol / SIO_MAXVOL;
++	newvol = newvol | (newvol << 8);
++
++	if (ioctl(hdl->fd, SNDCTL_DSP_SETPLAYVOL, &newvol) < 0) {
++		DPERROR("sio_oss_setvol");
++		hdl->sio.eof = 1;
++		return 0;
++	}
++
++	return 1;
++}
++
++static void
++sio_oss_getvol(struct sio_hdl *sh)
++{
++	struct sio_oss_hdl *hdl = (struct sio_oss_hdl *)sh;
++	int vol;
++
++	if (ioctl(hdl->fd, SNDCTL_DSP_GETPLAYVOL, &vol) < 0) {
++		DPERROR("sio_oss_getvol");
++		hdl->sio.eof = 1;
++		return;
++	}
++
++	/* 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 */


More information about the svn-ports-all mailing list