Here's an update to the audio/aqualung port. It adds:
* sndio backend based on the upstream support I wrote (with a minor
change from bufsz to appbufsz)
* wavpack support, since it got added to the ports tree recently
* use of SUBST_CMD
There should be a new release of aqualung next month with some cool new
features (e.g. Lua-based programmable title formatting), but I'm not
sure if it will make it before the ports lock, so I'm submitting this
now just in case. Plus, hopefully if I did something wrong with the
sndio support, you guys can correct me so I can fix it upstream before
the next release.
My -current box is having a problem running X at the moment, so the only
testing I did was compiling it and running it from the command line (it
appears to initialize the sndio support fine, but exits when Gtk senses
there is no display). I've been running upstream SVN on an older
-current box for months without issues, though.
Thanks,
Jeremy
Index: Makefile
===================================================================
RCS file: /cvs/ports/audio/aqualung/Makefile,v
retrieving revision 1.6
diff -u -r1.6 Makefile
--- Makefile 9 Jul 2008 02:07:36 -0000 1.6
+++ Makefile 27 Jan 2009 22:40:36 -0000
@@ -3,7 +3,7 @@
COMMENT= advanced music player
DISTNAME= aqualung-0.9beta9.1
-PKGNAME= ${DISTNAME}p4
+PKGNAME= ${DISTNAME}p5
CATEGORIES= audio
HOMEPAGE= http://aqualung.factorial.hu/
@@ -27,16 +27,17 @@
mpcdec::audio/libmpcdec \
FLAC::audio/flac \
avcodec,avformat,avutil::graphics/ffmpeg \
- jack::audio/jack
+ jack::audio/jack \
+ wavpack::audio/wavpack
RUN_DEPENDS= ::devel/desktop-file-utils
WANTLIB= X11 Xau Xcomposite Xcursor Xdamage Xdmcp Xext Xfixes \
Xi Xinerama Xrandr Xrender atk-1.0 bz2 c cairo expat \
- fontconfig freetype glib-2.0 glitz gmodule-2.0 \
- gobject-2.0 gthread-2.0 m mp3lame ogg ossaudio \
+ fontconfig freetype gio-2.0 glib-2.0 glitz gmodule-2.0 \
+ gobject-2.0 gthread-2.0 m mp3lame ogg \
pango-1.0 pangocairo-1.0 pangoft2-1.0 pixman-1 png pthread \
- samplerate sndfile stdc++ vorbis vorbisenc vorbisfile z
+ samplerate sndfile sndio stdc++ vorbis vorbisenc vorbisfile z
USE_X11= Yes
CONFIGURE_STYLE=gnu
@@ -45,7 +46,7 @@
-DPTHREAD_MIN_PRIORITY=0 -DPTHREAD_MAX_PRIORITY=31 \
-I${LOCALBASE}/include"
-# cddb, ifp, wavpack (requires lib*) - no package
+# cddb, ifp (requires lib*) - no package
# cdda (requires libcdio) - no package
# ladspa (requires liblrdf) - no package
# mod (requires libmodplug) - no package
@@ -59,26 +60,25 @@
--with-mpc \
--with-mpeg \
--with-ogg \
- --with-oss \
--with-podcast \
--with-sndfile \
--with-src \
--with-systray \
--with-vorbisenc \
+ --with-wavpack \
--without-alsa \
--without-cdda \
--without-cddb \
--without-ifp \
--without-ladspa \
--without-mod \
- --without-speex \
- --without-wavpack
+ --without-oss \
+ --without-speex
post-install:
mv ${PREFIX}/share/aqualung/doc ${PREFIX}/share/doc/aqualung
${INSTALL_DATA_DIR} ${PREFIX}/share/applications
- sed -e 's+%%PREFIX%%+${TRUEPREFIX}+' ${FILESDIR}/aqualung.desktop > \
+ @${SUBST_CMD} -c ${FILESDIR}/aqualung.desktop \
${PREFIX}/share/applications/aqualung.desktop
-
.include <bsd.port.mk>
Index: files/aqualung.desktop
===================================================================
RCS file: /cvs/ports/audio/aqualung/files/aqualung.desktop,v
retrieving revision 1.1
diff -u -r1.1 aqualung.desktop
--- files/aqualung.desktop 15 Mar 2008 11:54:10 -0000 1.1
+++ files/aqualung.desktop 27 Jan 2009 22:40:36 -0000
@@ -8,7 +8,7 @@
GenericName=Music Player
GenericName[de]=Musik-Wiedergabe
GenericName[fi]=musiikkisoitin
-Icon=%%PREFIX%%/share/aqualung/icon_64.png
+Icon=${PREFIX}/share/aqualung/icon_64.png
Exec=aqualung
Terminal=false
Categories=Application;AudioVideo;Audio;Player;
Index: patches/patch-configure
===================================================================
RCS file: patches/patch-configure
diff -N patches/patch-configure
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-configure 27 Jan 2009 22:40:36 -0000
@@ -0,0 +1,12 @@
+$OpenBSD$
+--- configure.orig Fri Jan 9 14:50:01 2009
++++ configure Fri Jan 9 14:50:03 2009
+@@ -9111,7 +9111,7 @@ AQUALUNG_DATADIR="-DAQUALUNG_DATADIR=\\\"$datadir/aqua
+ CFLAGS="$CFLAGS $BUILD_CFLAGS -Wall $PLATFORM_CFLAGS $AQUALUNG_SKINDIR
$AQUALUNG_LOCALEDIR $AQUALUNG_DATADIR -D_GNU_SOURCE"
+ CXXFLAGS="$CFLAGS"
+ CPPFLAGS="$gtk_CFLAGS $glib_CFLAGS $xml_CFLAGS $alsa_CFLAGS $jack_CFLAGS
$cdda_CFLAGS"
+-LIBS="decoder/libdecoder.a encoder/libencoder.a $gtk_LIBS $glib_LIBS
$xml_LIBS $jack_LIBS $lrdf_LIBS $src_LIBS $alsa_LIBS $oss_LIBS $sndfile_LIBS
$flac_LIBS $ogg_LIBS $wavpack_LIBS $speex_LIBS $mad_LIBS $mod_LIBS $mpc_LIBS
$mac_LIBS $lavc_LIBS $vorbisenc_LIBS $lame_LIBS $cdda_LIBS $cddb_LIBS $ifp_LIBS
$PLATFORM_LIBS $z_LIBS $bz2_LIBS"
++LIBS="decoder/libdecoder.a encoder/libencoder.a $gtk_LIBS $glib_LIBS
$xml_LIBS $jack_LIBS $lrdf_LIBS $src_LIBS $alsa_LIBS $oss_LIBS $sndfile_LIBS
$flac_LIBS $ogg_LIBS $wavpack_LIBS $speex_LIBS $mad_LIBS $mod_LIBS $mpc_LIBS
$mac_LIBS $lavc_LIBS $vorbisenc_LIBS $lame_LIBS $cdda_LIBS $cddb_LIBS $ifp_LIBS
$PLATFORM_LIBS $z_LIBS $bz2_LIBS -lsndio"
+
+
+ ac_config_files="$ac_config_files Makefile doc/Makefile skin/Makefile
skin/dark/Makefile skin/default/Makefile skin/metal/Makefile
skin/ocean/Makefile skin/plain/Makefile skin/woody/Makefile
skin/no_skin/Makefile src/Makefile src/decoder/Makefile src/encoder/Makefile
src/img/Makefile src/po/Makefile"
Index: patches/patch-src_core_c
===================================================================
RCS file: patches/patch-src_core_c
diff -N patches/patch-src_core_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_core_c 27 Jan 2009 22:40:36 -0000
@@ -0,0 +1,335 @@
+$OpenBSD$
+--- src/core.c.orig Tue Jan 1 04:11:42 2008
++++ src/core.c Fri Jan 9 14:46:42 2009
+@@ -45,6 +45,8 @@
+ #include <samplerate.h>
+ #endif /* HAVE_SRC */
+
++#include <sndio.h>
++
+ #ifdef HAVE_OSS
+ #include <sys/ioctl.h>
+ #include <sys/types.h>
+@@ -637,6 +639,154 @@ disk_thread(void * arg) {
+
+
+
++/* SNDIO output thread */
++void *
++sndio_thread(void * arg) {
++
++ u_int32_t i;
++ thread_info_t * info = (thread_info_t *)arg;
++ u_int32_t driver_offset = 0;
++ int bufsize = 1024;
++ int n_avail;
++ size_t bytes_written;
++ char recv_cmd;
++
++ short * sndio_short_buf;
++
++ struct sio_hdl * sndio_hdl;
++ struct timespec req_time;
++ struct timespec rem_time;
++ req_time.tv_sec = 0;
++ req_time.tv_nsec = 100000000;
++
++ sndio_hdl = info->sndio_hdl;
++ if ((info->sndio_short_buf = malloc(2*bufsize * sizeof(short))) ==
NULL) {
++ fprintf(stderr, "sndio_thread: malloc error\n");
++ exit(1);
++ }
++ sndio_short_buf = info->sndio_short_buf;
++
++ if ((l_buf = malloc(bufsize * sizeof(float))) == NULL) {
++ fprintf(stderr, "sndio_thread: malloc error\n");
++ exit(1);
++ }
++ if ((r_buf = malloc(bufsize * sizeof(float))) == NULL) {
++ fprintf(stderr, "sndio_thread: malloc error\n");
++ exit(1);
++ }
++#ifdef HAVE_LADSPA
++ ladspa_buflen = bufsize;
++#endif /* HAVE_LADSPA */
++
++
++ while (1) {
++ sndio_wake:
++ while (rb_read_space(rb_disk2out)) {
++ rb_read(rb_disk2out, &recv_cmd, 1);
++ switch (recv_cmd) {
++ case CMD_FLUSH:
++ while ((n_avail = rb_read_space(rb)) > 0) {
++ if (n_avail > 2*bufsize * sizeof(short))
++ n_avail = 2*bufsize *
sizeof(short);
++ rb_read(rb, (char *)sndio_short_buf,
++ 2*bufsize *
sizeof(short));
++ }
++ rb_write(rb_out2disk, (char *)&driver_offset,
sizeof(u_int32_t));
++ goto sndio_wake;
++ break;
++ case CMD_FINISH:
++ goto sndio_finish;
++ break;
++ default:
++ fprintf(stderr, "sndio_thread: recv'd unknown
command %d\n", recv_cmd);
++ break;
++ }
++ }
++
++ if ((n_avail = rb_read_space(rb) / (2*sample_size)) == 0) {
++ nanosleep(&req_time, &rem_time);
++ goto sndio_wake;
++ }
++
++ if (n_avail > bufsize)
++ n_avail = bufsize;
++
++ for (i = 0; i < n_avail; i++) {
++ rb_read(rb, (char *)&(l_buf[i]), sample_size);
++ rb_read(rb, (char *)&(r_buf[i]), sample_size);
++ }
++
++#ifdef HAVE_LADSPA
++ if (options.ladspa_is_postfader) {
++ for (i = 0; i < n_avail; i++) {
++ l_buf[i] *= left_gain;
++ r_buf[i] *= right_gain;
++ }
++ }
++#else
++ for (i = 0; i < n_avail; i++) {
++ l_buf[i] *= left_gain;
++ r_buf[i] *= right_gain;
++ }
++#endif /* HAVE_LADSPA */
++
++ if (n_avail < bufsize) {
++ for (i = n_avail; i < bufsize; i++) {
++ l_buf[i] = 0.0f;
++ r_buf[i] = 0.0f;
++ }
++ }
++
++ /* plugin processing */
++#ifdef HAVE_LADSPA
++ plugin_lock = 1;
++ for (i = 0; i < n_plugins; i++) {
++ if (plugin_vect[i]->is_bypassed)
++ continue;
++
++ if (plugin_vect[i]->handle) {
++
plugin_vect[i]->descriptor->run(plugin_vect[i]->handle, ladspa_buflen);
++ }
++ if (plugin_vect[i]->handle2) {
++
plugin_vect[i]->descriptor->run(plugin_vect[i]->handle2, ladspa_buflen);
++ }
++ }
++ plugin_lock = 0;
++
++ if (!options.ladspa_is_postfader) {
++ for (i = 0; i < bufsize; i++) {
++ l_buf[i] *= left_gain;
++ r_buf[i] *= right_gain;
++ }
++ }
++#endif /* HAVE_LADSPA */
++
++ for (i = 0; i < bufsize; i++) {
++ if (l_buf[i] > 1.0)
++ l_buf[i] = 1.0;
++ else if (l_buf[i] < -1.0)
++ l_buf[i] = -1.0;
++
++ if (r_buf[i] > 1.0)
++ r_buf[i] = 1.0;
++ else if (r_buf[i] < -1.0)
++ r_buf[i] = -1.0;
++
++ sndio_short_buf[2*i] = floorf(32767.0 * l_buf[i]);
++ sndio_short_buf[2*i+1] = floorf(32767.0 * r_buf[i]);
++ }
++
++ /* write data to audio device */
++ bytes_written = sio_write(sndio_hdl, sndio_short_buf, 2*n_avail
* sizeof(short));
++ if (bytes_written != 2*n_avail * sizeof(short))
++ fprintf(stderr, "sndio_thread: Error writing to audio
device\n");
++ }
++ sndio_finish:
++ return 0;
++}
++
++
++
+ /* OSS output thread */
+ #ifdef HAVE_OSS
+ void *
+@@ -1149,6 +1299,84 @@ set_thread_priority(pthread_t thread, char * name, int
+ }
+ #endif /* _WIN32 */
+
++/* return values:
++ * 0 : success
++ * -1 : device busy
++ * -N : unable to start with given params
++ */
++int
++sndio_init(thread_info_t * info, int verbose, int realtime, int priority) {
++
++ struct sio_hdl * sndio_hdl;
++ struct sio_par sndio_par;
++
++ if (info->out_SR > MAX_SAMPLERATE) {
++ if (verbose) {
++ fprintf(stderr, "\nThe sample rate you set (%ld Hz) is
higher than MAX_SAMPLERATE.\n",
++ info->out_SR);
++ fprintf(stderr, "This is an arbitrary limit, which you
may safely enlarge "
++ "if you really need to.\n");
++ fprintf(stderr, "Currently MAX_SAMPLERATE = %d Hz.\n",
MAX_SAMPLERATE);
++ }
++ return -2;
++ }
++
++ sndio_hdl = sio_open(NULL, SIO_PLAY, 0);
++ if (sndio_hdl == NULL) {
++ if (verbose) {
++ fprintf(stderr, "sio_open failed\n");
++ }
++ return -1;
++ }
++
++ sio_initpar(&sndio_par);
++ sndio_par.bits = 16;
++ sndio_par.pchan = 2;
++ sndio_par.rate = info->out_SR;
++ sndio_par.sig = 1;
++ sndio_par.le = 1;
++ sndio_par.appbufsz = sndio_par.rate/4;
++
++ if(sio_setpar(sndio_hdl, &sndio_par) == 0) {
++ if (verbose) {
++ fprintf(stderr, "sio_setpar failed\n");
++ }
++ sio_close(sndio_hdl);
++ return -3;
++ }
++ if(sio_getpar(sndio_hdl, &sndio_par) == 0) {
++ if (verbose) {
++ fprintf(stderr, "sio_getpar failed\n");
++ }
++ sio_close(sndio_hdl);
++ return -4;
++ }
++ if((sndio_par.bits != 16) || (sndio_par.pchan != 2) || \
++ (sndio_par.rate != info->out_SR) || (sndio_par.sig != 1) || \
++ (sndio_par.le != 1)) {
++ if (verbose) {
++ fprintf(stderr, "can't set sndio parameters\n");
++ }
++ sio_close(sndio_hdl);
++ return -5;
++ }
++ if(sio_start(sndio_hdl) == 0) {
++ if (verbose) {
++ fprintf(stderr, "sio_start failed\n");
++ }
++ sio_close(sndio_hdl);
++ return -3;
++ }
++
++ info->sndio_hdl = sndio_hdl;
++ AQUALUNG_THREAD_CREATE(info->sndio_thread_id, NULL, sndio_thread, info)
++ set_thread_priority(info->sndio_thread_id, "sndio output", realtime,
priority);
++
++ return 0;
++}
++
++
++
+ #ifdef HAVE_OSS
+ /* return values:
+ * 0 : success
+@@ -2210,7 +2438,7 @@ main(int argc, char ** argv) {
+
+ #if defined(HAVE_JACK) || defined(HAVE_ALSA) || defined(HAVE_OSS)
+ int auto_driver_found = 0;
+-#endif /* jack || alsa || oss */
++#endif /* jack || alsa || oss || sndio */
+
+ if (setenv("LC_NUMERIC", "POSIX", 1) != 0) {
+ fprintf(stderr, "aqualung main(): setenv(\"LC_NUMERIC\",
\"POSIX\") failed\n");
+@@ -2277,6 +2505,11 @@ main(int argc, char ** argv) {
+ break;
+ case 'o':
+ output_str = strdup(optarg);
++ if (strcmp(output_str, "sndio") == 0) {
++ output = SNDIO_DRIVER;
++ free(output_str);
++ break;
++ }
+ if (strcmp(output_str, "oss") == 0) {
+ #ifdef HAVE_OSS
+ output = OSS_DRIVER;
+@@ -2702,6 +2935,21 @@ main(int argc, char ** argv) {
+ }
+ }
+ #endif /* HAVE_ALSA */
++ if (output == 0) { /* probe sndio */
++ int ret;
++
++ printf("Probing sndio driver... ");
++ thread_info.out_SR = rate;
++
++ ret = sndio_init(&thread_info, 0, try_realtime, priority);
++ if (ret < 0) {
++ printf("unable to start with default params\n");
++ } else {
++ output = SNDIO_DRIVER;
++ auto_driver_found = 1;
++ printf("OK\n");
++ }
++ }
+ #ifdef HAVE_OSS
+ if (output == 0) { /* probe OSS */
+ int ret;
+@@ -2793,6 +3041,10 @@ main(int argc, char ** argv) {
+ }
+ #endif /* HAVE_ALSA */
+
++ if (output == SNDIO_DRIVER) {
++ thread_info.out_SR = rate;
++ }
++
+ #ifdef HAVE_OSS
+ if (output == OSS_DRIVER) {
+ thread_info.out_SR = rate;
+@@ -2814,6 +3066,15 @@ main(int argc, char ** argv) {
+ disk_try_realtime, disk_priority);
+ #endif /* _WIN32 */
+
++ if (output == SNDIO_DRIVER) {
++ if (!auto_driver_found) {
++ int ret = sndio_init(&thread_info, 1, try_realtime,
priority);
++ if (ret < 0) {
++ exit(1);
++ }
++ }
++ }
++
+ #ifdef HAVE_OSS
+ if (output == OSS_DRIVER) {
+ if (!auto_driver_found) {
+@@ -2845,6 +3106,12 @@ main(int argc, char ** argv) {
+ close_app_socket();
+
+ AQUALUNG_THREAD_JOIN(thread_info.disk_thread_id)
++
++ if (output == SNDIO_DRIVER) {
++ AQUALUNG_THREAD_JOIN(thread_info.sndio_thread_id)
++ free(thread_info.sndio_short_buf);
++ sio_close(thread_info.sndio_hdl);
++ }
+
+ #ifdef HAVE_OSS
+ if (output == OSS_DRIVER) {
Index: patches/patch-src_core_h
===================================================================
RCS file: patches/patch-src_core_h
diff -N patches/patch-src_core_h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_core_h 27 Jan 2009 22:40:36 -0000
@@ -0,0 +1,25 @@
+$OpenBSD$
+--- src/core.h.orig Thu Dec 27 10:55:45 2007
++++ src/core.h Fri Jan 9 14:44:51 2009
+@@ -59,7 +59,10 @@
+ #define WIN32_DRIVER 4
+ #endif /* _WIN32 */
+
++#define SNDIO_DRIVER 5
++#include <sndio.h>
+
++
+ #define MAX_SAMPLERATE 96000
+
+
+@@ -80,6 +83,10 @@
+
+ typedef struct _thread_info {
+ AQUALUNG_THREAD_DECLARE(disk_thread_id)
++
++ AQUALUNG_THREAD_DECLARE(sndio_thread_id)
++ struct sio_hdl * sndio_hdl;
++ short * sndio_short_buf;
+
+ #ifdef HAVE_OSS
+ AQUALUNG_THREAD_DECLARE(oss_thread_id)
Index: pkg/PLIST
===================================================================
RCS file: /cvs/ports/audio/aqualung/pkg/PLIST,v
retrieving revision 1.3
diff -u -r1.3 PLIST
--- pkg/PLIST 9 Jul 2008 02:07:36 -0000 1.3
+++ pkg/PLIST 27 Jan 2009 22:40:36 -0000
@@ -1,6 +1,7 @@
@comment $OpenBSD: PLIST,v 1.3 2008/07/09 02:07:36 jakemsr Exp $
@bin bin/aqualung
@man man/man1/aqualung.1
+...@owner root
share/applications/aqualung.desktop
share/aqualung/
share/aqualung/appearance.png