From owner-svn-ports-head@freebsd.org Wed Feb 1 17:04:30 2017 Return-Path: Delivered-To: svn-ports-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A1EF9CCBB23; Wed, 1 Feb 2017 17:04:30 +0000 (UTC) (envelope-from cpm@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 76BD01811; Wed, 1 Feb 2017 17:04:30 +0000 (UTC) (envelope-from cpm@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v11H4Tww082024; Wed, 1 Feb 2017 17:04:29 GMT (envelope-from cpm@FreeBSD.org) Received: (from cpm@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v11H4TGc082021; Wed, 1 Feb 2017 17:04:29 GMT (envelope-from cpm@FreeBSD.org) Message-Id: <201702011704.v11H4TGc082021@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cpm set sender to cpm@FreeBSD.org using -f From: "Carlos J. Puga Medina" Date: Wed, 1 Feb 2017 17:04:29 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r433052 - in head/audio/sndio: . files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the ports tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Feb 2017 17:04:30 -0000 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 (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 */