This diff adds sndio output to audio/xmms. Please test.
Thanks to Jacob Meuser and Alexandre Ratchov for help and advice.
Index: Makefile
===================================================================
RCS file: /home2/cvs/OpenBSD/ports/audio/xmms/Makefile,v
retrieving revision 1.58
diff -u -r1.58 Makefile
--- Makefile 14 Jan 2008 01:16:37 -0000 1.58
+++ Makefile 20 Dec 2008 10:42:56 -0000
@@ -10,7 +10,7 @@
VERSION= 1.2.11
DISTNAME= xmms-${VERSION}
-PKGNAME-main= xmms-${VERSION}p1
+PKGNAME-main= xmms-${VERSION}p2
PKGNAME-esd= xmms-esd-${VERSION}p0
PKGNAME-vorbis= xmms-vorbis-${VERSION}p0
PKGNAME-mikmod= xmms-mikmod-${VERSION}p0
@@ -26,7 +26,7 @@
PERMIT_PACKAGE_FTP= Yes
PERMIT_DISTFILES_CDROM= Yes
PERMIT_DISTFILES_FTP= Yes
-WANTLIB= X11 Xau Xdmcp Xext Xi glib gmodule m
+WANTLIB= X11 Xau Xdmcp Xext Xi glib gmodule m sndio
V= 1.2.x
MASTER_SITES= ${HOMEPAGE}/files/$V/ \
@@ -58,6 +58,7 @@
WANTLIB-main= ${WANTLIB} GL ICE c Xxf86vm SM pthread
MODULES= devel/gettext
+BUILD_DEPENDS= ${MODGNU_AUTOCONF_DEPENDS} ${MODGNU_AUTOMAKE_DEPENDS}
RUN_DEPENDS= :unzip-*:archivers/unzip
LIB_DEPENDS= gtk.>=1.2,gdk.>=1.2::x11/gtk+ \
gthread.>=1.2::devel/glib
@@ -65,8 +66,9 @@
USE_X11= Yes
USE_LIBTOOL= Yes
LIBTOOL_FLAGS= --tag=disable-static
-CONFIGURE_STYLE= autoconf
+CONFIGURE_STYLE= gnu
AUTOCONF_VERSION= 2.59
+AUTOMAKE_VERSION= 1.9
CONFIGURE_ARGS= --without-gnome \
--enable-ipv6
@@ -111,8 +113,19 @@
CONFIGURE_ARGS+= --disable-mikmod
.endif
-pre-configure:
- @cd ${WRKSRC}/libxmms && ${LOCALBASE}/bin/autoconf-${AUTOCONF_VERSION}
+post-patch:
+ @mkdir -p ${WRKSRC}/Output/sndio
+ @cp ${FILESDIR}/{Makefile.am,audio_sndio.c} ${WRKSRC}/Output/sndio
+.for dir in $${WRKSRC} $${WRKSRC}/libxmms
+ cd ${dir} && env AUTOCONF_VERSION=${AUTOCONF_VERSION} \
+ AUTOMAKE_VERSION=${AUTOMAKE_VERSION} aclocal
+ cd ${dir} && env AUTOCONF_VERSION=${AUTOCONF_VERSION} \
+ AUTOMAKE_VERSION=${AUTOMAKE_VERSION} autoheader
+ cd ${dir} && env AUTOCONF_VERSION=${AUTOCONF_VERSION} \
+ AUTOMAKE_VERSION=${AUTOMAKE_VERSION} automake
+ cd ${dir} && env AUTOCONF_VERSION=${AUTOCONF_VERSION} \
+ AUTOMAKE_VERSION=${AUTOMAKE_VERSION} autoconf
+.endfor
post-install:
${INSTALL_DATA_DIR} ${PREFIX}/share/doc/xmms
Index: files/Makefile.am
===================================================================
RCS file: files/Makefile.am
diff -N files/Makefile.am
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ files/Makefile.am 20 Dec 2008 10:42:56 -0000
@@ -0,0 +1,17 @@
+if HAVE_SNDIO
+sndioltlibs = libsndio.la
+sndiosources = audio_sndio.c
+else
+sndioltlibs =
+sndiosources =
+endif
+
+EXTRA_DIST = audio_sndio.c
+
+libdir = $(plugindir)/$(OUTPUT_PLUGIN_DIR)
+lib_LTLIBRARIES = $(sndioltlibs)
+
+INCLUDES = @GTK_CFLAGS@ -I$(top_builddir)/intl -I$(top_srcdir)
+libsndio_la_LDFLAGS = @PLUGIN_LDFLAGS@
+libsndio_la_LIBADD = @GTK_LIBS@ @PTHREAD_LIBS@
+libsndio_la_SOURCES= $(sndiosources)
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 20 Dec 2008 10:42:56 -0000
@@ -0,0 +1,263 @@
+/*
+ * Copyright (c) 2008 Thomas Pfaff <[email protected]>
+ *
+ * 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 <stdio.h>
+
+#include <gtk/gtk.h>
+#include <sndio.h>
+#include <xmms/plugin.h>
+#include <libxmms/util.h>
+
+#define XMMS_MAXVOL 100
+
+static void op_about (void);
+static void op_get_volume (int *, int *);
+static void op_set_volume (int, int);
+static int op_open (AFormat, int, int);
+static void op_write (void *, int);
+static void op_close (void);
+static void op_seek (int);
+static void op_pause (short);
+static int op_buffer_free (void);
+static int op_playing (void);
+static int op_get_output_time (void);
+static int op_get_written_time (void);
+
+static void onmove_cb (void *, int);
+
+static struct sio_par par;
+static struct sio_hdl *hdl;
+static long long rdpos;
+static long long wrpos;
+static int paused;
+static int volume = XMMS_MAXVOL;
+static long bytes_per_sec;
+
+static OutputPlugin sndio_op = {
+ NULL,
+ NULL,
+ "sndio Output Plugin",
+ NULL,
+ op_about,
+ NULL,
+ op_get_volume,
+ op_set_volume,
+ op_open,
+ op_write,
+ op_close,
+ op_seek,
+ op_pause,
+ op_buffer_free,
+ op_playing,
+ op_get_output_time,
+ op_get_written_time
+};
+
+OutputPlugin *
+get_oplugin_info (void)
+{
+ return &sndio_op;
+}
+
+static void
+op_about (void)
+{
+ static GtkWidget *about;
+
+ if (about != NULL)
+ return;
+
+ about = xmms_show_message (
+ "About sndio Output Plugin",
+ "XMMS sndio Output Plugin\n\n"
+ "Written by Thomas Pfaff <[email protected]>\n",
+ "Ok", FALSE, NULL, NULL);
+
+ gtk_signal_connect (GTK_OBJECT (about), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroyed), &about);
+}
+
+static void
+op_get_volume (int *left, int *right)
+{
+ *left = *right = volume;
+}
+
+static void
+op_set_volume (int left, int right)
+{
+ /* Ignore balance control, so use unattenuated channel. */
+ volume = left > right ? left : right;
+ if (hdl != NULL)
+ sio_setvol (hdl, volume * SIO_MAXVOL / XMMS_MAXVOL);
+}
+
+static int
+op_open (AFormat fmt, int rate, int nch)
+{
+ struct sio_par askpar;
+
+ if ((hdl = sio_open (NULL, SIO_PLAY, 0)) == NULL) {
+ fprintf (stderr, "%s: failed to open audio device\n", __func__);
+ return 0;
+ }
+
+ sio_initpar (&par);
+ switch (fmt) {
+ case FMT_U8:
+ par.bits = 8;
+ par.sig = 0;
+ break;
+ case FMT_S8:
+ par.bits = 8;
+ par.sig = 1;
+ break;
+ case FMT_U16_LE:
+ par.bits = 16;
+ par.sig = 0;
+ par.le = 1;
+ break;
+ case FMT_U16_BE:
+ par.bits = 16;
+ par.sig = 0;
+ par.le = 0;
+ break;
+ case FMT_U16_NE:
+ par.bits = 16;
+ par.sig = 0;
+ par.le = SIO_LE_NATIVE;
+ break;
+ case FMT_S16_LE:
+ par.bits = 16;
+ par.sig = 1;
+ par.le = 1;
+ break;
+ case FMT_S16_BE:
+ par.bits = 16;
+ par.sig = 1;
+ par.le = 0;
+ case FMT_S16_NE:
+ par.bits = 16;
+ par.sig = 1;
+ par.le = SIO_LE_NATIVE;
+ break;
+ default:
+ fprintf (stderr, "%s: unknown format requested\n", __func__);
+ op_close ();
+ return 0;
+ }
+ par.pchan = nch;
+ par.rate = rate;
+
+ askpar = par;
+ if (!sio_setpar (hdl, &par) || !sio_getpar (hdl, &par)) {
+ fprintf (stderr, "%s: failed to set parameters\n", __func__);
+ op_close ();
+ return 0;
+ }
+
+ if ((par.bits == 16 && par.le != askpar.le) ||
+ par.bits != askpar.bits ||
+ par.sig != askpar.sig ||
+ par.pchan != askpar.pchan ||
+ par.rate != askpar.rate) {
+ fprintf (stderr, "%s: parameters not supported\n", __func__);
+ xmms_show_message ("Unsupported format", "XMMS requested a "
+ "format that is not supported by the audio device.\n\n"
+ "Please try again with the aucat(1) server running.",
+ "OK", FALSE, NULL, NULL);
+ op_close ();
+ return 0;
+ }
+
+ wrpos = 0;
+ rdpos = 0;
+ sio_onmove (hdl, onmove_cb, NULL);
+
+ op_set_volume (volume, volume);
+
+ paused = 0;
+ if (!sio_start (hdl)) {
+ fprintf (stderr, "%s: failed to start audio device\n",
+ __func__);
+ op_close ();
+ return 0;
+ }
+
+ bytes_per_sec = par.bps * par.pchan * par.rate;
+ return 1;
+}
+
+static void
+op_write (void *ptr, int len)
+{
+ if (!paused)
+ wrpos += sio_write (hdl, ptr, len);
+}
+
+static void
+op_close (void)
+{
+ if (hdl != NULL) {
+ sio_close (hdl);
+ hdl = NULL;
+ }
+}
+
+static void
+op_seek (int time_ms)
+{
+ int bufused = (rdpos < 0) ? wrpos : wrpos - rdpos;
+ rdpos = time_ms / 1000 * bytes_per_sec;
+ wrpos = rdpos + bufused;
+}
+
+static void
+op_pause (short flag)
+{
+ paused = flag;
+}
+
+static int
+op_buffer_free (void)
+{
+#define MAGIC 1000000 /* See Output/{OSS,sun,esd}/audio.c */
+ return paused ? 0 : MAGIC;
+}
+
+static int
+op_playing (void)
+{
+ return paused ? TRUE : FALSE;
+}
+
+static int
+op_get_output_time (void)
+{
+ return hdl ? rdpos * 1000 / bytes_per_sec : 0;
+}
+
+static int
+op_get_written_time (void)
+{
+ return hdl ? wrpos * 1000 / bytes_per_sec : 0;
+}
+
+static void
+onmove_cb (void *addr, int delta)
+{
+ rdpos += delta * (int)(par.bps * par.pchan);
+}
Index: patches/patch-Output_Makefile_am
===================================================================
RCS file: patches/patch-Output_Makefile_am
diff -N patches/patch-Output_Makefile_am
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-Output_Makefile_am 20 Dec 2008 10:42:56 -0000
@@ -0,0 +1,7 @@
+$OpenBSD$
+--- Output/Makefile.am.orig Sat Dec 20 02:20:46 2008
++++ Output/Makefile.am Mon May 19 14:22:06 2003
+@@ -1,2 +1,2 @@
+-ALL_PLUGINS = OSS esd disk_writer solaris sun alsa
++ALL_PLUGINS = OSS esd disk_writer solaris sun alsa sndio
+ SUBDIRS = @OUTPUT_PLUGINS@
Index: patches/patch-configure_in
===================================================================
RCS file: /home2/cvs/OpenBSD/ports/audio/xmms/patches/patch-configure_in,v
retrieving revision 1.8
diff -u -r1.8 patch-configure_in
--- patches/patch-configure_in 8 Dec 2007 21:54:57 -0000 1.8
+++ patches/patch-configure_in 20 Dec 2008 10:42:56 -0000
@@ -1,7 +1,47 @@
$OpenBSD: patch-configure_in,v 1.8 2007/12/08 21:54:57 ajacoutot Exp $
---- configure.in.orig Fri Nov 16 22:52:30 2007
-+++ configure.in Fri Nov 23 16:25:25 2007
-@@ -607,7 +607,7 @@ AC_SUBST([GENERAL_PLUGIN_DIR])
+--- configure.in.orig Fri Nov 16 13:52:30 2007
++++ configure.in Sat Dec 20 01:48:39 2008
+@@ -423,7 +423,8 @@ dnl ***
+ LIBS_save=$LIBS
+ CFLAGS_save=$CFLAGS
+ LDFLAGS_save=$LDFLAGS
+-AM_PATH_ALSA([0.9.0], [have_alsa=yes], [have_alsa=no])
++dnl AM_PATH_ALSA([0.9.0], [have_alsa=yes], [have_alsa=no])
++have_alsa=no
+ AM_CONDITIONAL([HAVE_ALSA], [test "x${have_alsa}" = "xyes"])
+ LIBS=$LIBS_save
+ CFLAGS=$CFLAGS_save
+@@ -449,7 +450,29 @@ if test "x$xmms_cv_newpcm_driver" = "xyes"; then
+ AC_DEFINE([HAVE_NEWPCM], [1], [Define if you have the FreeBSD newpcm
driver])
+ fi
+
++dnl *** Check for libsndio
++AC_ARG_ENABLE([sndio],
++ [ --disable-sndio disable the libsndio output plugin],
++ [have_sndio=$enableval], [have_sndio=yes])
+
++if test "x$have_sndio" = "xauto"; then
++ AC_CHECK_HEADERS([sndio.h])
++ if test "x${ac_cv_header_sndio_h}" = "xyes"; then
++ have_sndio=yes
++ fi
++ if test "x${have_sndio}" = "xyes"; then
++ AC_CHECK_LIB(sndio, sio_open, [have_sndio=yes], [have_sndio=no])
++ fi
++fi
++if test "x$have_sndio" = "xyes"; then
++ AC_DEFINE([HAVE_SNDIO], [1], [Define if the libsndio output plugin should
be built])
++ LIBS="$LIBS -lsndio"
++else
++ have_sndio=no
++fi
++AM_CONDITIONAL([HAVE_SNDIO], [test "x$have_sndio" = "xyes"])
++
++
+ AC_CHECK_HEADERS([linux/cdrom.h])
+ AC_CHECK_HEADERS([sys/cdrio.h])
+ AC_CHECK_HEADERS([sys/cdio.h])
+@@ -607,7 +630,7 @@ AC_SUBST([GENERAL_PLUGIN_DIR])
AC_SUBST([VISUALIZATION_PLUGIN_DIR])
AC_SUBST([pluginsubs])
@@ -10,3 +50,19 @@
if test "x$enable_user_plugin_dir" = "xno"; then
AC_DEFINE(DISABLE_USER_PLUGIN_DIR,, [Define to disable per user plugin
directory])
+@@ -635,6 +658,7 @@ Output/Makefile
+ Output/OSS/Makefile
+ Output/esd/Makefile
+ Output/disk_writer/Makefile
++Output/sndio/Makefile
+ Output/solaris/Makefile
+ Output/sun/Makefile
+ Output/alsa/Makefile
+@@ -670,6 +694,7 @@ echo " Current xmms $XMMS_PATH"
+ fi
+
+ echo " Build OSS plugin: $have_oss"
++echo " Build sndio plugin: $have_sndio"
+ echo " Build esd plugin: $have_esd"
+ echo " Build Solaris plugin: $have_solaris"
+ echo " Build BSD Sun plugin: $have_sun"
Index: pkg/PLIST-main
===================================================================
RCS file: /home2/cvs/OpenBSD/ports/audio/xmms/pkg/PLIST-main,v
retrieving revision 1.3
diff -u -r1.3 PLIST-main
--- pkg/PLIST-main 8 Dec 2007 21:54:57 -0000 1.3
+++ pkg/PLIST-main 20 Dec 2008 10:42:56 -0000
@@ -1,7 +1,7 @@
@comment $OpenBSD: PLIST-main,v 1.3 2007/12/08 21:54:57 ajacoutot Exp $
@pkgpath audio/xmms
-bin/wmxmms
-bin/xmms
+...@bin bin/wmxmms
+...@bin bin/xmms
bin/xmms-config
include/xmms/
include/xmms/configfile.h
@@ -43,6 +43,8 @@
@comment lib/xmms/Output/libdisk_writer.la
lib/xmms/Output/libdisk_writer.so
@comment lib/xmms/Output/libesdout.la
+...@comment lib/xmms/Output/libsndio.la
+lib/xmms/Output/libsndio.so
@comment lib/xmms/Output/libsun.la
lib/xmms/Output/libsun.so
lib/xmms/Visualization/