changeset 1062:9918aaf0b790 3.0-integration

Merge from branch "scalable-icons"
author Chris Cannam
date Thu, 17 Sep 2015 13:29:31 +0100
parents 40ff7c801fc2 (diff) f0b4285cad7a (current diff)
children 1f92fc7a6b05
files .hgsubstate sonic-visualiser.qrc
diffstat 17 files changed, 322 insertions(+), 123 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsub	Thu Sep 17 13:28:02 2015 +0100
+++ b/.hgsub	Thu Sep 17 13:29:31 2015 +0100
@@ -2,5 +2,8 @@
 svgui = https://code.soundsoftware.ac.uk/hg/svgui
 svapp = https://code.soundsoftware.ac.uk/hg/svapp
 dataquay = https://bitbucket.org/breakfastquay/dataquay
+bqvec = https://bitbucket.org/breakfastquay/bqvec
+bqresample = https://bitbucket.org/breakfastquay/bqresample
+bqaudioio = https://bitbucket.org/breakfastquay/bqaudioio
 sv-dependency-builds = https://code.soundsoftware.ac.uk/hg/sv-dependency-builds
 icons/scalable = https://code.soundsoftware.ac.uk/hg/sv-iconset
--- a/.hgsubstate	Thu Sep 17 13:28:02 2015 +0100
+++ b/.hgsubstate	Thu Sep 17 13:29:31 2015 +0100
@@ -1,6 +1,9 @@
+187d6a02a90e62f392b4ec6ca00947d346c9d6dc bqaudioio
+62c40e7f9231e459091c3352c5d4b6001be127ca bqresample
+94b6ebd5e8ab897e5b294fd77b4113e8d6d78b13 bqvec
 d16f0fd6db6104d87882bc43788a3bb1b0f8c528 dataquay
 c6ca18292bfe9ba9bd67b0aa59320893f2954333 icons/scalable
 55ece8862b6d3a54aad271a53f9c1615e5d3bcf8 sv-dependency-builds
-549f772160484927754b245436281bfcb401468e svapp
-32ab6c48efaa23d24a67315bccdc27f3ba1a18d5 svcore
-c91878670297fa9e04835f852c84f1b7db592343 svgui
+52c0aff69478e2fcb6a3ae9e7aaa56ee3f07c87a svapp
+2c43f99040689b482b52971b1edef6b697427f21 svcore
+8588b97f1d1c324a9d2c14e646b07fc00442172f svgui
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bq.pro	Thu Sep 17 13:29:31 2015 +0100
@@ -0,0 +1,93 @@
+
+TEMPLATE = lib
+
+win32-g++ {
+    INCLUDEPATH += sv-dependency-builds/win32-mingw/include
+    LIBS += -Lsv-dependency-builds/win32-mingw/lib
+}
+win32-msvc* {
+    INCLUDEPATH += sv-dependency-builds/win32-msvc/include
+    LIBS += -Lsv-dependency-builds/win32-msvc/lib
+}
+mac* {
+    INCLUDEPATH += sv-dependency-builds/osx/include
+    LIBS += -Lsv-dependency-builds/osx/lib
+}
+
+exists(config.pri) {
+    include(config.pri)
+}
+
+!exists(config.pri) {
+
+    CONFIG += release
+    DEFINES += NDEBUG BUILD_RELEASE NO_TIMING
+
+    DEFINES += HAVE_BZ2 HAVE_FFTW3 HAVE_FFTW3F HAVE_SNDFILE HAVE_SAMPLERATE HAVE_VAMP HAVE_VAMPHOSTSDK HAVE_RUBBERBAND HAVE_DATAQUAY HAVE_LIBLO HAVE_MAD HAVE_ID3TAG HAVE_PORTAUDIO
+
+    LIBS += -lbz2 -lrubberband -lvamp-hostsdk -lfftw3 -lfftw3f -lsndfile -lFLAC -logg -lvorbis -lvorbisenc -lvorbisfile -logg -lmad -lid3tag -lportaudio -lsamplerate -lz -lsord-0 -lserd-0 -llo
+
+    win* {
+        LIBS += -lwinmm -lws2_32
+    }
+    macx* {
+        DEFINES += HAVE_COREAUDIO
+        LIBS += -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices -framework Accelerate
+    }
+}
+
+CONFIG += staticlib warn_on stl exceptions c++11
+CONFIG -= qt
+
+TARGET = bq
+
+DEPENDPATH += bqvec bqresample bqaudioio bqvec/bqvec bqresample/bqresample bqaudioio/bqaudioio
+INCLUDEPATH += bqvec bqresample bqaudioio bqvec/bqvec bqresample/bqresample bqaudioio/bqaudioio
+
+OBJECTS_DIR = o
+
+HEADERS += \
+	bqvec/bqvec/Allocators.h \
+	bqvec/bqvec/Barrier.h \
+	bqvec/bqvec/ComplexTypes.h \
+	bqvec/bqvec/Restrict.h \
+	bqvec/bqvec/RingBuffer.h \
+	bqvec/bqvec/VectorOpsComplex.h \
+	bqvec/bqvec/VectorOps.h \
+	bqvec/pommier/neon_mathfun.h \
+	bqvec/pommier/sse_mathfun.h \
+	bqresample/bqresample/Resampler.h \
+	bqresample/speex/speex_resampler.h \
+	bqaudioio/bqaudioio/ApplicationPlaybackSource.h \
+	bqaudioio/bqaudioio/ApplicationRecordTarget.h \
+	bqaudioio/bqaudioio/AudioFactory.h \
+	bqaudioio/bqaudioio/SystemAudioIO.h \
+	bqaudioio/bqaudioio/SystemPlaybackTarget.h \
+	bqaudioio/bqaudioio/SystemRecordSource.h \
+	bqaudioio/src/DynamicJACK.h \
+	bqaudioio/src/JACKAudioIO.h \
+	bqaudioio/src/JACKPlaybackTarget.h \
+	bqaudioio/src/JACKRecordSource.h \
+	bqaudioio/src/PortAudioIO.h \
+	bqaudioio/src/PortAudioPlaybackTarget.h \
+	bqaudioio/src/PortAudioRecordSource.h \
+	bqaudioio/src/PulseAudioIO.h \
+	bqaudioio/src/PulseAudioPlaybackTarget.h
+
+SOURCES += \
+	bqvec/src/Allocators.cpp \
+	bqvec/src/Barrier.cpp \
+	bqvec/src/VectorOpsComplex.cpp \
+	bqresample/src/Resampler.cpp \
+	bqaudioio/src/AudioFactory.cpp \
+	bqaudioio/src/JACKAudioIO.cpp \
+	bqaudioio/src/JACKPlaybackTarget.cpp \
+	bqaudioio/src/JACKRecordSource.cpp \
+	bqaudioio/src/PortAudioIO.cpp \
+	bqaudioio/src/PortAudioPlaybackTarget.cpp \
+	bqaudioio/src/PortAudioRecordSource.cpp \
+	bqaudioio/src/PulseAudioIO.cpp \
+	bqaudioio/src/PulseAudioPlaybackTarget.cpp \
+	bqaudioio/src/SystemPlaybackTarget.cpp \
+	bqaudioio/src/SystemRecordSource.cpp
+
--- a/configure	Thu Sep 17 13:28:02 2015 +0100
+++ b/configure	Thu Sep 17 13:29:31 2015 +0100
@@ -648,8 +648,8 @@
 libpulse_CFLAGS
 JACK_LIBS
 JACK_CFLAGS
-portaudio_2_0_LIBS
-portaudio_2_0_CFLAGS
+portaudio_LIBS
+portaudio_CFLAGS
 liblo_LIBS
 liblo_CFLAGS
 serd_LIBS
@@ -662,8 +662,8 @@
 vamphostsdk_CFLAGS
 vamp_LIBS
 vamp_CFLAGS
-samplerate_LIBS
-samplerate_CFLAGS
+libsamplerate_LIBS
+libsamplerate_CFLAGS
 sndfile_LIBS
 sndfile_CFLAGS
 fftw3f_LIBS
@@ -760,8 +760,8 @@
 fftw3f_LIBS
 sndfile_CFLAGS
 sndfile_LIBS
-samplerate_CFLAGS
-samplerate_LIBS
+libsamplerate_CFLAGS
+libsamplerate_LIBS
 vamp_CFLAGS
 vamp_LIBS
 vamphostsdk_CFLAGS
@@ -774,8 +774,8 @@
 serd_LIBS
 liblo_CFLAGS
 liblo_LIBS
-portaudio_2_0_CFLAGS
-portaudio_2_0_LIBS
+portaudio_CFLAGS
+portaudio_LIBS
 JACK_CFLAGS
 JACK_LIBS
 libpulse_CFLAGS
@@ -1429,10 +1429,10 @@
               C compiler flags for sndfile, overriding pkg-config
   sndfile_LIBS
               linker flags for sndfile, overriding pkg-config
-  samplerate_CFLAGS
-              C compiler flags for samplerate, overriding pkg-config
-  samplerate_LIBS
-              linker flags for samplerate, overriding pkg-config
+  libsamplerate_CFLAGS
+              C compiler flags for libsamplerate, overriding pkg-config
+  libsamplerate_LIBS
+              linker flags for libsamplerate, overriding pkg-config
   vamp_CFLAGS C compiler flags for vamp, overriding pkg-config
   vamp_LIBS   linker flags for vamp, overriding pkg-config
   vamphostsdk_CFLAGS
@@ -1450,10 +1450,10 @@
   liblo_CFLAGS
               C compiler flags for liblo, overriding pkg-config
   liblo_LIBS  linker flags for liblo, overriding pkg-config
-  portaudio_2_0_CFLAGS
-              C compiler flags for portaudio_2_0, overriding pkg-config
-  portaudio_2_0_LIBS
-              linker flags for portaudio_2_0, overriding pkg-config
+  portaudio_CFLAGS
+              C compiler flags for portaudio, overriding pkg-config
+  portaudio_LIBS
+              linker flags for portaudio, overriding pkg-config
   JACK_CFLAGS C compiler flags for JACK, overriding pkg-config
   JACK_LIBS   linker flags for JACK, overriding pkg-config
   libpulse_CFLAGS
@@ -5009,18 +5009,18 @@
 fi
 
 
-SV_MODULE_MODULE=samplerate
+SV_MODULE_MODULE=libsamplerate
 SV_MODULE_VERSION_TEST="samplerate >= 0.1.2"
 SV_MODULE_HEADER=samplerate.h
 SV_MODULE_LIB=samplerate
 SV_MODULE_FUNC=src_new
-SV_MODULE_HAVE=HAVE_$(echo samplerate | tr 'a-z' 'A-Z')
+SV_MODULE_HAVE=HAVE_$(echo libsamplerate | tr 'a-z' 'A-Z')
 SV_MODULE_FAILED=1
-if test -n "$samplerate_LIBS" ; then
+if test -n "$libsamplerate_LIBS" ; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5
 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;}
-   CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS"
-   LIBS="$LIBS $samplerate_LIBS"
+   CXXFLAGS="$CXXFLAGS $libsamplerate_CFLAGS"
+   LIBS="$LIBS $libsamplerate_LIBS"
    SV_MODULE_FAILED=""
 fi
 if test -z "$SV_MODULE_VERSION_TEST" ; then
@@ -5029,11 +5029,11 @@
 if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then
 
 pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for samplerate" >&5
-$as_echo_n "checking for samplerate... " >&6; }
-
-if test -n "$samplerate_CFLAGS"; then
-    pkg_cv_samplerate_CFLAGS="$samplerate_CFLAGS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsamplerate" >&5
+$as_echo_n "checking for libsamplerate... " >&6; }
+
+if test -n "$libsamplerate_CFLAGS"; then
+    pkg_cv_libsamplerate_CFLAGS="$libsamplerate_CFLAGS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
     { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5
@@ -5041,7 +5041,7 @@
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_samplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null`
+  pkg_cv_libsamplerate_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null`
 		      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -5049,8 +5049,8 @@
  else
     pkg_failed=untried
 fi
-if test -n "$samplerate_LIBS"; then
-    pkg_cv_samplerate_LIBS="$samplerate_LIBS"
+if test -n "$libsamplerate_LIBS"; then
+    pkg_cv_libsamplerate_LIBS="$libsamplerate_LIBS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
     { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5
@@ -5058,7 +5058,7 @@
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_samplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null`
+  pkg_cv_libsamplerate_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null`
 		      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -5079,12 +5079,12 @@
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-	        samplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
+	        libsamplerate_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
         else
-	        samplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
+	        libsamplerate_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
         fi
 	# Put the nasty error message in config.log where it belongs
-	echo "$samplerate_PKG_ERRORS" >&5
+	echo "$libsamplerate_PKG_ERRORS" >&5
 
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5
 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;}
@@ -5094,11 +5094,11 @@
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5
 $as_echo "$as_me: Failed to find required module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;}
 else
-	samplerate_CFLAGS=$pkg_cv_samplerate_CFLAGS
-	samplerate_LIBS=$pkg_cv_samplerate_LIBS
+	libsamplerate_CFLAGS=$pkg_cv_libsamplerate_CFLAGS
+	libsamplerate_LIBS=$pkg_cv_libsamplerate_LIBS
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-	HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $samplerate_CFLAGS";LIBS="$LIBS $samplerate_LIBS";SV_MODULE_FAILED=""
+	HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $libsamplerate_CFLAGS";LIBS="$LIBS $libsamplerate_LIBS";SV_MODULE_FAILED=""
 fi
 fi
 if test -n "$SV_MODULE_FAILED"; then
@@ -6071,18 +6071,18 @@
 fi
 
 
-SV_MODULE_MODULE=portaudio_2_0
+SV_MODULE_MODULE=portaudio
 SV_MODULE_VERSION_TEST="portaudio-2.0 >= 19"
 SV_MODULE_HEADER=portaudio.h
 SV_MODULE_LIB=portaudio
 SV_MODULE_FUNC=Pa_IsFormatSupported
-SV_MODULE_HAVE=HAVE_$(echo portaudio_2_0 | tr 'a-z' 'A-Z')
+SV_MODULE_HAVE=HAVE_$(echo portaudio | tr 'a-z' 'A-Z')
 SV_MODULE_FAILED=1
-if test -n "$portaudio_2_0_LIBS" ; then
+if test -n "$portaudio_LIBS" ; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&5
 $as_echo "$as_me: User set ${SV_MODULE_MODULE}_LIBS explicitly, skipping test for $SV_MODULE_MODULE" >&6;}
-   CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS"
-   LIBS="$LIBS $portaudio_2_0_LIBS"
+   CXXFLAGS="$CXXFLAGS $portaudio_CFLAGS"
+   LIBS="$LIBS $portaudio_LIBS"
    SV_MODULE_FAILED=""
 fi
 if test -z "$SV_MODULE_VERSION_TEST" ; then
@@ -6091,11 +6091,11 @@
 if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then
 
 pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio_2_0" >&5
-$as_echo_n "checking for portaudio_2_0... " >&6; }
-
-if test -n "$portaudio_2_0_CFLAGS"; then
-    pkg_cv_portaudio_2_0_CFLAGS="$portaudio_2_0_CFLAGS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio" >&5
+$as_echo_n "checking for portaudio... " >&6; }
+
+if test -n "$portaudio_CFLAGS"; then
+    pkg_cv_portaudio_CFLAGS="$portaudio_CFLAGS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
     { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5
@@ -6103,7 +6103,7 @@
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_portaudio_2_0_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null`
+  pkg_cv_portaudio_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null`
 		      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -6111,8 +6111,8 @@
  else
     pkg_failed=untried
 fi
-if test -n "$portaudio_2_0_LIBS"; then
-    pkg_cv_portaudio_2_0_LIBS="$portaudio_2_0_LIBS"
+if test -n "$portaudio_LIBS"; then
+    pkg_cv_portaudio_LIBS="$portaudio_LIBS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
     { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$SV_MODULE_VERSION_TEST\""; } >&5
@@ -6120,7 +6120,7 @@
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_portaudio_2_0_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null`
+  pkg_cv_portaudio_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null`
 		      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -6141,12 +6141,12 @@
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-	        portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
+	        portaudio_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
         else
-	        portaudio_2_0_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
+	        portaudio_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
         fi
 	# Put the nasty error message in config.log where it belongs
-	echo "$portaudio_2_0_PKG_ERRORS" >&5
+	echo "$portaudio_PKG_ERRORS" >&5
 
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5
 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;}
@@ -6156,11 +6156,11 @@
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&5
 $as_echo "$as_me: Failed to find optional module $SV_MODULE_MODULE using pkg-config, trying again by old-fashioned means" >&6;}
 else
-	portaudio_2_0_CFLAGS=$pkg_cv_portaudio_2_0_CFLAGS
-	portaudio_2_0_LIBS=$pkg_cv_portaudio_2_0_LIBS
+	portaudio_CFLAGS=$pkg_cv_portaudio_CFLAGS
+	portaudio_LIBS=$pkg_cv_portaudio_LIBS
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-	HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_2_0_CFLAGS";LIBS="$LIBS $portaudio_2_0_LIBS";SV_MODULE_FAILED=""
+	HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $portaudio_CFLAGS";LIBS="$LIBS $portaudio_LIBS";SV_MODULE_FAILED=""
 fi
 fi
 if test -n "$SV_MODULE_FAILED"; then
--- a/configure.ac	Thu Sep 17 13:28:02 2015 +0100
+++ b/configure.ac	Thu Sep 17 13:29:31 2015 +0100
@@ -82,7 +82,7 @@
 SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute])
 SV_MODULE_REQUIRED([fftw3f],[fftw3f >= 3.0.0],[fftw3.h],[fftw3f],[fftwf_execute])
 SV_MODULE_REQUIRED([sndfile],[sndfile >= 1.0.16],[sndfile.h],[sndfile],[sf_open])
-SV_MODULE_REQUIRED([samplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new])
+SV_MODULE_REQUIRED([libsamplerate],[samplerate >= 0.1.2],[samplerate.h],[samplerate],[src_new])
 SV_MODULE_REQUIRED([vamp],[vamp >= 2.1],[vamp/vamp.h],[],[])
 SV_MODULE_REQUIRED([vamphostsdk],[vamp-hostsdk >= 2.5],[vamp-hostsdk/PluginLoader.h],[vamp-hostsdk],[libvamphostsdk_v_2_5_present])
 SV_MODULE_REQUIRED([rubberband],[rubberband],[rubberband/RubberBandStretcher.h],[rubberband],[rubberband_new])
@@ -90,7 +90,7 @@
 SV_MODULE_REQUIRED([serd],[serd-0 >= 0.5],[serd/serd.h],[serd-0],[serd_reader_read_file])
 
 SV_MODULE_OPTIONAL([liblo],[],[lo/lo.h],[lo],[lo_address_new])
-SV_MODULE_OPTIONAL([portaudio_2_0],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported])
+SV_MODULE_OPTIONAL([portaudio],[portaudio-2.0 >= 19],[portaudio.h],[portaudio],[Pa_IsFormatSupported])
 SV_MODULE_OPTIONAL([JACK],[jack >= 0.100],[jack/jack.h],[jack],[jack_client_open])
 SV_MODULE_OPTIONAL([libpulse],[libpulse >= 0.9],[pulse/pulseaudio.h],[pulse],[pa_stream_new])
 SV_MODULE_OPTIONAL([lrdf],[lrdf >= 0.2],[lrdf.h],[lrdf],[lrdf_init])
--- a/deploy/osx/copy-qt.sh	Thu Sep 17 13:28:02 2015 +0100
+++ b/deploy/osx/copy-qt.sh	Thu Sep 17 13:29:31 2015 +0100
@@ -1,5 +1,7 @@
 #!/bin/bash
 
+set -eu
+
 app="$1"
 if [ -z "$app" ]; then
 	echo "Usage: $0 <appname>"
@@ -7,9 +9,9 @@
 	exit 2
 fi
 
-frameworks="QtCore QtNetwork QtGui QtXml QtWidgets QtPrintSupport"
+frameworks="QtCore QtNetwork QtGui QtXml QtSvg QtWidgets QtPrintSupport"
 
-plugins="taccessiblewidgets dds gif icns ico jp2 jpeg mng tga tiff wbmp webp cocoa minimal offscreen"
+plugins="dds gif icns ico jp2 jpeg mng tga tiff wbmp webp cocoa minimal offscreen"
 
 qtdir=$(grep "Command:" Makefile | head -1 | awk '{ print $3; }' | sed s,/bin/.*,,)
 
--- a/deploy/osx/deploy.sh	Thu Sep 17 13:28:02 2015 +0100
+++ b/deploy/osx/deploy.sh	Thu Sep 17 13:29:31 2015 +0100
@@ -1,5 +1,7 @@
 #!/bin/bash
 
+set -e
+
 # Execute this from the top-level directory of the project (the one
 # that contains the .app bundle).  Supply the name of the .app bundle
 # as argument (the target will use $app.app regardless, but we need
@@ -16,11 +18,14 @@
 fi
 app=`basename "$source" .app`
 
+set -u
+
 version=`perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' version.h`
-case "$version" in
+stem=${version%%-*}
+case "$stem" in
     [0-9].[0-9]) bundleVersion="$version".0 ;;
     [0-9].[0-9].[0-9]) bundleVersion="$version" ;;
-    *) echo "Error: Version $version is neither two- nor three-part number" ;;
+    *) echo "Error: Version stem $stem (of version $version) is neither two- nor three-part number" ;;
 esac
 
 echo
--- a/deploy/osx/paths.sh	Thu Sep 17 13:28:02 2015 +0100
+++ b/deploy/osx/paths.sh	Thu Sep 17 13:29:31 2015 +0100
@@ -7,7 +7,7 @@
 	exit 2
 fi
 
-frameworks="QtCore QtNetwork QtGui QtXml QtWidgets QtPrintSupport"
+frameworks="QtCore QtNetwork QtGui QtXml QtSvg QtWidgets QtPrintSupport"
 
 echo
 echo "I expect you to have already copied these frameworks from the Qt installation to"
--- a/main/MainWindow.cpp	Thu Sep 17 13:28:02 2015 +0100
+++ b/main/MainWindow.cpp	Thu Sep 17 13:29:31 2015 +0100
@@ -57,10 +57,9 @@
 #include "widgets/LabelCounterInputDialog.h"
 #include "widgets/ActivityLog.h"
 #include "widgets/UnitConverter.h"
-#include "audioio/AudioCallbackPlaySource.h"
-#include "audioio/AudioCallbackPlayTarget.h"
-#include "audioio/AudioTargetFactory.h"
-#include "audioio/PlaySpeedRangeMapper.h"
+#include "audio/AudioCallbackPlaySource.h"
+#include "audio/AudioRecordTarget.h"
+#include "audio/PlaySpeedRangeMapper.h"
 #include "data/fileio/DataFileReaderFactory.h"
 #include "data/fileio/PlaylistFileReader.h"
 #include "data/fileio/WavFileWriter.h"
@@ -68,7 +67,6 @@
 #include "data/fileio/MIDIFileWriter.h"
 #include "data/fileio/BZipFileDevice.h"
 #include "data/fileio/FileSource.h"
-#include "data/fft/FFTDataServer.h"
 #include "data/midi/MIDIInput.h"
 #include "base/RecentFiles.h"
 #include "transform/TransformFactory.h"
@@ -94,6 +92,9 @@
 #include "plugin/api/ladspa.h"
 #include "plugin/api/dssi.h"
 
+#include <bqaudioio/SystemPlaybackTarget.h>
+#include <bqaudioio/SystemAudioIO.h>
+
 #include <QApplication>
 #include <QMessageBox>
 #include <QGridLayout>
@@ -130,8 +131,8 @@
 using std::set;
 
 
-MainWindow::MainWindow(bool withAudioOutput, bool withOSCSupport) :
-    MainWindowBase(withAudioOutput, true),
+MainWindow::MainWindow(SoundOptions options, bool withOSCSupport) :
+    MainWindowBase(options),
     m_overview(0),
     m_mainMenusCreated(false),
     m_paneMenu(0),
@@ -155,6 +156,7 @@
     m_ffwdSimilarAction(0),
     m_ffwdEndAction(0),
     m_playAction(0),
+    m_recordAction(0),
     m_playSelectionAction(0),
     m_playLoopAction(0),
     m_soloModified(false),
@@ -236,15 +238,15 @@
 
     m_playSpeed = new AudioDial(frame);
     m_playSpeed->setMinimum(0);
-    m_playSpeed->setMaximum(200);
-    m_playSpeed->setValue(100);
+    m_playSpeed->setMaximum(120);
+    m_playSpeed->setValue(60);
     m_playSpeed->setFixedWidth(32);
     m_playSpeed->setFixedHeight(32);
     m_playSpeed->setNotchesVisible(true);
     m_playSpeed->setPageStep(10);
-    m_playSpeed->setObjectName(tr("Playback Speedup"));
-    m_playSpeed->setDefaultValue(100);
-    m_playSpeed->setRangeMapper(new PlaySpeedRangeMapper(0, 200));
+    m_playSpeed->setObjectName(tr("Playback Speed"));
+    m_playSpeed->setRangeMapper(new PlaySpeedRangeMapper);
+    m_playSpeed->setDefaultValue(60);
     m_playSpeed->setShowToolTip(true);
     connect(m_playSpeed, SIGNAL(valueChanged(int)),
 	    this, SLOT(playSpeedChanged(int)));
@@ -565,10 +567,12 @@
     m_keyReference->registerShortcut(action);
     menu->addAction(action);
 
-    action = new QAction(tr("Export Annotation Layer..."), this);
+    action = new QAction(tr("Export Annotation La&yer..."), this);
+    action->setShortcut(tr("Ctrl+Y"));
     action->setStatusTip(tr("Export layer data to a file"));
     connect(action, SIGNAL(triggered()), this, SLOT(exportLayer()));
     connect(this, SIGNAL(canExportLayer(bool)), action, SLOT(setEnabled(bool)));
+    m_keyReference->registerShortcut(action);
     menu->addAction(action);
 
     menu->addSeparator();
@@ -1979,6 +1983,17 @@
     connect(m_ffwdEndAction, SIGNAL(triggered()), this, SLOT(ffwdEnd()));
     connect(this, SIGNAL(canPlay(bool)), m_ffwdEndAction, SLOT(setEnabled(bool)));
 
+    m_recordAction = toolbar->addAction(il.load("record"),
+                                        tr("Record"));
+    m_recordAction->setCheckable(true);
+    m_recordAction->setShortcut(tr("Ctrl+Space"));
+    m_recordAction->setStatusTip(tr("Record a new audio file"));
+    connect(m_recordAction, SIGNAL(triggered()), this, SLOT(record()));
+    connect(m_recordTarget, SIGNAL(recordStatusChanged(bool)),
+	    m_recordAction, SLOT(setChecked(bool)));
+    connect(this, SIGNAL(canRecord(bool)),
+            m_recordAction, SLOT(setEnabled(bool)));
+
     toolbar = addToolBar(tr("Play Mode Toolbar"));
 
     m_playSelectionAction = toolbar->addAction(il.load("playselection"),
@@ -2029,6 +2044,7 @@
     }
 
     m_keyReference->registerShortcut(m_playAction);
+    m_keyReference->registerShortcut(m_recordAction);
     m_keyReference->registerShortcut(m_playSelectionAction);
     m_keyReference->registerShortcut(m_playLoopAction);
     m_keyReference->registerShortcut(m_soloAction);
@@ -2055,6 +2071,8 @@
     menu->addAction(m_rwdStartAction);
     menu->addAction(m_ffwdEndAction);
     menu->addSeparator();
+    menu->addAction(m_recordAction);
+    menu->addSeparator();
 
     m_rightButtonPlaybackMenu->addAction(m_playAction);
     m_rightButtonPlaybackMenu->addAction(m_playSelectionAction);
@@ -2068,6 +2086,8 @@
     m_rightButtonPlaybackMenu->addAction(m_rwdStartAction);
     m_rightButtonPlaybackMenu->addAction(m_ffwdEndAction);
     m_rightButtonPlaybackMenu->addSeparator();
+    m_rightButtonPlaybackMenu->addAction(m_recordAction);
+    m_rightButtonPlaybackMenu->addSeparator();
 
     QAction *fastAction = menu->addAction(tr("Speed Up"));
     fastAction->setShortcut(tr("Ctrl+PgUp"));
@@ -2274,7 +2294,7 @@
         (haveCurrentPane &&
          (currentLayer != 0));
     bool havePlayTarget =
-	(m_playTarget != 0);
+	(m_playTarget != 0 || m_audioIO != 0);
     bool haveSelection = 
 	(m_viewManager &&
 	 !m_viewManager->getSelections().empty());
@@ -3868,26 +3888,38 @@
 void
 MainWindow::playSpeedChanged(int position)
 {
-    PlaySpeedRangeMapper mapper(0, 200);
+    PlaySpeedRangeMapper mapper;
 
     double percent = m_playSpeed->mappedValue();
     double factor = mapper.getFactorForValue(percent);
 
-//    cerr << "speed = " << position << " percent = " << percent << " factor = " << factor << endl;
-
-    bool something = (position != 100);
-
-    int pc = int(lrint(percent));
-
-    if (!something) {
+//    cerr << "play speed position = " << position << " (range 0-120) percent = " << percent << " factor = " << factor << endl;
+
+    int centre = m_playSpeed->defaultValue();
+
+    // Percentage is shown to 0dp if >100, to 1dp if <100; factor is
+    // shown to 3sf
+
+    char pcbuf[30];
+    char facbuf[30];
+    
+    if (position == centre) {
         contextHelpChanged(tr("Playback speed: Normal"));
+    } else if (position < centre) {
+        sprintf(pcbuf, "%.1f", percent);
+        sprintf(facbuf, "%.3g", 1.0 / factor);
+        contextHelpChanged(tr("Playback speed: %1% (%2x slower)")
+                           .arg(pcbuf)
+                           .arg(facbuf));
     } else {
-        contextHelpChanged(tr("Playback speed: %1%2%")
-                           .arg(position > 100 ? "+" : "")
-                           .arg(pc));
+        sprintf(pcbuf, "%.0f", percent);
+        sprintf(facbuf, "%.3g", factor);
+        contextHelpChanged(tr("Playback speed: %1% (%2x faster)")
+                           .arg(pcbuf)
+                           .arg(facbuf));
     }
 
-    m_playSource->setTimeStretch(factor);
+    m_playSource->setTimeStretch(1.0 / factor); // factor is a speedup
 
     updateMenuStates();
 }
@@ -4219,9 +4251,19 @@
 
     MainWindowBase::mainModelChanged(model);
 
+    if (m_playTarget || m_audioIO) {
+        connect(m_fader, SIGNAL(valueChanged(float)),
+                this, SLOT(mainModelGainChanged(float)));
+    }
+}
+
+void
+MainWindow::mainModelGainChanged(float gain)
+{
     if (m_playTarget) {
-        connect(m_fader, SIGNAL(valueChanged(float)),
-                m_playTarget, SLOT(setOutputGain(float)));
+        m_playTarget->setOutputGain(gain);
+    } else if (m_audioIO) {
+        m_audioIO->setOutputGain(gain);
     }
 }
 
@@ -4290,20 +4332,25 @@
 {
     emit hideSplash();
 
+    QString quoted;
+    if (transformName != "") {
+        quoted = QString("\"%1\" ").arg(transformName);
+    }
+    
     if (message != "") {
 
         QMessageBox::warning
             (this,
              tr("Failed to generate layer"),
-             tr("<b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform \"%1\" failed:<p>%2")
-             .arg(transformName).arg(message),
+             tr("<b>Layer generation failed</b><p>Failed to generate derived layer.<p>The layer transform %1failed:<p>%2")
+             .arg(quoted).arg(message),
              QMessageBox::Ok);
     } else {
         QMessageBox::warning
             (this,
              tr("Failed to generate layer"),
-             tr("<b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform \"%1\" failed.<p>No error information is available.")
-             .arg(transformName),
+             tr("<b>Layer generation failed</b><p>Failed to generate a derived layer.<p>The layer transform %1failed.<p>No error information is available.")
+             .arg(quoted),
              QMessageBox::Ok);
     }
 }
@@ -4590,7 +4637,7 @@
 #endif
 
     aboutText += 
-        "<p><small>Sonic Visualiser Copyright &copy; 2005&ndash;2013 Chris Cannam and "
+        "<p><small>Sonic Visualiser Copyright &copy; 2005&ndash;2015 Chris Cannam and "
         "Queen Mary, University of London.</small></p>"
         "<p><small>This program is free software; you can redistribute it and/or "
         "modify it under the terms of the GNU General Public License as "
--- a/main/MainWindow.h	Thu Sep 17 13:28:02 2015 +0100
+++ b/main/MainWindow.h	Thu Sep 17 13:29:31 2015 +0100
@@ -32,8 +32,7 @@
     Q_OBJECT
 
 public:
-    MainWindow(bool withAudioOutput = true,
-               bool withOSCSupport = true);
+    MainWindow(SoundOptions options, bool withOSCSupport = true);
     virtual ~MainWindow();
 
 signals:
@@ -132,6 +131,7 @@
     virtual void layerInAView(Layer *, bool);
 
     virtual void mainModelChanged(WaveFileModel *);
+    virtual void mainModelGainChanged(float);
     virtual void modelAdded(Model *);
     virtual void modelAboutToBeDeleted(Model *);
 
@@ -187,6 +187,7 @@
     QAction                 *m_ffwdSimilarAction;
     QAction                 *m_ffwdEndAction;
     QAction                 *m_playAction;
+    QAction                 *m_recordAction;
     QAction                 *m_playSelectionAction;
     QAction                 *m_playLoopAction;
     QAction                 *m_manageTemplatesAction;
--- a/main/OSCHandler.cpp	Thu Sep 17 13:28:02 2015 +0100
+++ b/main/OSCHandler.cpp	Thu Sep 17 13:29:31 2015 +0100
@@ -22,14 +22,15 @@
 #include "view/PaneStack.h"
 #include "data/model/WaveFileModel.h"
 #include "widgets/CommandHistory.h"
-#include "audioio/AudioCallbackPlaySource.h"
-#include "audioio/AudioCallbackPlayTarget.h"
+#include "audio/AudioCallbackPlaySource.h"
 #include "framework/Document.h"
 #include "data/fileio/WavFileWriter.h"
 #include "transform/TransformFactory.h"
 #include "widgets/Fader.h"
 #include "widgets/AudioDial.h"
 
+#include <bqaudioio/SystemPlaybackTarget.h>
+
 #include <QFileInfo>
 
 void
--- a/main/PreferencesDialog.cpp	Thu Sep 17 13:28:02 2015 +0100
+++ b/main/PreferencesDialog.cpp	Thu Sep 17 13:29:31 2015 +0100
@@ -39,9 +39,10 @@
 #include "widgets/WindowTypeSelector.h"
 #include "widgets/IconLoader.h"
 #include "base/Preferences.h"
-#include "audioio/AudioTargetFactory.h"
 #include "base/ResourceFinder.h"
 
+//#include "audioio/AudioTargetFactory.h"
+
 #include "version.h"
 
 PreferencesDialog::PreferencesDialog(QWidget *parent) :
@@ -149,11 +150,13 @@
     connect(octaveSystem, SIGNAL(currentIndexChanged(int)),
             this, SLOT(octaveSystemChanged(int)));
 
+    QSettings settings;
+
+    /*!!! restore
     QComboBox *audioDevice = new QComboBox;
     std::vector<QString> devices =
         AudioTargetFactory::getInstance()->getCallbackTargetNames();
     
-    QSettings settings;
     settings.beginGroup("Preferences");
     QString targetName = settings.value("audio-target", "").toString();
     settings.endGroup();
@@ -166,7 +169,7 @@
 
     connect(audioDevice, SIGNAL(currentIndexChanged(int)),
             this, SLOT(audioDeviceChanged(int)));
-
+    */
     QComboBox *resampleQuality = new QComboBox;
 
     int rsq = prefs->getPropertyRangeAndValue("Resample Quality", &min, &max,
@@ -223,6 +226,15 @@
 
     settings.beginGroup("Preferences");
 
+#ifdef Q_OS_MAC
+    m_retina = settings.value("scaledHiDpi", true).toBool();
+    QCheckBox *retina = new QCheckBox;
+    retina->setCheckState(m_retina ? Qt::Checked : Qt::Unchecked);
+    connect(retina, SIGNAL(stateChanged(int)), this, SLOT(retinaChanged(int)));
+#else
+    m_retina = false;
+#endif
+
     QString userLocale = settings.value("locale", "").toString();
     m_currentLocale = userLocale;
     
@@ -328,8 +340,8 @@
                        row, 0);
     subgrid->addWidget(resampleOnLoad, row++, 1, 1, 1);
 
-    subgrid->addWidget(new QLabel(tr("Playback audio device:")), row, 0);
-    subgrid->addWidget(audioDevice, row++, 1, 1, 2);
+//!!!    subgrid->addWidget(new QLabel(tr("Playback audio device:")), row, 0);
+//!!!    subgrid->addWidget(audioDevice, row++, 1, 1, 2);
 
     subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
                                                 ("Resample Quality"))),
@@ -353,6 +365,13 @@
                        row, 0);
     subgrid->addWidget(showSplash, row++, 1, 1, 1);
 
+#ifdef Q_OS_MAC
+    if (devicePixelRatio() > 1) {
+        subgrid->addWidget(new QLabel(tr("Draw layers at Retina resolution:")), row, 0);
+        subgrid->addWidget(retina, row++, 1, 1, 1);
+    }
+#endif
+
     subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
                                                 ("Property Box Layout"))),
                        row, 0);
@@ -564,6 +583,14 @@
 }
 
 void
+PreferencesDialog::retinaChanged(int state)
+{
+    m_retina = (state == Qt::Checked);
+    m_applyButton->setEnabled(true);
+    // Does not require a restart
+}
+
+void
 PreferencesDialog::showSplashChanged(int state)
 {
     m_showSplash = (state == Qt::Checked);
@@ -671,15 +698,18 @@
     
     prefs->setProperty("Octave Numbering System", m_octaveSystem);
 
-    std::vector<QString> devices =
-        AudioTargetFactory::getInstance()->getCallbackTargetNames();
+//!!!    std::vector<QString> devices =
+//!!!        AudioTargetFactory::getInstance()->getCallbackTargetNames();
 
     QSettings settings;
     settings.beginGroup("Preferences");
     QString permishTag = QString("network-permission-%1").arg(SV_VERSION);
     settings.setValue(permishTag, m_networkPermission);
-    settings.setValue("audio-target", devices[m_audioDevice]);
+//!!!    settings.setValue("audio-target", devices[m_audioDevice]);
     settings.setValue("locale", m_currentLocale);
+#ifdef Q_OS_MAC
+    settings.setValue("scaledHiDpi", m_retina);
+#endif
     settings.endGroup();
 
     settings.beginGroup("MainWindow");
--- a/main/PreferencesDialog.h	Thu Sep 17 13:28:02 2015 +0100
+++ b/main/PreferencesDialog.h	Thu Sep 17 13:29:31 2015 +0100
@@ -64,6 +64,7 @@
     void defaultTemplateChanged(int);
     void localeChanged(int);
     void networkPermissionChanged(int state);
+    void retinaChanged(int state);
 
     void tempDirButtonClicked();
 
@@ -95,6 +96,7 @@
     int m_resampleQuality;
     bool m_resampleOnLoad;
     bool m_networkPermission;
+    bool m_retina;
     QString m_tempDirRoot;
     int m_backgroundMode;
     int m_timeToTextMode;
--- a/main/main.cpp	Thu Sep 17 13:28:02 2015 +0100
+++ b/main/main.cpp	Thu Sep 17 13:29:31 2015 +0100
@@ -335,7 +335,10 @@
     // Permit size_t and PropertyName to be used as args in queued signal calls
     qRegisterMetaType<PropertyContainer::PropertyName>("PropertyContainer::PropertyName");
 
-    MainWindow *gui = new MainWindow(audioOutput, oscSupport);
+    MainWindow::SoundOptions options = MainWindow::WithEverything;
+    if (!audioOutput) options = 0;
+    
+    MainWindow *gui = new MainWindow(options, oscSupport);
     application.setMainWindow(gui);
     InteractiveFileFinder::setParentWidget(gui);
     TransformUserConfigurator::setParentWidget(gui);
--- a/sonic-visualiser.pro	Thu Sep 17 13:28:02 2015 +0100
+++ b/sonic-visualiser.pro	Thu Sep 17 13:29:31 2015 +0100
@@ -1,13 +1,14 @@
 TEMPLATE = subdirs
-SUBDIRS = sub_dataquay svcore svgui svapp sub_sv 
+SUBDIRS = sub_bq sub_dataquay svcore svgui svapp sub_sv 
 
 !win* {
     # We should build and run the tests on any platform,
     # but doing it automatically doesn't work so well from
     # within an IDE on Windows, so remove that from here
-    SUBDIRS += svcore/base/test svcore/data/fileio/test
+    SUBDIRS += svcore/base/test svcore/data/fileio/test svcore/data/model/test
 }
 
+sub_bq.file = bq.pro
 sub_sv.file = sv.pro
 
 sub_dataquay.file = dataquay/lib.pro
--- a/sonic-visualiser.qrc	Thu Sep 17 13:28:02 2015 +0100
+++ b/sonic-visualiser.qrc	Thu Sep 17 13:29:31 2015 +0100
@@ -3,8 +3,14 @@
     <file>icons/scalable/align.svg</file>
     <file>icons/scalable/colour3d.svg</file>
     <file>icons/scalable/cross.svg</file>
+    <file>icons/scalable/dataedit.svg</file>
     <file>icons/scalable/draw.svg</file>
     <file>icons/scalable/erase.svg</file>
+    <file>icons/scalable/editcopy.svg</file>
+    <file>icons/scalable/editcut.svg</file>
+    <file>icons/scalable/editdelete.svg</file>
+    <file>icons/scalable/editpaste.svg</file>
+    <file>icons/scalable/exit.svg</file>
     <file>icons/scalable/filenew.svg</file>
     <file>icons/scalable/fileopen.svg</file>
     <file>icons/scalable/filesaveas.svg</file>
@@ -20,6 +26,7 @@
     <file>icons/scalable/playselection.svg</file>
     <file>icons/scalable/solo.svg</file>
     <file>icons/scalable/play.svg</file>
+    <file>icons/scalable/record.svg</file>
     <file>icons/scalable/rewind-start.svg</file>
     <file>icons/scalable/rewind.svg</file>
     <file>icons/scalable/undo.svg</file>
@@ -32,6 +39,11 @@
     <file>icons/scalable/spectrogram.svg</file>
     <file>icons/scalable/spectrum.svg</file>
     <file>icons/scalable/text.svg</file>
+    <file>icons/scalable/timeruler.svg</file>
+    <file>icons/scalable/zoom.svg</file>
+    <file>icons/scalable/zoom-in.svg</file>
+    <file>icons/scalable/zoom-out.svg</file>
+    <file>icons/scalable/zoom-fit.svg</file>
     <file>icons/scalable/sv-icon-light.svg</file>
     <file>icons/scalable/sv-icon.svg</file>
     <file>icons/scalable/sv-splash.svg</file>
@@ -41,7 +53,6 @@
     <file>icons/waveform.png</file>
     <file>icons/spectrum.png</file>
     <file>icons/spectrogram.png</file>
-    <file>icons/timeruler.png</file>
     <file>icons/pane.png</file>
     <file>icons/instants.png</file>
     <file>icons/notes.png</file>
@@ -82,10 +93,6 @@
     <file>icons/measure2mask.xbm</file>
     <file>icons/move.png</file>
     <file>icons/navigate.png</file>
-    <file>icons/zoom.png</file>
-    <file>icons/zoom-in.png</file>
-    <file>icons/zoom-out.png</file>
-    <file>icons/zoom-fit.png</file>
     <file>icons/zoom-reset.png</file>
     <file>icons/undo.png</file>
     <file>icons/redo.png</file>
--- a/sv.pro	Thu Sep 17 13:28:02 2015 +0100
+++ b/sv.pro	Thu Sep 17 13:29:31 2015 +0100
@@ -23,7 +23,7 @@
     CONFIG += release
     DEFINES += NDEBUG BUILD_RELEASE NO_TIMING
 
-    DEFINES += HAVE_BZ2 HAVE_FFTW3 HAVE_FFTW3F HAVE_SNDFILE HAVE_SAMPLERATE HAVE_VAMP HAVE_VAMPHOSTSDK HAVE_RUBBERBAND HAVE_DATAQUAY HAVE_LIBLO HAVE_MAD HAVE_ID3TAG HAVE_PORTAUDIO_2_0
+    DEFINES += HAVE_BZ2 HAVE_FFTW3 HAVE_FFTW3F HAVE_SNDFILE HAVE_SAMPLERATE HAVE_VAMP HAVE_VAMPHOSTSDK HAVE_RUBBERBAND HAVE_DATAQUAY HAVE_LIBLO HAVE_MAD HAVE_ID3TAG HAVE_PORTAUDIO
 
     LIBS += -lbz2 -lrubberband -lvamp-hostsdk -lfftw3 -lfftw3f -lsndfile -lFLAC -logg -lvorbis -lvorbisenc -lvorbisfile -logg -lmad -lid3tag -lportaudio -lsamplerate -lz -lsord-0 -lserd-0 -llo
 
@@ -43,8 +43,8 @@
 linux*:TARGET = sonic-visualiser
 solaris*:TARGET = sonic-visualiser
 
-DEPENDPATH += . svcore svgui svapp
-INCLUDEPATH += . svcore svgui svapp
+DEPENDPATH += . bqaudioio svcore svgui svapp
+INCLUDEPATH += . bqaudioio svcore svgui svapp
 
 TRANSLATIONS += i18n/sonic-visualiser_ru.ts i18n/sonic-visualiser_en_GB.ts i18n/sonic-visualiser_en_US.ts i18n/sonic-visualiser_cs_CZ.ts
 
@@ -56,7 +56,8 @@
 
 contains(DEFINES, BUILD_STATIC):LIBS -= -ljack
 
-MY_LIBS = -Lsvapp -Lsvgui -Lsvcore -Ldataquay -lsvapp -lsvgui -lsvcore -ldataquay
+MY_LIBS = -Lsvapp -Lsvgui -Lsvcore -Ldataquay -L. \
+          -lsvapp -lsvgui -lsvcore -ldataquay -lbq
 
 linux* {
 MY_LIBS = -Wl,-Bstatic $$MY_LIBS -Wl,-Bdynamic