On 2009/01/27 14:52, Jeremy Evans wrote:
> 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! WANTLIB was synced already, so here's a diff that applies
to -current. Works fine on amd64.
Index: Makefile
===================================================================
RCS file: /cvs/ports/audio/aqualung/Makefile,v
retrieving revision 1.7
diff -u -p -r1.7 Makefile
--- Makefile 23 Jan 2009 17:42:14 -0000 1.7
+++ Makefile 27 Jan 2009 23:07:32 -0000
@@ -3,7 +3,7 @@
COMMENT= advanced music player
DISTNAME= aqualung-0.9beta9.1
-PKGNAME= ${DISTNAME}p5
+PKGNAME= ${DISTNAME}p6
CATEGORIES= audio
HOMEPAGE= http://aqualung.factorial.hu/
@@ -27,16 +27,18 @@ LIB_DEPENDS= gtk-x11-2.0,gdk-x11-2.0,gdk
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 gio-2.0 glib-2.0 glitz gmodule-2.0 \
- gobject-2.0 gthread-2.0 m mp3lame ogg ossaudio \
- pango-1.0 pangocairo-1.0 pangoft2-1.0 pixman-1 png pthread \
- samplerate sndfile stdc++ vorbis vorbisenc vorbisfile z
+ gobject-2.0 gthread-2.0 m mp3lame ogg pango-1.0 \
+ pangocairo-1.0 pangoft2-1.0 pixman-1 png pthread \
+ samplerate sndfile sndio stdc++ vorbis vorbisenc \
+ vorbisfile z
USE_X11= Yes
CONFIGURE_STYLE=gnu
@@ -45,7 +47,7 @@ CONFIGURE_ENV= LDFLAGS="-pthread -L${LOC
-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 +61,25 @@ CONFIGURE_ARGS= --with-flac \
--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 -p -r1.1 aqualung.desktop
--- files/aqualung.desktop 15 Mar 2008 11:54:10 -0000 1.1
+++ files/aqualung.desktop 27 Jan 2009 23:07:32 -0000
@@ -8,7 +8,7 @@ Name[fi]=Aqualung
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: pkg/PLIST
===================================================================
RCS file: /cvs/ports/audio/aqualung/pkg/PLIST,v
retrieving revision 1.3
diff -u -p -r1.3 PLIST
--- pkg/PLIST 9 Jul 2008 02:07:36 -0000 1.3
+++ pkg/PLIST 27 Jan 2009 23:07:32 -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
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 23:07:33 -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 23:07:33 -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 23:07:33 -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)