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

Reply via email to