On Thu, Dec 11, 2008 at 08:44:10PM +0000, Jacob Meuser wrote: > > please test ... and notice how much simpler this is than what it > replaces, even though esound prefers to use a fd for audio access.
new version based on some feedback. esd closes down stderr and stdout before starting the audio backend, so you might not see some messages from errors in the backend. for example: $ esd -r 11025 -b - server format: sample rate = 11025 Hz - server format: 8 bit samples but in fact, it is running at 16 bit 48 kHz, because the device does not support 8-bit or 11025 Hz. I patched out the closing of file descriptors in my tests but took out that patch for submission here, because I really don't know why esd was doing that. -- jake...@sdf.lonestar.org SDF Public Access UNIX System - http://sdf.lonestar.org Index: Makefile =================================================================== RCS file: /home2/cvs/OpenBSD/ports/audio/esound/Makefile,v retrieving revision 1.44 diff -u -r1.44 Makefile --- Makefile 31 Mar 2008 01:05:54 -0000 1.44 +++ Makefile 12 Dec 2008 04:46:39 -0000 @@ -4,7 +4,7 @@ COMMENT= sound library for Enlightenment DISTNAME= esound-0.2.38 -PKGNAME= ${DISTNAME}v0 +PKGNAME= ${DISTNAME}p0v0 SHARED_LIBS += esd 2.40 # .2.38 CATEGORIES= audio MASTER_SITES= ${MASTER_SITE_GNOME:=sources/esound/0.2/} @@ -18,7 +18,7 @@ PERMIT_PACKAGE_FTP= Yes PERMIT_DISTFILES_CDROM= Yes PERMIT_DISTFILES_FTP= Yes -WANTLIB= c m wrap +WANTLIB= c m sndio wrap FLAVORS= arts FLAVOR?= @@ -47,7 +47,7 @@ esdconfdir=${PREFIX}/share/examples/esound post-extract: - @cp -f ${FILESDIR}/audio_sun.c ${WRKSRC} + @cp -f ${FILESDIR}/audio_sndio.c ${WRKSRC} pre-configure: @perl -pi -e 's|_LOCALBASE_|${LOCALBASE}|' \ Index: files/audio_sndio.c =================================================================== RCS file: files/audio_sndio.c diff -N files/audio_sndio.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/audio_sndio.c 12 Dec 2008 04:46:39 -0000 @@ -0,0 +1,134 @@ +/* $OpenBSD$ */ + +/* + * Copyright (c) 2008 Jacob Meuser <jake...@sdf.lonestar.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "config.h" + +#include <sndio.h> + +struct sio_hdl *hdl = NULL; + +#define ARCH_esd_audio_close +void esd_audio_close() +{ + if (hdl != NULL) { + sio_close(hdl); + hdl = NULL; + } +} + +#define ARCH_esd_audio_open +int esd_audio_open() +{ + char *device; + struct sio_par par; + int mode = SIO_PLAY; + + if (hdl != NULL) { + fprintf(stderr, "sndio already opened\n"); + return(1); + } + + sio_initpar(&par); + + if ((esd_audio_format & ESD_MASK_FUNC) == ESD_RECORD) + mode |= SIO_REC; + + device = esd_audio_device ? esd_audio_device : getenv("AUDIODEVICE"); + if ((hdl = sio_open(device, mode, 0)) == NULL) { + fprintf(stderr, "sio_open failed\n"); + goto bad; + } + + par.le = (BYTE_ORDER == 4321) ? 0 : 1; + if ((esd_audio_format & ESD_MASK_BITS) == ESD_BITS16) { + par.bits = 16; + par.sig = 1; + } else { + par.bits = 8; + par.sig = 0; + } + + par.pchan = (((esd_audio_format & ESD_MASK_CHAN) == ESD_STEREO) ? 2 : 1); + if (mode & SIO_REC) + par.rchan = par.pchan; + + par.bufsz = ESD_BUF_SIZE; + + par.rate = esd_audio_rate; + + if (!sio_setpar(hdl, &par)) { + fprintf(stderr, "sio_setpar failed\n"); + goto bad; + } + + if (!sio_getpar(hdl, &par)) { + fprintf(stderr, "sio_getpar failed\n"); + goto bad; + } + + /* check that the actual parameters are what we asked for */ + if (fabs(par.rate - esd_audio_rate) > esd_audio_rate * 0.05) { + fprintf(stderr, "Unsupported rate: %i Hz\n", esd_audio_rate); + goto bad; + } + if ((esd_audio_format & ESD_MASK_BITS) == ESD_BITS16) { + if (par.sig != 1 || par.bits != 16) { + fprintf(stderr, "Unsupported bits: 16\n"); + goto bad; + } + } else { + if (par.sig != 0 || par.bits != 8) { + fprintf(stderr, "Unsupported bits: 8\n"); + goto bad; + } + } + if ((esd_audio_format & ESD_MASK_CHAN) == ESD_STEREO) { + if (par.pchan != 2) { + fprintf(stderr, "Unsupported channels: 2\n"); + goto bad; + } + } else { + if (par.pchan != 1) { + fprintf(stderr, "Unsupported channels: 1\n"); + goto bad; + } + } + + if (!sio_start(hdl)) { + fprintf(stderr, "sio_start failed\n"); + goto bad; + } + + return(1); + +bad: + esd_audio_close(); + return(-1); +} + +#define ARCH_esd_audio_write +int esd_audio_write(void *buffer, int buf_size) +{ + return sio_write(hdl, buffer, buf_size); +} + +#define ARCH_esd_audio_read +int esd_audio_read(void *buffer, int buf_size) +{ + return sio_read(hdl, buffer, buf_size); +} Index: files/audio_sun.c =================================================================== RCS file: files/audio_sun.c diff -N files/audio_sun.c --- files/audio_sun.c 31 Mar 2008 01:05:54 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,165 +0,0 @@ -/* $OpenBSD: audio_sun.c,v 1.4 2008/03/31 01:05:54 jakemsr Exp $ */ - -/* - * Copyright (c) 2002 CubeSoft Communications, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Neither the name of CubeSoft Communications, nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" - -#include <sys/types.h> -#include <sys/ioctl.h> -#include <sys/audioio.h> -#include <string.h> - -static void sun_panic(int fd, char *s) -{ - perror(s); - close(fd); - esd_audio_fd = -1; -} - -#define ARCH_esd_audio_devices -const char *esd_audio_devices() -{ - return "/dev/audio"; -} - - -#define ARCH_esd_audio_open -int esd_audio_open() -{ - const char *device; - int afd = -1; - int fmt = 0, channels = 0, bits = 0; - int mode = O_WRONLY; - audio_info_t info; - - AUDIO_INITINFO(&info); - - /* set the appropriate mode */ - if((esd_audio_format & ESD_MASK_FUNC) == ESD_RECORD) { - mode = O_RDWR; - info.mode = AUMODE_PLAY | AUMODE_PLAY_ALL | AUMODE_RECORD; - } else { - info.mode = AUMODE_PLAY | AUMODE_PLAY_ALL; - } - - /* open the sound device */ - device = esd_audio_device ? esd_audio_device : "/dev/audio"; - if ((afd = open(device, mode, 0)) == -1) { - perror(device); - return( -2 ); - } - - /* set the requested mode */ - if(ioctl(afd, AUDIO_SETINFO, &info) < 0) { - sun_panic(afd, "AUDIO_SETINFO"); - return(-1); - } - - /* set full-duplex mode if we are recording */ - if ( (esd_audio_format & ESD_MASK_FUNC) == ESD_RECORD ) { - if (ioctl(afd, AUDIO_SETFD, 1) == -1) { - sun_panic(afd, "AUDIO_SETFD"); - return(-1); - } - } - - /* pick a supported encoding */ - if ((esd_audio_format & ESD_MASK_BITS) == ESD_BITS16) { - bits = 16; - fmt = (BYTE_ORDER == 4321) ? - AUDIO_ENCODING_SLINEAR_BE : AUDIO_ENCODING_SLINEAR_LE; - } else { - bits = 8; - fmt = (BYTE_ORDER == 4321) ? - AUDIO_ENCODING_ULINEAR_BE : AUDIO_ENCODING_ULINEAR_LE; - } - info.play.encoding = fmt; - info.play.precision = bits; - if(ioctl(afd, AUDIO_SETINFO, &info) == -1) { - fprintf(stderr, "Unsupported encoding: %i-bit (0x%x)\n", - bits, fmt); - sun_panic(afd, "SETINFO"); - return(-1); - } - - /* number of channels */ - channels = (((esd_audio_format & ESD_MASK_CHAN) == ESD_STEREO) - ? /* stereo */ 2 - : /* mono */ 1); - - info.play.channels = channels; - if((esd_audio_format & ESD_MASK_FUNC) == ESD_RECORD) { - info.record.channels = channels; - } - if(ioctl(afd, AUDIO_SETINFO, &info) == -1) { - fprintf(stderr, "Unsupported channel count: %d\n", - channels); - sun_panic(afd, "SETINFO"); - return(-1); - } - - /* blocksize, sync to internal esd buffer size */ - info.blocksize = ESD_BUF_SIZE; - info.hiwat = 4; - if(ioctl(afd, AUDIO_SETINFO, &info) < 0) { - fprintf(stderr, "Unsupported blocksize: %d\n", - info.blocksize); - sun_panic(afd, "SETINFO"); - return(-1); - } - - /* finally, set the sample rate */ - info.play.sample_rate = esd_audio_rate; - if(ioctl(afd, AUDIO_SETINFO, &info) < 0 || - fabs(info.play.sample_rate - esd_audio_rate) > esd_audio_rate * 0.05) { - fprintf(stderr, "Unsupported rate: %i Hz\n", esd_audio_rate); - sun_panic(afd, "SETINFO"); - return(-1); - } - - return(esd_audio_fd = afd); -} - -#define ARCH_esd_audio_pause -void esd_audio_pause() -{ - audio_info_t info; - int afd = esd_audio_fd; - - AUDIO_INITINFO(&info); - - if(ioctl(afd, AUDIO_GETINFO, &info) < 0) { - sun_panic(afd, "AUDIO_GETINFO"); - return; - } - - if((info.mode & AUMODE_PLAY) == AUMODE_PLAY) - info.play.pause = !info.play.pause; - if((info.mode & AUMODE_RECORD) == AUMODE_RECORD) - info.record.pause = !info.record.pause; - - return; -} Index: patches/patch-audio_c =================================================================== RCS file: /home2/cvs/OpenBSD/ports/audio/esound/patches/patch-audio_c,v retrieving revision 1.5 diff -u -r1.5 patch-audio_c --- patches/patch-audio_c 31 Mar 2008 01:05:54 -0000 1.5 +++ patches/patch-audio_c 12 Dec 2008 04:46:39 -0000 @@ -1,6 +1,6 @@ $OpenBSD: patch-audio_c,v 1.5 2008/03/31 01:05:54 jakemsr Exp $ ---- audio.c.orig Thu Apr 19 17:43:59 2007 -+++ audio.c Sat Jun 2 23:15:49 2007 +--- audio.c.orig Thu Apr 19 07:43:59 2007 ++++ audio.c Thu Dec 11 04:01:24 2008 @@ -20,34 +20,7 @@ static int esd_audio_fd = -1; /*******************************************************************/ /* returns audio_fd for use by main prog - platform dependent */ @@ -33,7 +33,7 @@ -#else -# include "audio_none.c" -#endif -+#include "audio_sun.c" ++#include "audio_sndio.c" /*******************************************************************/ /* display available devices */ Index: patches/patch-configure_ac =================================================================== RCS file: /home2/cvs/OpenBSD/ports/audio/esound/patches/patch-configure_ac,v retrieving revision 1.3 diff -u -r1.3 patch-configure_ac --- patches/patch-configure_ac 31 Mar 2008 01:05:54 -0000 1.3 +++ patches/patch-configure_ac 12 Dec 2008 04:46:39 -0000 @@ -1,7 +1,15 @@ $OpenBSD: patch-configure_ac,v 1.3 2008/03/31 01:05:54 jakemsr Exp $ --- configure.ac.orig Thu May 3 13:47:30 2007 -+++ configure.ac Sun Mar 9 20:03:26 2008 -@@ -301,21 +301,16 @@ if test "x$enable_local_sound" = "xyes"; then ++++ configure.ac Thu Dec 11 04:16:03 2008 +@@ -48,6 +48,7 @@ AC_C_INLINE + + dnl Check for system libs needed + ++LIBS="$LIBS -lsndio" + AC_FUNC_ALLOCA + AC_CHECK_FUNCS(setenv putenv fchown fchmod gethostbyname2) + AC_CHECK_FUNC(connect,,[AC_CHECK_LIB(socket,connect)]) +@@ -301,21 +302,16 @@ if test "x$enable_local_sound" = "xyes"; then if test "x$HAVE_ARTS" = "xyes"; then found_sound=yes CFLAGS="$CFLAGS $ARTSC_CFLAGS" @@ -24,7 +32,7 @@ AC_CHECK_FUNC(ALnewconfig,,[AC_CHECK_LIB(audio,ALnewconfig)]) if test "x$enable_alsa" = "xyes"; then AC_CHECK_FUNC(snd_cards,,[AC_CHECK_LIB(sound,snd_cards)]) -@@ -393,7 +388,8 @@ if test "x$with_libwrap" = "xyes"; then +@@ -393,7 +389,8 @@ if test "x$with_libwrap" = "xyes"; then wrap_ok=no AC_TRY_LINK( @@ -34,7 +42,7 @@ #include <syslog.h> int allow_severity = LOG_INFO; int deny_severity = LOG_WARNING;], -@@ -403,7 +399,8 @@ int deny_severity = LOG_WARNING;], +@@ -403,7 +400,8 @@ int deny_severity = LOG_WARNING;], wrap_ok=yes], [LIBS="$LIBS -lnsl" AC_TRY_LINK( Index: pkg/PLIST =================================================================== RCS file: /home2/cvs/OpenBSD/ports/audio/esound/pkg/PLIST,v retrieving revision 1.18 diff -u -r1.18 PLIST --- pkg/PLIST 31 Mar 2008 01:05:54 -0000 1.18 +++ pkg/PLIST 12 Dec 2008 04:46:39 -0000 @@ -1,14 +1,14 @@ @comment $OpenBSD: PLIST,v 1.18 2008/03/31 01:05:54 jakemsr Exp $ -bin/esd +...@bin bin/esd bin/esd-config -bin/esdcat -bin/esdctl -bin/esdfilt -bin/esdloop -bin/esdmon -bin/esdplay -bin/esdrec -bin/esdsample +...@bin bin/esdcat +...@bin bin/esdctl +...@bin bin/esdfilt +...@bin bin/esdloop +...@bin bin/esdmon +...@bin bin/esdplay +...@bin bin/esdrec +...@bin bin/esdsample include/esd.h lib/libesd.a lib/libesd.la