changeset 1008:2363196deed7 3.0-integration

Merge from branch normalize_hybrid_option
author Chris Cannam
date Fri, 26 Jun 2015 14:18:45 +0100
parents 8d45d6412ca6 (diff) fc742cdbf2b9 (current diff)
children ab244c0074ba
files
diffstat 38 files changed, 970 insertions(+), 204 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Fri Sep 12 11:38:55 2014 +0100
+++ b/.hgignore	Fri Jun 26 14:18:45 2015 +0100
@@ -25,4 +25,4 @@
 Sonic Visualiser*
 .DS_Store
 *.stash
-
+cov-int/*
--- a/.hgsub	Fri Sep 12 11:38:55 2014 +0100
+++ b/.hgsub	Fri Jun 26 14:18:45 2015 +0100
@@ -3,3 +3,4 @@
 svapp = https://code.soundsoftware.ac.uk/hg/svapp
 dataquay = https://bitbucket.org/breakfastquay/dataquay
 sv-dependency-builds = https://code.soundsoftware.ac.uk/hg/sv-dependency-builds
+icons/scalable = https://code.soundsoftware.ac.uk/hg/sv-iconset
--- a/.hgsubstate	Fri Sep 12 11:38:55 2014 +0100
+++ b/.hgsubstate	Fri Jun 26 14:18:45 2015 +0100
@@ -1,5 +1,6 @@
 d16f0fd6db6104d87882bc43788a3bb1b0f8c528 dataquay
-879bdc878826bebec67130326f99397c430419b1 sv-dependency-builds
-a39a7d6b0f2d0b6bff0b580b733f7db69c63c135 svapp
-a54016762f77582f95bb6fedb1f302cb32906612 svcore
-1986c9b0d9c3355324cef2b67917d64d660ea949 svgui
+845471c833a182376747b44a3ca28181bbdb3c93 icons/scalable
+55ece8862b6d3a54aad271a53f9c1615e5d3bcf8 sv-dependency-builds
+83370e830c956be0fc4a7d9b5c30761b6ffb7613 svapp
+ee0aff1d0743680befe36e5627d31c019778d0b0 svcore
+98827470ada2609207b65027dda747869076524b svgui
--- a/.hgtags	Fri Sep 12 11:38:55 2014 +0100
+++ b/.hgtags	Fri Jun 26 14:18:45 2015 +0100
@@ -45,3 +45,6 @@
 0000000000000000000000000000000000000000 sv_v2.3-f
 7f7fba33b7de2890ca96dbd15969219bb9fe04b9 sv_v2.3
 bf06f4311ec0af43f93a15489a757955e07597cd sv_v2.3
+cfbea29fae640aed5c8b7265d6806df823f34fef sv_v2.4
+8215909b74d2c58be28ce128d40fbc1645bc0d6e sv_v2.4_linux_deploy
+2868d5abf1a3baa37099c1b5d7e984bf8bb8177a sv_v2.4.1
--- a/CHANGELOG	Fri Sep 12 11:38:55 2014 +0100
+++ b/CHANGELOG	Fri Jun 26 14:18:45 2015 +0100
@@ -1,3 +1,6 @@
+Changes in Sonic Visualiser 2.4.1 since the previous release 2.4:
+
+ - Fix a crash when rendering certain colour 3d plot layers
 
 Changes in Sonic Visualiser 2.4 since the previous release 2.3:
 
@@ -23,6 +26,10 @@
    electric piano with sustain. The piano sample is still available,
    and any sessions saved using it should continue to use it
 
+ - Add a cancel button for Vamp plugin processing: currently,
+   cancelling a transform results in a part-complete layer rather than
+   removing the results
+
  - Add keyboard shortcuts to cycle the current layer (in addition to
    the existing ones to cycle the current pane)
 
@@ -41,6 +48,9 @@
  - Make it possible to import CSV files directly into Note layers by
    adding Pitch as a data type in the CSV file import dialog
 
+ - Fix play pointer jump to wrong frame when clicking on row in the
+   layer edit dialog
+
  - Fix problems with keyboard shortcuts when using Qt5 on OS/X. This
    is the first release in which the official builds use Qt5 for all
    platforms.
--- a/INSTALL.txt	Fri Sep 12 11:38:55 2014 +0100
+++ b/INSTALL.txt	Fri Jun 26 14:18:45 2015 +0100
@@ -9,25 +9,21 @@
 The following additional libraries are required or optional when
 building the SV core libraries:
 
-REQUIRED	Qt v4.4 or newer	http://qt.nokia.com/
+REQUIRED	Qt v5			http://qt-project.org/
 REQUIRED	Vamp Plugin SDK	v2.x	http://www.vamp-plugins.org/
 REQUIRED	Rubber Band Library	http://www.breakfastquay.com/rubberband/
 REQUIRED	libsndfile		http://www.mega-nerd.com/libsndfile/
 REQUIRED	libsamplerate		http://www.mega-nerd.com/SRC/
 REQUIRED	FFTW3 			http://www.fftw.org/
 REQUIRED	bzip2 library		http://www.bzip.org/
-REQUIRED	Redland RDF libraries	http://librdf.org/
+REQUIRED	Sord and Serd libraries	http://drobilla.net/software/
 
 Optional	MAD mp3 decoder		http://www.underbit.com/products/mad/
 Optional	Oggz and fishsound	http://xiph.org/oggz/
 Optional        liblo OSC library	http://www.plugin.org.uk/liblo/
 
-The Redland RDF libraries include the Raptor RDF parser library,
-Rasqal RDF query library, and librdf, the Redland RDF datastore (which
-depends on both of those).  The SV libraries require all of these.
-
-If you are going to build the rest of the SV libraries, you will also
-need one or more of:
+If you are going to build the rest of the SV libraries and the Sonic
+Visualiser application, you will also need one or more of:
 
 Optional	JACK			http://www.jackaudio.org/
 Optional	PortAudio v19		http://www.portaudio.com/
@@ -41,8 +37,9 @@
 On Linux, you will need the ALSA libraries (used for MIDI).
 
 If you happen to be using a Debian-based Linux, you probably want to
-apt-get install the following packages: libqt4-dev libsndfile1-dev
-libsamplerate0-dev fftw3-dev libbz2-dev libjack-dev libmad0-dev
-liboggz1-dev libfishsound1-dev libasound2-dev liblo0-dev liblrdf0-dev
-librdf0-dev .
+apt-get install something like the following packages: qtbase5-dev
+qt5-default libsndfile1-dev libsamplerate0-dev libfftw3-dev libbz2-dev
+libjack-dev libjack0 libpulse-dev libmad0-dev libid3tag0-dev
+liboggz2-dev libfishsound1-dev libasound2-dev liblo-dev liblrdf0-dev
+libsord-dev libserd-dev vamp-plugin-sdk librubberband-dev.
 
--- a/acinclude.m4	Fri Sep 12 11:38:55 2014 +0100
+++ b/acinclude.m4	Fri Jun 26 14:18:45 2015 +0100
@@ -112,3 +112,146 @@
 
 ])
 
+# From autoconf archive:
+
+# ============================================================================
+#  http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
+# ============================================================================
+#
+# SYNOPSIS
+#
+#   AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
+#
+# DESCRIPTION
+#
+#   Check for baseline language coverage in the compiler for the C++11
+#   standard; if necessary, add switches to CXXFLAGS to enable support.
+#
+#   The first argument, if specified, indicates whether you insist on an
+#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+#   -std=c++11).  If neither is specified, you get whatever works, with
+#   preference for an extended mode.
+#
+#   The second argument, if specified 'mandatory' or if left unspecified,
+#   indicates that baseline C++11 support is required and that the macro
+#   should error out if no mode with that support is found.  If specified
+#   'optional', then configuration proceeds regardless, after defining
+#   HAVE_CXX11 if and only if a supporting mode is found.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
+#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
+#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
+#   Copyright (c) 2014 Alexey Sokolov <sokolov@google.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[
+  template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    struct Base {
+    virtual void f() {}
+    };
+    struct Child : public Base {
+    virtual void f() override {}
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = static_cast<check_type&&>(c);
+
+    auto d = a;
+    auto l = [](){};
+]])
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
+  m4_if([$1], [], [],
+        [$1], [ext], [],
+        [$1], [noext], [],
+        [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
+  m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
+        [$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
+        [$2], [optional], [ax_cxx_compile_cxx11_required=false],
+        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])
+  AC_LANG_PUSH([C++])dnl
+  ac_success=no
+  AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
+  ax_cv_cxx_compile_cxx11,
+  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+    [ax_cv_cxx_compile_cxx11=yes],
+    [ax_cv_cxx_compile_cxx11=no])])
+  if test x$ax_cv_cxx_compile_cxx11 = xyes; then
+    ac_success=yes
+  fi
+
+  m4_if([$1], [noext], [], [dnl
+  if test x$ac_success = xno; then
+    for switch in -std=gnu++11 -std=gnu++0x; do
+      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
+      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
+                     $cachevar,
+        [ac_save_CXXFLAGS="$CXXFLAGS"
+         CXXFLAGS="$CXXFLAGS $switch"
+         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+          [eval $cachevar=yes],
+          [eval $cachevar=no])
+         CXXFLAGS="$ac_save_CXXFLAGS"])
+      if eval test x\$$cachevar = xyes; then
+        CXXFLAGS="$CXXFLAGS $switch"
+        ac_success=yes
+        break
+      fi
+    done
+  fi])
+
+  m4_if([$1], [ext], [], [dnl
+  if test x$ac_success = xno; then
+    for switch in -std=c++11 -std=c++0x; do
+      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
+      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
+                     $cachevar,
+        [ac_save_CXXFLAGS="$CXXFLAGS"
+         CXXFLAGS="$CXXFLAGS $switch"
+         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
+          [eval $cachevar=yes],
+          [eval $cachevar=no])
+         CXXFLAGS="$ac_save_CXXFLAGS"])
+      if eval test x\$$cachevar = xyes; then
+        CXXFLAGS="$CXXFLAGS $switch"
+        ac_success=yes
+        break
+      fi
+    done
+  fi])
+  AC_LANG_POP([C++])
+  if test x$ax_cxx_compile_cxx11_required = xtrue; then
+    if test x$ac_success = xno; then
+      AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
+    fi
+  else
+    if test x$ac_success = xno; then
+      HAVE_CXX11=0
+      AC_MSG_NOTICE([No compiler with C++11 support was found])
+    else
+      HAVE_CXX11=1
+      AC_DEFINE(HAVE_CXX11,1,
+                [define if the compiler supports basic C++11 syntax])
+    fi
+
+    AC_SUBST(HAVE_CXX11)
+  fi
+])
+
--- a/configure	Fri Sep 12 11:38:55 2014 +0100
+++ b/configure	Fri Jun 26 14:18:45 2015 +0100
@@ -1,8 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for Sonic Visualiser 2.4.
-#
-# Report bugs to <cannam@all-day-breakfast.com>.
+# Generated by GNU Autoconf 2.69.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -266,8 +264,7 @@
     $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
     $as_echo "$0: be upgraded to zsh 4.3.4 or later."
   else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: cannam@all-day-breakfast.com about your system,
+    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
 $0: including any error possibly output before this
 $0: message. Then install a modern shell, or manually run
 $0: the script under such a shell if you do have one."
@@ -578,13 +575,14 @@
 MAKEFLAGS=
 
 # Identity of this package.
-PACKAGE_NAME='Sonic Visualiser'
-PACKAGE_TARNAME='sonic-visualiser'
-PACKAGE_VERSION='2.4'
-PACKAGE_STRING='Sonic Visualiser 2.4'
-PACKAGE_BUGREPORT='cannam@all-day-breakfast.com'
-PACKAGE_URL=''
-
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+PACKAGE_URL=
+
+ac_unique_file="Sonic Visualiser"
 ac_unique_file="main/main.cpp"
 # Factoring default headers for most tests.
 ac_includes_default="\
@@ -681,6 +679,7 @@
 EGREP
 GREP
 CXXCPP
+HAVE_CXX11
 MKDIR_P
 INSTALL_DATA
 INSTALL_SCRIPT
@@ -833,7 +832,7 @@
 localstatedir='${prefix}/var'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+docdir='${datarootdir}/doc/${PACKAGE}'
 infodir='${datarootdir}/info'
 htmldir='${docdir}'
 dvidir='${docdir}'
@@ -1333,7 +1332,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Sonic Visualiser 2.4 to adapt to many kinds of systems.
+\`configure' configures this package to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1381,8 +1380,7 @@
   --infodir=DIR           info documentation [DATAROOTDIR/info]
   --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
   --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root
-                          [DATAROOTDIR/doc/sonic-visualiser]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
   --htmldir=DIR           html documentation [DOCDIR]
   --dvidir=DIR            dvi documentation [DOCDIR]
   --pdfdir=DIR            pdf documentation [DOCDIR]
@@ -1394,9 +1392,7 @@
 fi
 
 if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of Sonic Visualiser 2.4:";;
-   esac
+
   cat <<\_ACEOF
 
 Optional Features:
@@ -1483,7 +1479,7 @@
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
-Report bugs to <cannam@all-day-breakfast.com>.
+Report bugs to the package provider.
 _ACEOF
 ac_status=$?
 fi
@@ -1546,7 +1542,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Sonic Visualiser configure 2.4
+configure
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1785,10 +1781,6 @@
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------------- ##
-## Report this to cannam@all-day-breakfast.com ##
-## ------------------------------------------- ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
@@ -1886,7 +1878,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Sonic Visualiser $as_me 2.4, which was
+It was created by $as_me, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3470,6 +3462,146 @@
 $as_echo "$MKDIR_P" >&6; }
 
 
+# We are daringly making use of C++11 now
+
+    ax_cxx_compile_cxx11_required=true
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+  ac_success=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5
+$as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; }
+if ${ax_cv_cxx_compile_cxx11+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    struct Base {
+    virtual void f() {}
+    };
+    struct Child : public Base {
+    virtual void f() override {}
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = static_cast<check_type&&>(c);
+
+    auto d = a;
+    auto l = [](){};
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_cxx_compile_cxx11=yes
+else
+  ax_cv_cxx_compile_cxx11=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5
+$as_echo "$ax_cv_cxx_compile_cxx11" >&6; }
+  if test x$ax_cv_cxx_compile_cxx11 = xyes; then
+    ac_success=yes
+  fi
+
+
+
+    if test x$ac_success = xno; then
+    for switch in -std=c++11 -std=c++0x; do
+      cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh`
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5
+$as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; }
+if eval \${$cachevar+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_CXXFLAGS="$CXXFLAGS"
+         CXXFLAGS="$CXXFLAGS $switch"
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+    struct Base {
+    virtual void f() {}
+    };
+    struct Child : public Base {
+    virtual void f() override {}
+    };
+
+    typedef check<check<bool>> right_angle_brackets;
+
+    int a;
+    decltype(a) b;
+
+    typedef check<int> check_type;
+    check_type c;
+    check_type&& cr = static_cast<check_type&&>(c);
+
+    auto d = a;
+    auto l = [](){};
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  eval $cachevar=yes
+else
+  eval $cachevar=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         CXXFLAGS="$ac_save_CXXFLAGS"
+fi
+eval ac_res=\$$cachevar
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+      if eval test x\$$cachevar = xyes; then
+        CXXFLAGS="$CXXFLAGS $switch"
+        ac_success=yes
+        break
+      fi
+    done
+  fi
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  if test x$ax_cxx_compile_cxx11_required = xtrue; then
+    if test x$ac_success = xno; then
+      as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5
+    fi
+  else
+    if test x$ac_success = xno; then
+      HAVE_CXX11=0
+      { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5
+$as_echo "$as_me: No compiler with C++11 support was found" >&6;}
+    else
+      HAVE_CXX11=1
+
+$as_echo "#define HAVE_CXX11 1" >>confdefs.h
+
+    fi
+
+
+  fi
+
 
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
@@ -4223,9 +4355,10 @@
 CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS"
 
 if test "x$GCC" = "xyes"; then
-        CXXFLAGS_DEBUG="-Wall -Wextra -Werror -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe"
-   	CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe"
-   	CXXFLAGS_MINIMAL="-g0 -O0"
+   	CXXFLAGS_ANY="-Wall -Wextra -Werror -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe"
+        CXXFLAGS_DEBUG="$CXXFLAGS_ANY -g"
+   	CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O2"
+   	CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0"
 fi
 
 CXXFLAGS_BUILD="$CXXFLAGS_RELEASE"
@@ -7357,7 +7490,7 @@
 
 subdirs="$subdirs svcore svgui svapp"
 
-ac_config_files="$ac_config_files config.pri version.h"
+ac_config_files="$ac_config_files config.pri"
 
 
 cat >confcache <<\_ACEOF
@@ -7902,7 +8035,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Sonic Visualiser $as_me 2.4, which was
+This file was extended by $as_me, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -7949,13 +8082,13 @@
 Configuration files:
 $config_files
 
-Report bugs to <cannam@all-day-breakfast.com>."
+Report bugs to the package provider."
 
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-Sonic Visualiser config.status 2.4
+config.status
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -8068,7 +8201,6 @@
 do
   case $ac_config_target in
     "config.pri") CONFIG_FILES="$CONFIG_FILES config.pri" ;;
-    "version.h") CONFIG_FILES="$CONFIG_FILES version.h" ;;
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
--- a/configure.ac	Fri Sep 12 11:38:55 2014 +0100
+++ b/configure.ac	Fri Jun 26 14:18:45 2015 +0100
@@ -1,5 +1,5 @@
 
-AC_INIT([Sonic Visualiser], [2.4], cannam@all-day-breakfast.com)
+AC_INIT([Sonic Visualiser], [], cannam@all-day-breakfast.com)
 
 AC_CONFIG_SRCDIR(main/main.cpp)
 
@@ -25,6 +25,9 @@
 AC_PROG_INSTALL
 AC_PROG_MKDIR_P
 
+# We are daringly making use of C++11 now
+AX_CXX_COMPILE_STDCXX_11(noext)
+
 AC_HEADER_STDC
 
 # These are the flags Autoconf guesses for us; we use them later if
@@ -50,9 +53,10 @@
 CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS"
 
 if test "x$GCC" = "xyes"; then
-        CXXFLAGS_DEBUG="-Wall -Wextra -Werror -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -g -pipe"
-   	CXXFLAGS_RELEASE="-g0 -O2 -Wall -pipe"
-   	CXXFLAGS_MINIMAL="-g0 -O0"
+   	CXXFLAGS_ANY="-Wall -Wextra -Werror -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe"
+        CXXFLAGS_DEBUG="$CXXFLAGS_ANY -g"
+   	CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O2"
+   	CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0"
 fi
 
 CXXFLAGS_BUILD="$CXXFLAGS_RELEASE"
@@ -117,7 +121,7 @@
 AC_SUBST(QMAKE_CONFIG)
 
 AC_CONFIG_SUBDIRS([svcore svgui svapp])
-AC_CONFIG_FILES([config.pri version.h])
+AC_CONFIG_FILES([config.pri])
 
 AC_OUTPUT
 
--- a/deploy/linux/control.example	Fri Sep 12 11:38:55 2014 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-Package: sonic-visualiser
-Priority: optional
-Maintainer: Chris Cannam <cannam@all-day-breakfast.com>
-Architecture: PLACE ARCHITECTURE HERE i386 or amd64
-Version: PLACE VERSION HERE e.g. 2.2cc-1
-Depends: libqtgui4 (>= 4.5.0), libexpat1, libfontconfig1, libfreetype6, libice6,
- libpcre3, libstdc++6, libx11-6, libxau6, libxcursor1, libxdmcp6, libxext6, libx
-fixes3, libxrender1, zlib1g, libasound2, libc6
-Description: View and analyse the contents of music audio files
- Sonic Visualiser is an application for viewing and analysing the contents of mu
-sic audio files. It was developed at the Centre for Digital Music at Queen Mary,
- University of London. Our aim is for it to be the first program you reach for w
-hen want to study a musical recording rather than simply listen to it.
- We hope Sonic Visualiser will be of particular interest to musicologists, archi
-vists, signal-processing researchers and anyone else looking for a friendly way 
-to take a look at what lies inside the audio file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/deb-skeleton/DEBIAN/control	Fri Jun 26 14:18:45 2015 +0100
@@ -0,0 +1,17 @@
+Package: sonic-visualiser
+Priority: optional
+Maintainer: Chris Cannam <cannam@all-day-breakfast.com>
+Architecture: amd64
+Version: 2.4cc-1
+Installed-Size: 6056
+Section: contrib/sound
+Depends: libqt5core5a, libsndfile1, libsamplerate0, libfftw3-3, libbz2-1.0, libpulse0, libmad0, libid3tag0, liboggz2, libfishsound1, libasound2, liblo7, liblrdf0, libsord-0-0, libserd-0-0, vamp-plugin-sdk, librubberband2, libc6
+Description: View and analyse the contents of music audio files
+ Sonic Visualiser is an application for viewing and analysing the contents
+ of music audio files. It was developed at the Centre for Digital Music at
+ Queen Mary, University of London. Our aim is for it to be the first program
+ you reach for when want to study a musical recording rather than simply
+ listen to it.
+ We hope Sonic Visualiser will be of particular interest to musicologists,
+ archivists, signal-processing researchers and anyone else looking for a
+ friendly way to take a look at what lies inside the audio file.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/deb-skeleton/usr/share/applications/sonic-visualiser.desktop	Fri Jun 26 14:18:45 2015 +0100
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Name=Sonic Visualiser
+Exec=sonic-visualiser %U
+Keywords=audio; sound; visualiser; sonic;
+Terminal=false
+Type=Application
+Icon=sv-icon
+Categories=Audio;AudioVideo;
+MimeType=application/x-sonicvisualiser;application/x-sonicvisualiser-layer;application/x-ogg;audio/mp3;audio/mpeg;audio/mpegurl;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-wav;audio/wav;application/ogg;audio/x-vorbis+ogg;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/deb-skeleton/usr/share/doc/sonic-visualiser/README	Fri Jun 26 14:18:45 2015 +0100
@@ -0,0 +1,107 @@
+
+Sonic Visualiser
+================
+
+Sonic Visualiser is a program for viewing and analysing the contents
+of music audio files.
+
+With Sonic Visualiser you can:
+
+ * Load audio files in various formats (WAV/AIFF, plus Ogg and mp3
+if compiled in) and view their waveforms
+ 
+ * Look at audio visualisations such as spectrogram views, with
+interactive adjustment of display parameters
+
+ * Annotate audio data by adding labelled time points and defining
+segments, point values and curves
+
+ * Run feature-extraction plugins to calculate annotations
+automatically, using algorithms such as beat trackers, pitch
+detectors and so on (see http://vamp-plugins.org/)
+
+ * Import annotation data from various text formats and MIDI files
+
+ * Play back the original audio with synthesised annotations, taking
+care to synchronise playback with the display position
+
+ * Slow down and speed up playback and loop segments of interest,
+including seamless looping of complex non-contiguous areas
+
+ * Export annotations and audio selections to external files.
+
+Sonic Visualiser can also be controlled remotely using the Open Sound
+Control (OSC) protocol (if support is compiled in).
+
+
+Credits
+-------
+
+Sonic Visualiser was developed at the Centre for Digital Music,
+Queen Mary, University of London.
+
+  http://c4dm.eecs.qmul.ac.uk/
+
+Sonic Visualiser was written by Chris Cannam with contributions from
+Christian Landone, Mathieu Barthet, Dan Stowell, Jesus Corral Garcia,
+Matthias Mauch, and Craig Sapp.
+
+Code copyright 2005-2007 Chris Cannam and copyright 2006-2014 Queen
+Mary, University of London, except where indicated in the individual
+source files.
+
+This work was partially funded by the European Commission through the
+SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902.
+
+This work was partially funded by the Arts and Humanities Research
+Council through its Research Centre for the History and Analysis of
+Recorded Music (CHARM).
+
+This work was partially funded by the Engineering and Physical
+Sciences Research Council through the OMRAS2 project EP/E017614/1, the
+Musicology for the Masses project EP/I001832/1, and the Sound Software
+project EP/H043101/1.
+
+Sonic Visualiser is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.  See the file COPYING included with
+this distribution for more information.
+
+Sonic Visualiser may also make use of the following libraries:
+
+ * Qt5 -- Copyright Digia Oyj, distributed under the LGPL
+ * JACK -- Copyright Paul Davis, Jack O'Quin et al, under the LGPL
+ * PortAudio -- Copyright Ross Bencina, Phil Burk et al, BSD license
+ * Ogg decoder -- Copyright CSIRO Australia, BSD license
+ * MAD mp3 decoder -- Copyright Underbit Technologies Inc, GPL
+ * libsamplerate -- Copyright Erik de Castro Lopo, GPL
+ * libsndfile -- Copyright Erik de Castro Lopo, LGPL
+ * FFTW3 -- Copyright Matteo Frigo and MIT, GPL
+ * Rubber Band -- Copyright Chris Cannam, GPL
+ * Vamp plugin SDK -- Copyright Chris Cannam and QMUL, BSD license
+ * LADSPA plugin SDK -- Copyright Richard Furse et al, LGPL
+ * RtMIDI -- Copyright Gary P. Scavone, BSD license
+ * Dataquay -- Copyright Breakfast Quay, BSD license
+ * Sord and Serd -- Copyright David Robillard, BSD license
+ * Redland -- Copyright Dave Beckett and the University of Bristol, LGPL/Apache license
+ * liblo OSC library -- Copyright Steve Harris, GPL
+
+(Some distributions of Sonic Visualiser may have one or more of these
+libraries statically linked.)  Many thanks to their authors.
+
+
+Compiling Sonic Visualiser
+--------------------------
+
+If you are planning to compile Sonic Visualiser from source code,
+please read the file INSTALL.txt.
+
+
+More information
+----------------
+
+For more information about Sonic Visualiser, please go to
+
+  http://www.sonicvisualiser.org/
+
Binary file deploy/linux/deb-skeleton/usr/share/doc/sonic-visualiser/changelog.Debian.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/deb-skeleton/usr/share/doc/sonic-visualiser/copyright	Fri Jun 26 14:18:45 2015 +0100
@@ -0,0 +1,32 @@
+Sonic Visualiser was developed at the Centre for Digital Music,
+Queen Mary, University of London.
+
+  http://www.elec.qmul.ac.uk/digitalmusic/
+
+The main program is by Chris Cannam, with additional DSP and program
+design work by Christian Landone.  Thanks also to Craig Sapp for his
+suggestions and useful feedback.
+
+Code copyright 2005-2007 Chris Cannam and copyright 2006-2014 Queen
+Mary, University of London, except where indicated in the individual
+source files.
+
+This work was partially funded by the European Commission through the
+SIMAC project IST-FP6-507142 and the EASAIER project IST-FP6-033902.
+
+This work was partially funded by the Arts and Humanities Research
+Council through its Research Centre for the History and Analysis of
+Recorded Music (CHARM).
+
+This work was partially funded by the Engineering and Physical
+Sciences Research Council through the OMRAS2 project EP/E017614/1.
+
+This work was partially funded by the Engineering and Physical
+Sciences Research Council through the Musicology for the Masses
+project EP/I001832/1.
+
+Sonic Visualiser is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version. See the file /usr/share/common-licenses/GPL-2 
+for more information.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/debian-dependencies.sh	Fri Jun 26 14:18:45 2015 +0100
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+target=$1
+
+if [ ! -f "$target" ]; then 
+    echo "Usage: $0 target-executable"
+    exit 1
+fi
+
+pfile=/tmp/packages_$$
+rfile=/tmp/redundant_$$
+
+trap "rm -f $pfile $rfile" 0
+echo 1>&2
+
+ldd "$target" | awk '{ print $3; }' | grep '^/' | while read lib; do
+    if test -n "$lib" ; then
+	dpkg-query -S "$lib"
+    fi
+    done | grep ': ' | awk -F: '{ print $1 }' | sort | uniq > $pfile
+
+echo "Packages providing required libraries:" 1>&2
+cat $pfile 1>&2
+echo 1>&2
+
+for p in `cat $pfile`; do 
+    echo Looking at $p 1>&2
+    apt-cache showpkg "$p" | grep '^  ' | grep ',' | awk -F, '{ print $1; }' | \
+	while read d; do 
+	    if grep -q '^'$d'$' $pfile; then
+		echo $p
+	    fi
+    done
+done | sort | uniq > $rfile
+
+echo "Packages that can be eliminated because other packages depend on them:" 1>&2
+cat $rfile 1>&2
+echo 1>&2
+
+cat $pfile $rfile | sort | uniq -u | sed 's/$/,/' | fmt -1000 | sed 's/^/Depends: /' | sed 's/,$/, libc6/'
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/linux/deploy-deb.sh	Fri Jun 26 14:18:45 2015 +0100
@@ -0,0 +1,56 @@
+#!/bin/bash
+# 
+# Run this from the build root
+
+usage() {
+    echo
+    echo "Usage:"
+    echo
+    echo "$0 <version> <architecture>"
+    echo
+    echo "For example: $0 2.4cc1-1 amd64"
+    echo
+    exit 2
+}
+
+version="$1"
+arch="$2"
+
+if [ -z "$version" ] || [ -z "$arch" ]; then
+    usage
+fi
+
+program=sonic-visualiser
+depdir=deploy/linux
+
+targetdir="${program}_${version}_${arch}"
+
+echo "Target dir is $targetdir"
+
+if [ -d "$targetdir" ]; then
+    echo "Target directory exists, not overwriting"
+    exit
+fi
+
+mkdir "$targetdir"
+
+cp -r "$depdir"/deb-skeleton/* "$targetdir"/
+
+mkdir -p "$targetdir"/usr/bin "$targetdir"/usr/share/pixmaps
+
+cp "$program" "$targetdir"/usr/bin/
+
+cp icons/sv-icon*.svg "$targetdir"/usr/share/pixmaps/
+cp "$program".desktop "$targetdir"/usr/share/applications/
+cp README "$targetdir"/usr/share/doc/"$program"/
+
+perl -i -p -e "s/Architecture: .*/Architecture: $arch/" "$targetdir"/DEBIAN/control
+
+deps=`bash "$depdir"/debian-dependencies.sh "$program"`
+
+perl -i -p -e "s/Depends: .*/$deps/" "$targetdir"/DEBIAN/control
+
+bash "$depdir"/fix-lintian-bits.sh "$targetdir"
+
+sudo dpkg-deb --build "$targetdir" && lintian "$targetdir".deb
+
--- a/deploy/linux/doc/sonic-visualiser/copyright	Fri Sep 12 11:38:55 2014 +0100
+++ b/deploy/linux/doc/sonic-visualiser/copyright	Fri Jun 26 14:18:45 2015 +0100
@@ -7,7 +7,7 @@
 design work by Christian Landone.  Thanks also to Craig Sapp for his
 suggestions and useful feedback.
 
-Code copyright 2005-2007 Chris Cannam and copyright 2006-2013 Queen
+Code copyright 2005-2007 Chris Cannam and copyright 2006-2014 Queen
 Mary, University of London, except where indicated in the individual
 source files.
 
--- a/deploy/linux/fix-lintian-bits.sh	Fri Sep 12 11:38:55 2014 +0100
+++ b/deploy/linux/fix-lintian-bits.sh	Fri Jun 26 14:18:45 2015 +0100
@@ -13,3 +13,4 @@
 
 sudo chown -R root.root "$dir"/*
 
+sudo chmod -R g-w "$dir"/*
--- a/deploy/osx/copy-qt.sh	Fri Sep 12 11:38:55 2014 +0100
+++ b/deploy/osx/copy-qt.sh	Fri Jun 26 14:18:45 2015 +0100
@@ -7,9 +7,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/paths.sh	Fri Sep 12 11:38:55 2014 +0100
+++ b/deploy/osx/paths.sh	Fri Jun 26 14:18:45 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/deploy/win32/build.cmd	Fri Sep 12 11:38:55 2014 +0100
+++ b/deploy/win32/build.cmd	Fri Jun 26 14:18:45 2015 +0100
@@ -1,7 +1,7 @@
 @ECHO OFF
-SET WIXPATH="C:\Program Files (x86)\WiX Toolset v3.8\bin"
+SET WIXPATH="C:\Program Files (x86)\WiX Toolset v3.9\bin"
 IF NOT EXIST %WIXPATH% (
-    SET WIXPATH="C:\Program Files\WiX Toolset v3.8\bin"
+    SET WIXPATH="C:\Program Files\WiX Toolset v3.9\bin"
 )
 DEL sonic-visualiser.msi
 %WIXPATH%\candle.exe -v sonic-visualiser.wxs
--- a/deploy/win32/sonic-visualiser.wxs	Fri Sep 12 11:38:55 2014 +0100
+++ b/deploy/win32/sonic-visualiser.wxs	Fri Jun 26 14:18:45 2015 +0100
@@ -5,7 +5,7 @@
       Id="*"
       Language="1033"
       Codepage="1252" 
-      Version="2.3.90"
+      Version="2.5.0"
       UpgradeCode="D476941E-65F3-4962-9E72-B40FAAE5DBD0"
       Manufacturer="Queen Mary, University of London">
     
@@ -144,20 +144,20 @@
                   DiskId="1"
                   Source="release\Qt5Xml.dll"/>
               <File
-                  Id="icudt52"
-                  Name="icudt52.dll"
+                  Id="icudt53"
+                  Name="icudt53.dll"
                   DiskId="1"
-                  Source="release\icudt52.dll"/>
+                  Source="release\icudt53.dll"/>
               <File
-                  Id="icuin52"
-                  Name="icuin52.dll"
+                  Id="icuin53"
+                  Name="icuin53.dll"
                   DiskId="1"
-                  Source="release\icuin52.dll"/>
+                  Source="release\icuin53.dll"/>
               <File
-                  Id="icuuc52"
-                  Name="icuuc52.dll"
+                  Id="icuuc53"
+                  Name="icuuc53.dll"
                   DiskId="1"
-                  Source="release\icuuc52.dll"/>
+                  Source="release\icuuc53.dll"/>
               <File
                   Id="libgcc"
                   Name="libgcc_s_dw2-1.dll"
@@ -228,8 +228,9 @@
       <UIRef Id="WixUI_InstallDir" />
       <UIRef Id="WixUI_ErrorProgressText" />
     </UI>
-		
+
     <Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONFOLDER" />
+    <Property Id="WIXUI_DONTVALIDATEPATH" Value="1" />
     <Property Id="ApplicationFolderName" Value="Sonic Visualiser" />
     <Property Id="WixAppFolder" Value="WixPerMachineFolder" />
     <WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
--- a/main/MainWindow.cpp	Fri Sep 12 11:38:55 2014 +0100
+++ b/main/MainWindow.cpp	Fri Jun 26 14:18:45 2015 +0100
@@ -24,6 +24,7 @@
 #include "data/model/SparseOneDimensionalModel.h"
 #include "data/model/RangeSummarisableTimeValueModel.h"
 #include "data/model/NoteModel.h"
+#include "data/model/AggregateWaveModel.h"
 #include "data/model/Labeller.h"
 #include "data/osc/OSCQueue.h"
 #include "framework/Document.h"
@@ -55,6 +56,7 @@
 #include "widgets/TransformFinder.h"
 #include "widgets/LabelCounterInputDialog.h"
 #include "widgets/ActivityLog.h"
+#include "widgets/UnitConverter.h"
 #include "audioio/AudioCallbackPlaySource.h"
 #include "audioio/AudioCallbackPlayTarget.h"
 #include "audioio/AudioTargetFactory.h"
@@ -66,7 +68,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"
@@ -106,6 +107,7 @@
 #include <QFileInfo>
 #include <QDir>
 #include <QTextStream>
+#include <QTextCodec>
 #include <QProcess>
 #include <QShortcut>
 #include <QSettings>
@@ -161,6 +163,7 @@
     m_preferencesDialog(0),
     m_layerTreeDialog(0),
     m_activityLog(new ActivityLog()),
+    m_unitConverter(new UnitConverter()),
     m_keyReference(new KeyReference()),
     m_templateWatcher(0)
 {
@@ -296,6 +299,8 @@
     connect(this, SIGNAL(replacedDocument()), this, SLOT(documentReplaced()));
     m_activityLog->hide();
 
+    m_unitConverter->hide();
+    
     newSession();
 
     connect(m_midiInput, SIGNAL(eventsAvailable()),
@@ -325,6 +330,7 @@
 //    SVDEBUG << "MainWindow::~MainWindow" << endl;
     delete m_keyReference;
     delete m_activityLog;
+    delete m_unitConverter;
     delete m_preferencesDialog;
     delete m_layerTreeDialog;
     delete m_versionTester;
@@ -452,7 +458,6 @@
     IconLoader il;
 
     QIcon icon = il.load("filenew");
-    icon.addPixmap(il.loadPixmap("filenew-22"));
     QAction *action = new QAction(icon, tr("&New Session"), this);
     action->setShortcut(tr("Ctrl+N"));
     action->setStatusTip(tr("Abandon the current %1 session and start a new one").arg(QApplication::applicationName()));
@@ -462,7 +467,6 @@
     toolbar->addAction(action);
 
     icon = il.load("fileopen");
-    icon.addPixmap(il.loadPixmap("fileopen-22"));
     action = new QAction(icon, tr("&Open..."), this);
     action->setShortcut(tr("Ctrl+O"));
     action->setStatusTip(tr("Open a session file, audio file, or layer"));
@@ -503,7 +507,6 @@
     menu->addSeparator();
 
     icon = il.load("filesave");
-    icon.addPixmap(il.loadPixmap("filesave-22"));
     action = new QAction(icon, tr("&Save Session"), this);
     action->setShortcut(tr("Ctrl+S"));
     action->setStatusTip(tr("Save the current session into a %1 session file").arg(QApplication::applicationName()));
@@ -514,7 +517,6 @@
     toolbar->addAction(action);
 	
     icon = il.load("filesaveas");
-    icon.addPixmap(il.loadPixmap("filesaveas-22"));
     action = new QAction(icon, tr("Save Session &As..."), this);
     action->setShortcut(tr("Ctrl+Shift+S"));
     action->setStatusTip(tr("Save the current session into a new %1 session file").arg(QApplication::applicationName()));
@@ -562,10 +564,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();
@@ -1025,6 +1029,11 @@
     connect(action, SIGNAL(triggered()), this, SLOT(showActivityLog()));
     menu->addAction(action);
 
+    action = new QAction(tr("Show &Unit Converter"), this);
+    action->setStatusTip(tr("Open a window of pitch and timing conversion utilities"));
+    connect(action, SIGNAL(triggered()), this, SLOT(showUnitConverter()));
+    menu->addAction(action);
+
     menu->addSeparator();
 
     action = new QAction(tr("Go Full-Screen"), this);
@@ -2330,8 +2339,8 @@
 
     QString description;
 
-    int ssr = getMainModel()->getSampleRate();
-    int tsr = ssr;
+    sv_samplerate_t ssr = getMainModel()->getSampleRate();
+    sv_samplerate_t tsr = ssr;
     if (m_playSource) tsr = m_playSource->getTargetSampleRate();
 
     if (ssr != tsr) {
@@ -2715,6 +2724,7 @@
             error = tr("Failed to open file %1 for writing").arg(path);
         } else {
             QTextStream out(&file);
+            out.setCodec(QTextCodec::codecForName("UTF-8"));
             out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                 << "<!DOCTYPE sonic-visualiser>\n"
                 << "<sv>\n"
@@ -2795,7 +2805,7 @@
     visible = pane->getImageSize(pane->getFirstVisibleFrame(),
                                  pane->getLastVisibleFrame());
 
-    int sf0 = 0, sf1 = 0;
+    sv_frame_t sf0 = 0, sf1 = 0;
  
     if (haveSelection) {
         MultiSelection::SelectionList selections = m_viewManager->getSelections();
@@ -2942,6 +2952,7 @@
     delete m_preferencesDialog.data();
 
     m_activityLog->hide();
+    m_unitConverter->hide();
     m_keyReference->hide();
 
     delete m_document;
@@ -3388,7 +3399,7 @@
 	QMessageBox::critical(this, tr("Failed to save file"),
 			      tr("<b>Save failed</b><p>Session file \"%1\" could not be saved.").arg(path));
     } else {
-	setWindowTitle(tr("%1: %1")
+	setWindowTitle(tr("%1: %2")
                        .arg(QApplication::applicationName())
 		       .arg(QFileInfo(path).fileName()));
 	m_sessionFile = path;
@@ -3694,25 +3705,49 @@
         m_document->getTransformInputModels();
 
     Model *defaultInputModel = 0;
+
     for (int j = 0; j < pane->getLayerCount(); ++j) {
+
         Layer *layer = pane->getLayer(j);
         if (!layer) continue;
+
         if (LayerFactory::getInstance()->getLayerType(layer) !=
             LayerFactory::Waveform &&
             !layer->isLayerOpaque()) continue;
+
         Model *model = layer->getModel();
         if (!model) continue;
+
         for (size_t k = 0; k < candidateInputModels.size(); ++k) {
             if (candidateInputModels[k] == model) {
                 defaultInputModel = model;
                 break;
             }
         }
+
         if (defaultInputModel) break;
     }
+
+    if (candidateInputModels.size() > 1) {
+        // Add an aggregate model as another option
+        AggregateWaveModel::ChannelSpecList sl;
+        foreach (Model *m, candidateInputModels) {
+            RangeSummarisableTimeValueModel *r =
+                qobject_cast<RangeSummarisableTimeValueModel *>(m);
+            if (r) {
+                sl.push_back(AggregateWaveModel::ModelChannelSpec(r, -1));
+            }
+        }
+        if (!sl.empty()) {
+            AggregateWaveModel *aggregate = new AggregateWaveModel(sl);
+            aggregate->setObjectName(tr("Multiplex all of the above"));
+            candidateInputModels.push_back(aggregate);
+            //!!! but it leaks
+        }
+    }
     
-    int startFrame = 0, duration = 0;
-    int endFrame = 0;
+    sv_frame_t startFrame = 0, duration = 0;
+    sv_frame_t endFrame = 0;
     m_viewManager->getSelection().getExtents(startFrame, endFrame);
     if (endFrame > startFrame) duration = endFrame - startFrame;
     else startFrame = 0;
@@ -3836,14 +3871,14 @@
 {
     PlaySpeedRangeMapper mapper(0, 200);
 
-    float percent = m_playSpeed->mappedValue();
-    float factor = mapper.getFactorForValue(percent);
+    double percent = m_playSpeed->mappedValue();
+    double factor = mapper.getFactorForValue(percent);
 
 //    cerr << "speed = " << position << " percent = " << percent << " factor = " << factor << endl;
 
     bool something = (position != 100);
 
-    int pc = lrintf(percent);
+    int pc = int(lrint(percent));
 
     if (!something) {
         contextHelpChanged(tr("Playback speed: Normal"));
@@ -3934,7 +3969,7 @@
     }
 
     bool haveSelection = false;
-    int startFrame = 0, endFrame = 0;
+    sv_frame_t startFrame = 0, endFrame = 0;
 
     if (m_viewManager && m_viewManager->haveInProgressSelection()) {
 
@@ -3987,7 +4022,7 @@
     if (!statusBar()->isVisible()) return;
 
     Pane *pane = 0;
-    int frame = m_viewManager->getPlaybackFrame();
+    sv_frame_t frame = m_viewManager->getPlaybackFrame();
 
     if (m_paneStack) pane = m_paneStack->getCurrentPane();
     if (!pane) return;
@@ -4014,7 +4049,8 @@
 }
 
 void
-MainWindow::sampleRateMismatch(int requested, int actual,
+MainWindow::sampleRateMismatch(sv_samplerate_t requested,
+                               sv_samplerate_t actual,
                                bool willResample)
 {
     if (!willResample) {
@@ -4080,7 +4116,7 @@
 
         MIDIEvent ev(m_midiInput->readEvent());
 
-        int frame = currentPane->alignFromReference(ev.getTime());
+        sv_frame_t frame = currentPane->alignFromReference(ev.getTime());
 
         bool noteOn = (ev.getMessageType() == MIDIConstants::MIDI_NOTE_ON &&
                        ev.getVelocity() > 0);
@@ -4255,20 +4291,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);
     }
 }
@@ -4361,6 +4402,13 @@
 }
 
 void
+MainWindow::showUnitConverter()
+{
+    m_unitConverter->show();
+    m_unitConverter->raise();
+}
+
+void
 MainWindow::preferences()
 {
     bool goToTemplateTab =
@@ -4548,7 +4596,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	Fri Sep 12 11:38:55 2014 +0100
+++ b/main/MainWindow.h	Fri Jun 26 14:18:45 2015 +0100
@@ -22,6 +22,7 @@
 class Surveyer;
 class LayerTreeDialog;
 class ActivityLog;
+class UnitConverter;
 
 class QFileSystemWatcher;
 class QScrollArea;
@@ -65,7 +66,7 @@
     virtual void closeSession();
     virtual void preferences();
 
-    virtual void sampleRateMismatch(int, int, bool);
+    virtual void sampleRateMismatch(sv_samplerate_t, sv_samplerate_t, bool);
     virtual void audioOverloadPluginDisabled();
     virtual void audioTimeStretchMultiChannelDisabled();
 
@@ -136,6 +137,7 @@
 
     virtual void showLayerTree();
     virtual void showActivityLog();
+    virtual void showUnitConverter();
 
     virtual void mouseEnteredWidget();
     virtual void mouseLeftWidget();
@@ -208,6 +210,7 @@
     QPointer<LayerTreeDialog>   m_layerTreeDialog;
 
     ActivityLog             *m_activityLog;
+    UnitConverter           *m_unitConverter;
     KeyReference            *m_keyReference;
 
     QFileSystemWatcher      *m_templateWatcher;
--- a/main/OSCHandler.cpp	Fri Sep 12 11:38:55 2014 +0100
+++ b/main/OSCHandler.cpp	Fri Jun 26 14:18:45 2015 +0100
@@ -123,7 +123,7 @@
 
         if (getMainModel()) {
 
-            int frame = m_viewManager->getPlaybackFrame();
+            sv_frame_t frame = m_viewManager->getPlaybackFrame();
             bool selection = false;
             bool play = (message.getMethod() == "play");
 
@@ -233,8 +233,8 @@
 
         if (getMainModel()) {
 
-            int f0 = getMainModel()->getStartFrame();
-            int f1 = getMainModel()->getEndFrame();
+            sv_frame_t f0 = getMainModel()->getStartFrame();
+            sv_frame_t f1 = getMainModel()->getEndFrame();
 
             bool done = false;
 
@@ -452,7 +452,7 @@
                 double level = message.getArg(0).toDouble();
                 Pane *currentPane = m_paneStack->getCurrentPane();
                 if (level < 1.0) level = 1.0;
-                if (currentPane) currentPane->setZoomLevel(lrint(level));
+                if (currentPane) currentPane->setZoomLevel(int(lrint(level)));
             }
         }
 
--- a/main/PreferencesDialog.cpp	Fri Sep 12 11:38:55 2014 +0100
+++ b/main/PreferencesDialog.cpp	Fri Jun 26 14:18:45 2015 +0100
@@ -122,7 +122,6 @@
     connect(propertyLayout, SIGNAL(currentIndexChanged(int)),
             this, SLOT(propertyLayoutChanged(int)));
 
-    
 
     m_tuningFrequency = prefs->getTuningFrequency();
 
@@ -224,6 +223,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;
     
@@ -292,6 +300,14 @@
     connect(ttMode, SIGNAL(currentIndexChanged(int)),
             this, SLOT(timeToTextModeChanged(int)));
 
+    QCheckBox *hms = new QCheckBox;
+    int showHMS = prefs->getPropertyRangeAndValue
+        ("Show Hours And Minutes", &min, &max, &deflt);
+    m_showHMS = (showHMS != 0);
+    hms->setCheckState(m_showHMS ? Qt::Checked : Qt::Unchecked);
+    connect(hms, SIGNAL(stateChanged(int)),
+            this, SLOT(showHMSChanged(int)));
+    
     // General tab
 
     QFrame *frame = new QFrame;
@@ -342,6 +358,18 @@
     row = 0;
 
     subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
+                                                ("Show Splash Screen"))),
+                       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);
     subgrid->addWidget(propertyLayout, row++, 1, 1, 2);
@@ -364,9 +392,9 @@
     subgrid->addWidget(ttMode, row++, 1, 1, 2);
 
     subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel
-                                                ("Show Splash Screen"))),
+                                                ("Show Hours And Minutes"))),
                        row, 0);
-    subgrid->addWidget(showSplash, row++, 1, 1, 1);
+    subgrid->addWidget(hms, row++, 1, 1, 1);
 
     subgrid->setRowStretch(row, 10);
     
@@ -552,6 +580,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);
@@ -609,6 +645,13 @@
 }
 
 void
+PreferencesDialog::showHMSChanged(int state)
+{
+    m_showHMS = (state == Qt::Checked);
+    m_applyButton->setEnabled(true);
+}
+
+void
 PreferencesDialog::octaveSystemChanged(int system)
 {
     m_octaveSystem = system;
@@ -647,6 +690,7 @@
     prefs->setTemporaryDirectoryRoot(m_tempDirRoot);
     prefs->setBackgroundMode(Preferences::BackgroundMode(m_backgroundMode));
     prefs->setTimeToTextMode(Preferences::TimeToTextMode(m_timeToTextMode));
+    prefs->setShowHMS(m_showHMS);
     prefs->setViewFontSize(m_viewFontSize);
     
     prefs->setProperty("Octave Numbering System", m_octaveSystem);
@@ -660,6 +704,9 @@
     settings.setValue(permishTag, m_networkPermission);
     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	Fri Sep 12 11:38:55 2014 +0100
+++ b/main/PreferencesDialog.h	Fri Jun 26 14:18:45 2015 +0100
@@ -57,12 +57,14 @@
     void tempDirRootChanged(QString root);
     void backgroundModeChanged(int mode);
     void timeToTextModeChanged(int mode);
+    void showHMSChanged(int state);
     void octaveSystemChanged(int system);
     void viewFontSizeChanged(int sz);
     void showSplashChanged(int state);
     void defaultTemplateChanged(int);
     void localeChanged(int);
     void networkPermissionChanged(int state);
+    void retinaChanged(int state);
 
     void tempDirButtonClicked();
 
@@ -89,14 +91,16 @@
     int m_spectrogramSmoothing;
     int m_spectrogramXSmoothing;
     int m_propertyLayout;
-    float m_tuningFrequency;
+    double m_tuningFrequency;
     int m_audioDevice;
     int m_resampleQuality;
     bool m_resampleOnLoad;
     bool m_networkPermission;
+    bool m_retina;
     QString m_tempDirRoot;
     int m_backgroundMode;
     int m_timeToTextMode;
+    bool m_showHMS;
     int m_octaveSystem;
     int m_viewFontSize;
     bool m_showSplash;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/SVSplash.cpp	Fri Jun 26 14:18:45 2015 +0100
@@ -0,0 +1,100 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "SVSplash.h"
+
+#include "../version.h"
+
+#include <QPainter>
+#include <QApplication>
+#include <QDesktopWidget>
+#include <QSvgRenderer>
+
+#include <cmath>
+
+#include <iostream>
+using namespace std;
+
+SVSplash::SVSplash()
+{
+    setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
+    
+    QPixmap *p1 = new QPixmap(":icons/scalable/sv-splash.png");
+
+    int w = p1->width(), h = p1->height();
+    QRect desk = QApplication::desktop()->availableGeometry();
+
+    double dpratio = devicePixelRatio();
+    double widthMultiple = double(desk.width()) / double(w);
+
+    int sw = w, sh = h;
+
+    if (widthMultiple > 2.5 || dpratio > 1.0) {
+
+	// Hi-dpi either via pixel doubling or simply via lots of
+	// pixels
+
+	double factor = widthMultiple / 2.5;
+	if (factor < 1.0) factor = 1.0;
+	sw = int(floor(w * factor));
+	sh = int(floor(h * factor));
+
+	delete p1;
+	m_pixmap = new QPixmap(int(floor(sw * dpratio)),
+			       int(floor(sh * dpratio)));
+
+	cerr << "pixmap size = " << m_pixmap->width() << " * "
+	     << m_pixmap->height() << endl;
+	
+	m_pixmap->fill(Qt::red);
+	QSvgRenderer renderer(QString(":icons/scalable/sv-splash.svg"));
+	QPainter painter(m_pixmap);
+	renderer.render(&painter);
+	painter.end();
+
+    } else {
+	// The "low dpi" case
+	m_pixmap = p1;
+    }
+    
+    setFixedWidth(sw);
+    setFixedHeight(sh);
+    setGeometry(desk.x() + desk.width()/2 - sw/2,
+		desk.y() + desk.height()/2 - sh/2,
+		sw, sh);
+}
+
+SVSplash::~SVSplash()
+{
+    delete m_pixmap;
+}
+
+void
+SVSplash::finishSplash(QWidget *w)
+{
+    finish(w);
+}
+
+void
+SVSplash::drawContents(QPainter *painter)
+{
+    painter->drawPixmap(rect(), *m_pixmap, m_pixmap->rect());
+    QString text = QString("v%1").arg(SV_VERSION);
+    painter->drawText
+	(width() - painter->fontMetrics().width(text) - (width()/50),
+	 (width()/70) + painter->fontMetrics().ascent(),
+	 text);
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/SVSplash.h	Fri Jun 26 14:18:45 2015 +0100
@@ -0,0 +1,39 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#ifndef SV_SPLASH_H
+#define SV_SPLASH_H
+
+#include <QSplashScreen>
+
+class QPixmap;
+
+class SVSplash : public QSplashScreen
+{
+    Q_OBJECT
+
+public:
+    SVSplash();
+    virtual ~SVSplash();
+
+public slots:
+    void finishSplash(QWidget *);
+    
+protected:
+    void drawContents(QPainter *);
+    QPixmap *m_pixmap;
+};
+
+#endif
+    
--- a/main/main.cpp	Fri Sep 12 11:38:55 2014 +0100
+++ b/main/main.cpp	Fri Jun 26 14:18:45 2015 +0100
@@ -14,12 +14,14 @@
 */
 
 #include "MainWindow.h"
+#include "SVSplash.h"
 
 #include "system/System.h"
 #include "system/Init.h"
 #include "base/TempDirectory.h"
 #include "base/PropertyContainer.h"
 #include "base/Preferences.h"
+#include "data/fileio/FileSource.h"
 #include "widgets/TipDialog.h"
 #include "widgets/InteractiveFileFinder.h"
 #include "svapp/framework/TransformUserConfigurator.h"
@@ -35,13 +37,10 @@
 #include <QIcon>
 #include <QSessionManager>
 #include <QDir>
-#include <QSplashScreen>
 #include <QTimer>
 #include <QPainter>
 #include <QFileOpenEvent>
 
-#include "../version.h"
-
 #include <iostream>
 #include <signal.h>
 
@@ -214,7 +213,7 @@
         if (!success) manager.cancel();
     }
 
-    void handleFilepathArgument(QString path, QSplashScreen *splash);
+    void handleFilepathArgument(QString path, SVSplash *splash);
 
     bool m_readyForFiles;
     QStringList m_filepathQueue;
@@ -222,7 +221,6 @@
 protected:
     MainWindow *m_mainWindow;
     bool event(QEvent *);
-
 };
 
 int
@@ -271,22 +269,15 @@
     QApplication::setOrganizationDomain("sonicvisualiser.org");
     QApplication::setApplicationName(QApplication::tr("Sonic Visualiser"));
 
-    QSplashScreen *splash = 0;
+    QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
+
+    SVSplash *splash = 0;
 
     QSettings settings;
 
     settings.beginGroup("Preferences");
     if (settings.value("show-splash", true).toBool()) {
-        QPixmap pixmap(":/icons/sv-splash.png");
-        QPainter painter;
-        painter.begin(&pixmap);
-        QString text = QString("v%1").arg(SV_VERSION);
-        painter.drawText
-            (pixmap.width() - painter.fontMetrics().width(text) - 10,
-             10 + painter.fontMetrics().ascent(),
-             text);
-        painter.end();
-        splash = new QSplashScreen(pixmap);
+        splash = new SVSplash();
         splash->show();
         QTimer::singleShot(5000, splash, SLOT(hide()));
         application.processEvents();
@@ -350,6 +341,8 @@
     TransformUserConfigurator::setParentWidget(gui);
     if (splash) {
         QObject::connect(gui, SIGNAL(hideSplash()), splash, SLOT(hide()));
+        QObject::connect(gui, SIGNAL(hideSplash(QWidget *)),
+                         splash, SLOT(finishSplash(QWidget *)));
     }
 
     QDesktopWidget *desktop = QApplication::desktop();
@@ -417,15 +410,6 @@
     settings.endGroup();
 #endif
 
-    if (splash) splash->finish(gui);
-    delete splash;
-
-/*
-    TipDialog tipDialog;
-    if (tipDialog.isOK()) {
-        tipDialog.exec();
-    }
-*/
     int rv = application.exec();
 
     gui->hide();
@@ -457,6 +441,8 @@
     settings.endGroup();
 #endif
 
+    FileSource::debugReport();
+    
     delete gui;
 
     cleanupMutex.unlock();
@@ -487,7 +473,7 @@
 }
 
 /** Application-global handler for filepaths passed in, e.g. as command-line arguments or apple events */
-void SVApplication::handleFilepathArgument(QString path, QSplashScreen *splash){
+void SVApplication::handleFilepathArgument(QString path, SVSplash *splash){
     static bool haveSession = false;
     static bool haveMainModel = false;
     static bool havePriorCommandLineModel = false;
--- a/misc/debian-dependencies.sh	Fri Sep 12 11:38:55 2014 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#!/bin/bash
-
-target=$1
-
-if [ ! -f "$target" ]; then 
-    echo "Usage: $0 target-executable"
-    exit 1
-fi
-
-pfile=/tmp/packages_$$
-rfile=/tmp/redundant_$$
-
-trap "rm -f $pfile $rfile" 0
-echo
-
-ldd "$target" | awk '{ print $3; }' | grep '^/' | while read lib; do
-    if test -n "$lib" ; then
-	dpkg-query -S "$lib"
-    fi
-    done | grep ': ' | awk -F: '{ print $1 }' | sort | uniq > $pfile
-
-echo "Packages providing required libraries:"
-cat $pfile
-echo
-
-for p in `cat $pfile`; do 
-    echo Looking at $p 1>&2
-    apt-cache showpkg "$p" | grep '^  ' | grep ',' | awk -F, '{ print $1; }' | \
-	while read d; do 
-	    if grep -q '^'$d'$' $pfile; then
-		echo $p
-	    fi
-    done
-done | sort | uniq > $rfile
-
-echo "Packages that can be eliminated because other packages depend on them:"
-cat $rfile
-echo
-
-echo "Remaining required packages:"
-cat $pfile $rfile | sort | uniq -u
-
--- a/platform-dataquay.pri	Fri Sep 12 11:38:55 2014 +0100
+++ b/platform-dataquay.pri	Fri Jun 26 14:18:45 2015 +0100
@@ -3,10 +3,11 @@
     include(./config.pri)
 }
 
-CONFIG += staticlib
+CONFIG += staticlib c++11
 
 DEFINES -= USE_REDLAND
 QMAKE_CXXFLAGS -= -I/usr/include/rasqal -I/usr/include/raptor2
+QMAKE_CXXFLAGS -= -Werror
 EXTRALIBS -= -lrdf
 
 DEFINES += USE_SORD
--- a/sonic-visualiser.desktop	Fri Sep 12 11:38:55 2014 +0100
+++ b/sonic-visualiser.desktop	Fri Jun 26 14:18:45 2015 +0100
@@ -1,8 +1,9 @@
 [Desktop Entry]
 Name=Sonic Visualiser
-Exec=sonic-visualiser
+Exec=sonic-visualiser %U
+Keywords=audio; sound; visualiser; sonic;
 Terminal=false
 Type=Application
 Icon=sv-icon
-Categories=Application;Multimedia;Audio;AudioVideo
-MimeType=application/x-sonicvisualiser;application/x-sonicvisualiser-layer;application/x-ogg;audio/mp3;audio/mpeg;audio/mpegurl;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-wav;audio/wav;application/ogg;audio/x-vorbis+ogg
+Categories=Audio;AudioVideo;
+MimeType=application/x-sonicvisualiser;application/x-sonicvisualiser-layer;application/x-ogg;audio/mp3;audio/mpeg;audio/mpegurl;audio/x-flac;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-wav;audio/wav;application/ogg;audio/x-vorbis+ogg;
--- a/sonic-visualiser.pro	Fri Sep 12 11:38:55 2014 +0100
+++ b/sonic-visualiser.pro	Fri Jun 26 14:18:45 2015 +0100
@@ -5,7 +5,7 @@
     # 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_sv.file = sv.pro
--- a/sonic-visualiser.qrc	Fri Sep 12 11:38:55 2014 +0100
+++ b/sonic-visualiser.qrc	Fri Jun 26 14:18:45 2015 +0100
@@ -1,9 +1,50 @@
 <!DOCTYPE RCC><RCC version="1.0">
-<qresource>
+  <qresource>
+    <file>icons/scalable/align.svg</file>
+    <file>icons/scalable/colour3d.svg</file>
+    <file>icons/scalable/cross.svg</file>
+    <file>icons/scalable/draw.svg</file>
+    <file>icons/scalable/erase.svg</file>
+    <file>icons/scalable/filenew.svg</file>
+    <file>icons/scalable/fileopen.svg</file>
+    <file>icons/scalable/filesaveas.svg</file>
+    <file>icons/scalable/filesave.svg</file>
+    <file>icons/scalable/filesavesv.svg</file>
+    <file>icons/scalable/ffwd-end.svg</file>
+    <file>icons/scalable/ffwd.svg</file>
+    <file>icons/scalable/navigate.svg</file>
+    <file>icons/scalable/pause.svg</file>
+    <file>icons/scalable/playloop.svg</file>
+    <file>icons/scalable/playpause.svg</file>
+    <file>icons/scalable/playselection.svg</file>
+    <file>icons/scalable/solo.svg</file>
+    <file>icons/scalable/play.svg</file>
+    <file>icons/scalable/rewind-start.svg</file>
+    <file>icons/scalable/rewind.svg</file>
+    <file>icons/scalable/undo.svg</file>
+    <file>icons/scalable/redo.svg</file>
+    <file>icons/scalable/select.svg</file>
+    <file>icons/scalable/instants.svg</file>
+    <file>icons/scalable/notes.svg</file>
+    <file>icons/scalable/values.svg</file>
+    <file>icons/scalable/regions.svg</file>
+    <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>
+    <file>icons/scalable/sv-splash.png</file>
+    <file>icons/scalable/sv-splash@2x.png</file>
+    <file>icons/scalable/waveform.svg</file>
     <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>
@@ -44,10 +85,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	Fri Sep 12 11:38:55 2014 +0100
+++ b/sv.pro	Fri Jun 26 14:18:45 2015 +0100
@@ -36,8 +36,8 @@
     }
 }
 
-CONFIG += qt thread warn_on stl rtti exceptions
-QT += network xml gui widgets
+CONFIG += qt thread warn_on stl rtti exceptions c++11
+QT += network xml gui widgets svg
 
 TARGET = "Sonic Visualiser"
 linux*:TARGET = sonic-visualiser
@@ -86,12 +86,14 @@
 HEADERS += main/MainWindow.h \
            main/NetworkPermissionTester.h \
            main/Surveyer.h \
+           main/SVSplash.h \
            main/PreferencesDialog.h
 SOURCES += main/main.cpp \
            main/OSCHandler.cpp \
            main/MainWindow.cpp \
            main/NetworkPermissionTester.cpp \
            main/Surveyer.cpp \
+           main/SVSplash.cpp \
            main/PreferencesDialog.cpp 
 
 # for mac integration
--- a/version.h	Fri Sep 12 11:38:55 2014 +0100
+++ b/version.h	Fri Jun 26 14:18:45 2015 +0100
@@ -1,1 +1,1 @@
-#define SV_VERSION "2.4"
+#define SV_VERSION "2.5"