also make sndio the default audio sink -- jake...@sdf.lonestar.org SDF Public Access UNIX System - http://sdf.lonestar.org
Index: Makefile =================================================================== RCS file: /cvs/ports/audio/akode/Makefile,v retrieving revision 1.16 diff -N -u -p Makefile --- Makefile 19 Jul 2009 22:49:12 -0000 1.16 +++ Makefile 10 Dec 2009 06:55:37 -0000 @@ -3,7 +3,7 @@ COMMENT= decoding library for KDE Multimedia DISTNAME= akode-2.0.2 -PKGNAME= ${DISTNAME}p9 +PKGNAME= ${DISTNAME}p10 SHARED_LIBS += akode 2.1 # .2.0 CATEGORIES= audio multimedia x11/kde @@ -29,14 +29,18 @@ LIB_DEPENDS= FLAC.>=8::audio/flac \ jack::audio/jack WANTLIB= a52 bz2 c faac faad samplerate m mp3lame ogg pthread \ - oil-0.3 schroedinger-1.0 stdc++ theora x264 z + oil-0.3 schroedinger-1.0 sndio stdc++ theora x264 z USE_X11= Yes USE_GMAKE= Yes USE_LIBTOOL= Yes -CONFIGURE_STYLE= autoconf +BUILD_DEPENDS= ${MODGNU_AUTOCONF_DEPENDS} \ + ${MODGNU_AUTOMAKE_DEPENDS} + +CONFIGURE_STYLE= gnu AUTOCONF_VERSION= 2.60 +AUTOMAKE_VERSION= 1.9 CONFIGURE= /bin/sh ${WRKDIST}/admin/cvs.sh configure CONFIGURE_ENV= PTHREAD_LIBS=-pthread CONFIGURE_ARGS+= --with-extra-includes=${LOCALBASE}/include \ @@ -44,5 +48,15 @@ CONFIGURE_ARGS+= --with-extra-includes=${LOCALBASE}/in --with-jack \ --without-polyaudio \ --without-oss + +post-extract: + mkdir -p ${WRKSRC}/akode/plugins/sndio_sink + cp ${FILESDIR}/{Makefile.am,sndio_sink.*} ${WRKSRC}/akode/plugins/sndio_sink + +pre-configure: + cd ${WRKSRC} && \ + AUTOCONF_VERSION=${AUTOCONF_VERSION} \ + AUTOMAKE_VERSION=${AUTOMAKE_VERSION} \ + autoreconf -i .include <bsd.port.mk> Index: files/Makefile.am =================================================================== RCS file: files/Makefile.am diff -N -u -p files/Makefile.am --- /dev/null 9 Dec 2009 23:55:38 -0000 +++ files/Makefile.am 10 Dec 2009 06:55:37 -0000 @@ -0,0 +1,7 @@ +INCLUDES = -I$(top_srcdir)/akode/lib -I$(top_builddir)/akode/lib $(all_includes) + +lib_LTLIBRARIES = libakode_sndio_sink.la + +libakode_sndio_sink_la_SOURCES = sndio_sink.cpp +libakode_sndio_sink_la_LDFLAGS = -module -avoid-version -no-undefined +libakode_sndio_sink_la_LIBADD = ../../lib/libakode.la $(LIBSNDIO) Index: files/sndio_sink.cpp =================================================================== RCS file: files/sndio_sink.cpp diff -N -u -p files/sndio_sink.cpp --- /dev/null 9 Dec 2009 23:55:38 -0000 +++ files/sndio_sink.cpp 10 Dec 2009 06:55:37 -0000 @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2009 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> + +#include <string.h> +#include <unistd.h> + +#include <audioframe.h> +#include "sndio_sink.h" + +#include <iostream> + +namespace aKode { + +extern "C" { SndioSinkPlugin sndio_sink; } + +struct SndioSink::private_data +{ + private_data() : hdl(0), valid(false) {}; + struct sio_hdl *hdl; + struct sio_par par; + + AudioConfiguration config; + bool valid; +}; + +SndioSink::SndioSink() +{ + d = new private_data; +} + +SndioSink::~SndioSink() +{ + close(); + delete d; +} + +bool +SndioSink::open() +{ + d->hdl = ::sio_open(NULL, SIO_PLAY, 0); + + if (d->hdl == NULL) { + std::cerr << "akode: could not open sndio device\n"; + goto failed; + } + if (!sio_start(d->hdl)) { + std::cerr << "akode: could not start sndio device\n"; + goto failed; + } + d->valid = true; + return true; + +failed: + d->valid = false; + return false; +} + +void +SndioSink::close() { + if (d->hdl != NULL) + ::sio_close(d->hdl); + d->hdl = NULL; + d->valid = false; +} + +int +SndioSink::setAudioConfiguration(const AudioConfiguration* config) +{ + d->config = *config; + + if (d->valid) + sio_stop(d->hdl); + + sio_initpar(&d->par); + + if (config->sample_width < 0) { + d->par.bits = 16; + d->par.sig = 1; + } else { + d->par.bits = config->sample_width; + if (d->par.bits == 8) + d->par.sig = 0; + else + d->par.sig = 1; + } + d->par.pchan = config->channels; + d->par.rate = config->sample_rate; + + if (!sio_setpar(d->hdl, &d->par)) { + d->valid = false; + return -1; + } + if (!sio_getpar(d->hdl, &d->par)) { + d->valid = false; + return -1; + } + + d->config.sample_width = d->par.bits; + d->config.sample_rate = d->par.rate; + d->config.channels = d->par.pchan; + if (d->config.channels <= 2) + d->config.channel_config = MonoStereo; + + if (!sio_start(d->hdl)) { + std::cerr << "akode: could not restart sndio device\n"; + d->valid = false; + return -1; + } + + if (d->config == *config) + return 0; + else + return 1; +} + +const AudioConfiguration* +SndioSink::audioConfiguration() const +{ + return &d->config; +} + +bool +SndioSink::writeFrame(AudioFrame* frame) +{ + if (!d->valid) + return false; + + if (frame->sample_width != d->config.sample_width || + frame->channels != d->config.channels ) { + if (setAudioConfiguration(frame) < 0) + return false; + } + + int channels = d->config.channels; + int length = frame->length; + + int16_t *buffer = (int16_t*)alloca(length*channels*2); + int16_t** data = (int16_t**)frame->data; + for (int i = 0; i < length; i++) + for (int j = 0; j < channels; j++) + buffer[i * channels + j] = data[j][i]; + +// std::cerr << "Writing frame\n"; + int status = 0; + do { + status = ::sio_write(d->hdl, buffer, channels * length * 2); + if (status == 0) { + return false; + } + } while(false); + + return true; +} + +} // namespace Index: files/sndio_sink.h =================================================================== RCS file: files/sndio_sink.h diff -N -u -p files/sndio_sink.h --- /dev/null 9 Dec 2009 23:55:38 -0000 +++ files/sndio_sink.h 10 Dec 2009 06:55:37 -0000 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2009 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. + */ + +#ifndef _AKODE_SNDIO_SINK_H +#define _AKODE_SNDIO_SINK_H + +#include "sink.h" + +#include "akode_export.h" + +namespace aKode { + +class AudioConfiguration; +class AudioFrame; + +class SndioSink : public Sink { +public: + SndioSink(); + ~SndioSink(); + bool open(); + void close(); + int setAudioConfiguration(const AudioConfiguration *config); + const AudioConfiguration* audioConfiguration() const; + bool writeFrame(AudioFrame *frame); + struct private_data; +private: + template<class T> void _writeFrame(AudioFrame *frame); + private_data *d; +}; + +class SndioSinkPlugin : public SinkPlugin { +public: + virtual SndioSink* openSink() { + return new SndioSink(); + } +}; + +extern "C" AKODE_EXPORT SndioSinkPlugin sndio_sink; + +} // namespace + +#endif Index: patches/patch-akode_lib_auto_sink_cpp =================================================================== RCS file: patches/patch-akode_lib_auto_sink_cpp diff -N -u -p patches/patch-akode_lib_auto_sink_cpp --- /dev/null 9 Dec 2009 23:55:38 -0000 +++ patches/patch-akode_lib_auto_sink_cpp 10 Dec 2009 06:55:38 -0000 @@ -0,0 +1,12 @@ +$OpenBSD$ +--- akode/lib/auto_sink.cpp.orig Wed Dec 9 22:27:49 2009 ++++ akode/lib/auto_sink.cpp Wed Dec 9 22:29:23 2009 +@@ -66,6 +66,8 @@ bool AutoSink::open() + // Try Polypaudio + if (getenv("POLYP_SERVER")) + if (m_data->tryOpen("polyp")) return true; ++ // Try sndio ++ if (m_data->tryOpen("sndio")) return true; + // Try Jack + if (m_data->tryOpen("jack")) return true; + // Try ALSA Index: patches/patch-akode_plugins_Makefile_am =================================================================== RCS file: patches/patch-akode_plugins_Makefile_am diff -N -u -p patches/patch-akode_plugins_Makefile_am --- /dev/null 9 Dec 2009 23:55:38 -0000 +++ patches/patch-akode_plugins_Makefile_am 10 Dec 2009 06:55:38 -0000 @@ -0,0 +1,21 @@ +$OpenBSD$ +--- akode/plugins/Makefile.am.orig Wed Dec 9 21:37:22 2009 ++++ akode/plugins/Makefile.am Wed Dec 9 21:38:15 2009 +@@ -28,6 +28,10 @@ if include_sun_sink + AKODE_SUN_SINK=sun_sink + endif + ++if include_sndio_sink ++AKODE_SNDIO_SINK=sndio_sink ++endif ++ + if include_jack_sink + AKODE_JACK_SINK=jack_sink + endif +@@ -39,5 +43,5 @@ endif + SUBDIRS= $(AKODE_MPC_DECODER) $(AKODE_XIPH_DECODER) \ + $(AKODE_MPEG_DECODER) $(AKODE_FFMPEG_DECODER) \ + $(AKODE_ALSA_SINK) $(AKODE_OSS_SINK) $(AKODE_SUN_SINK) \ +- $(AKODE_JACK_SINK) $(AKODE_POLYP_SINK) \ ++ $(AKODE_SNDIO_SINK) $(AKODE_JACK_SINK) $(AKODE_POLYP_SINK) \ + $(AKODE_SRC_RESAMPLER) Index: patches/patch-configure_in =================================================================== RCS file: /cvs/ports/audio/akode/patches/patch-configure_in,v retrieving revision 1.2 diff -N -u -p patches/patch-configure_in --- patches/patch-configure_in 8 May 2007 15:16:37 -0000 1.2 +++ patches/patch-configure_in 10 Dec 2009 06:55:38 -0000 @@ -1,6 +1,6 @@ $OpenBSD: patch-configure_in,v 1.2 2007/05/08 15:16:37 naddy Exp $ ---- configure.in.orig Fri Apr 6 15:23:11 2007 -+++ configure.in Sat May 5 17:10:46 2007 +--- configure.in.orig Fri Apr 6 06:23:11 2007 ++++ configure.in Wed Dec 9 22:06:10 2009 @@ -120,7 +120,7 @@ AC_DEFUN([AC_CHECK_LIBFLAC], ]) @@ -55,7 +55,23 @@ $OpenBSD: patch-configure_in,v 1.2 2007/05/08 15:16:37 VORBISFILE_LIBS="-lvorbisfile" # for akode/plugins/xiph_decoder/ -@@ -257,8 +257,8 @@ kde_save_akode_libs="$LIBS" +@@ -228,6 +228,15 @@ AC_DEFUN([KDE_CHECK_SUN], + AC_CHECK_HEADERS([sys/audioio.h], [have_sun=yes]) + ]) + ++AC_DEFUN([KDE_CHECK_SNDIO], ++[ ++ have_sndio=no ++ ++ AC_CHECK_HEADERS([sndio.h], [have_sndio=yes]) ++ AC_CHECK_LIB(sndio, sio_open, [LIBSNDIO="-lsndio"]) ++ AC_SUBST(LIBSNDIO) ++]) ++ + AC_DEFUN([KDE_CHECK_ALSA], + [ + PKG_CHECK_MODULES([ALSA], [alsa >= 0.9], [have_alsa=yes], [have_alsa=no]) +@@ -257,8 +266,8 @@ kde_save_akode_libs="$LIBS" LIBS="$all_libraries $USER_LDFLAGS" CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" AC_TRY_COMPILE([ @@ -66,7 +82,7 @@ $OpenBSD: patch-configure_in,v 1.2 2007/05/08 15:16:37 #include <ogg/ogg.h> ],[ ],[ -@@ -267,7 +267,7 @@ AC_TRY_COMPILE([ +@@ -267,7 +276,7 @@ AC_TRY_COMPILE([ AC_MSG_RESULT($have_libspeex) if test x$have_libspeex = xyes; then KDE_CHECK_LIB(speex,speex_decoder_ctl,, @@ -75,7 +91,7 @@ $OpenBSD: patch-configure_in,v 1.2 2007/05/08 15:16:37 fi CFLAGS="$kde_save_akode_cflags" LIBS="$kde_save_akode_libs" -@@ -278,10 +278,10 @@ kde_save_akode_libs="$LIBS" +@@ -278,10 +287,10 @@ kde_save_akode_libs="$LIBS" LIBS="$all_libraries $USER_LDFLAGS" CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" AC_TRY_COMPILE([ @@ -90,7 +106,7 @@ $OpenBSD: patch-configure_in,v 1.2 2007/05/08 15:16:37 #include <ogg/ogg.h> ],[ ],[ -@@ -290,12 +290,12 @@ AC_TRY_COMPILE([ +@@ -290,12 +299,12 @@ AC_TRY_COMPILE([ AC_MSG_RESULT($have_libspeex11) if test x$have_libspeex11 = xyes; then KDE_CHECK_LIB(speex,speex_decode_int,, @@ -105,3 +121,39 @@ $OpenBSD: patch-configure_in,v 1.2 2007/05/08 15:16:37 fi CFLAGS="$kde_save_akode_cflags" LIBS="$kde_save_akode_libs" +@@ -548,6 +557,19 @@ if test "x$with_sun" != xno; then + fi + fi + ++AC_ARG_WITH(sndio, ++ [AS_HELP_STRING(--with-sndio, ++ [enable support for sndio output @<:@default=check@:>@])], ++ [], with_sndio=check) ++ ++if test "x$with_sndio" != xno; then ++ KDE_CHECK_SNDIO ++ ++ if test "x$with_sndio" != xcheck && test "x$have_sndio" != xyes; then ++ AC_MSG_FAILURE([--with-sndio was given, but test for sndio failed]) ++ fi ++fi ++ + AC_ARG_WITH(alsa, + [AS_HELP_STRING(--with-alsa, + [enable support for ALSA output @<:@default=check@:>@])], +@@ -586,6 +608,7 @@ AM_CONDITIONAL(include_src_resampler, test x$have_libs + AM_CONDITIONAL(include_alsa_sink, test x$have_alsa = xyes) + AM_CONDITIONAL(include_oss_sink, test x$have_oss = xyes) + AM_CONDITIONAL(include_sun_sink, test x$have_sun = xyes) ++AM_CONDITIONAL(include_sndio_sink, test x$have_sndio = xyes) + AM_CONDITIONAL(include_jack_sink, test x$have_jack = xyes) + AM_CONDITIONAL(include_polyp_sink, test x$have_polyp = xyes) + AM_CONDITIONAL(include_ffmpeg_decoder, test x$have_ffmpeg = xyes) +@@ -623,6 +646,7 @@ AC_CONFIG_FILES([ akode/plugins/oss_sink/Makefile ]) + AC_CONFIG_FILES([ akode/plugins/polyp_sink/Makefile ]) + AC_CONFIG_FILES([ akode/plugins/src_resampler/Makefile ]) + AC_CONFIG_FILES([ akode/plugins/sun_sink/Makefile ]) ++AC_CONFIG_FILES([ akode/plugins/sndio_sink/Makefile ]) + AC_CONFIG_FILES([ akode/plugins/xiph_decoder/Makefile ]) + AC_CONFIG_FILES([ akode/akode-config ]) + AC_OUTPUT Index: pkg/PFRAG.shared =================================================================== RCS file: /cvs/ports/audio/akode/pkg/PFRAG.shared,v retrieving revision 1.5 diff -N -u -p pkg/PFRAG.shared --- pkg/PFRAG.shared 12 Jan 2009 11:43:43 -0000 1.5 +++ pkg/PFRAG.shared 10 Dec 2009 06:55:38 -0000 @@ -4,6 +4,7 @@ lib/libakode_ffmpeg_decoder.so lib/libakode_jack_sink.so lib/libakode_mpc_decoder.so lib/libakode_mpeg_decoder.so +lib/libakode_sndio_sink.so lib/libakode_src_resampler.so lib/libakode_sun_sink.so lib/libakode_xiph_decoder.so Index: pkg/PLIST =================================================================== RCS file: /cvs/ports/audio/akode/pkg/PLIST,v retrieving revision 1.7 diff -N -u -p pkg/PLIST --- pkg/PLIST 12 Jan 2009 11:43:43 -0000 1.7 +++ pkg/PLIST 10 Dec 2009 06:55:38 -0000 @@ -38,6 +38,8 @@ lib/libakode.la @comment lib/libakode_mpc_decoder.la @comment lib/libakode_mpeg_decoder.a @comment lib/libakode_mpeg_decoder.la +...@comment lib/libakode_sndio_sink.a +...@comment lib/libakode_sndio_sink.la @comment lib/libakode_src_resampler.a @comment lib/libakode_src_resampler.la @comment lib/libakode_sun_sink.a