changeset 346:90169412b1a7

Merge from branch by-id
author Chris Cannam
date Thu, 18 Jul 2019 14:58:51 +0100 (2019-07-18)
parents 70d19452631e (current diff) 1286914e4fe0 (diff)
children ce1b4bafe719
files deploy/win64/build-32.bat deploy/win64/build-64.bat repoint-lock.json repoint-project.json
diffstat 22 files changed, 529 insertions(+), 184 deletions(-) [+]
line wrap: on
line diff
--- a/.appveyor.yml	Fri Sep 14 14:55:24 2018 +0100
+++ b/.appveyor.yml	Thu Jul 18 14:58:51 2019 +0100
@@ -12,13 +12,6 @@
   - ps: '"[hostsecurity]" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini'
   - ps: '"code.soundsoftware.ac.uk = code.soundsoftware.ac.uk:fingerprints=sha256:64:75:f6:47:15:de:b4:51:ea:96:e2:f4:8a:f5:53:a5:11:c8:dd:82:73:5d:bd:54:18:cb:c8:9d:10:37:28:85" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini'
 
-before_build:
-  - set QTDIR=C:\Qt\5.10\msvc2017_64
-  - set PATH=%PATH%;%QTDIR%\bin;C:\Program Files (x86)\SMLNJ\bin
-  - repoint install
-  - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
-  - qmake -r -tp vc sonic-annotator.pro
+build_script:
+  - deploy\win\build-both.bat
 
-build:
-  project: sonic-annotator.sln
-  
--- a/.hgignore	Fri Sep 14 14:55:24 2018 +0100
+++ b/.hgignore	Thu Jul 18 14:58:51 2019 +0100
@@ -17,7 +17,7 @@
 cov-int
 vamp-plugin-sdk
 svcore
-piper-cpp
+piper-vamp-cpp
 dataquay
 bqvec
 bqfft
@@ -27,3 +27,4 @@
 glob:.repoint-*.bin
 build_win32
 build_win64
+glob:.repoint*
--- a/.travis.yml	Fri Sep 14 14:55:24 2018 +0100
+++ b/.travis.yml	Thu Jul 18 14:58:51 2019 +0100
@@ -1,16 +1,19 @@
-dist:
-  - trusty
-
 language:
   - cpp
 
-sudo:
-  - false
-
 os:
   - linux
   - osx
 
+dist:
+  - xenial
+
+sudo:
+  - required
+
+osx_image:
+  - xcode9
+
 addons:
   apt:
     packages:
--- a/base.pri	Fri Sep 14 14:55:24 2018 +0100
+++ b/base.pri	Thu Jul 18 14:58:51 2019 +0100
@@ -3,9 +3,12 @@
         . \
 	bqvec \
 	bqvec/bqvec \
+	bqthingfactory \
+	bqaudiostream \
+	bqaudiostream/bqaudiostream \
 	bqfft \
 	bqresample \
-	piper-cpp \
+	piper-vamp-cpp \
         checker \
 	dataquay \
 	dataquay/dataquay \
@@ -28,5 +31,5 @@
 
 DEFINES += NO_HIT_COUNTS
 
-CONFIG += qt thread warn_on stl rtti exceptions c++11
+CONFIG += qt thread warn_on stl rtti exceptions
     
--- a/base.pro	Fri Sep 14 14:55:24 2018 +0100
+++ b/base.pro	Thu Jul 18 14:58:51 2019 +0100
@@ -20,6 +20,10 @@
 OBJECTS_DIR = o
 MOC_DIR = o
 
+exists(repoint.pri) {
+    include(repoint.pri)
+}
+
 include(bq-files.pri)
 include(vamp-plugin-sdk-files.pri)
 include(svcore/files.pri)
--- a/bq-files.pri	Fri Sep 14 14:55:24 2018 +0100
+++ b/bq-files.pri	Thu Jul 18 14:58:51 2019 +0100
@@ -11,12 +11,18 @@
 	bqvec/pommier/sse_mathfun.h \
         bqfft/bqfft/FFT.h \
 	bqresample/bqresample/Resampler.h \
-	bqresample/speex/speex_resampler.h
+	bqresample/speex/speex_resampler.h \
+        bqaudiostream/bqaudiostream/AudioReadStream.h \
+        bqaudiostream/bqaudiostream/AudioReadStreamFactory.h \
+        bqaudiostream/bqaudiostream/Exceptions.h \
+        bqthingfactory/bqthingfactory/ThingFactory.h
 
 BQ_SOURCES += \
 	bqvec/src/Allocators.cpp \
 	bqvec/src/Barrier.cpp \
 	bqvec/src/VectorOpsComplex.cpp \
         bqfft/src/FFT.cpp \
-	bqresample/src/Resampler.cpp
-
+	bqresample/src/Resampler.cpp \
+        bqaudiostream/src/AudioReadStream.cpp \
+        bqaudiostream/src/AudioReadStreamFactory.cpp \
+        bqaudiostream/src/AudioStreamExceptions.cpp
--- a/config.pri.in	Fri Sep 14 14:55:24 2018 +0100
+++ b/config.pri.in	Thu Jul 18 14:58:51 2019 +0100
@@ -1,6 +1,8 @@
 
 CONFIG += @QMAKE_CONFIG@
 
+PREFIX_PATH = @prefix@
+
 DEFINES += @HAVES@
 
 QMAKE_CC = @CC@
@@ -11,8 +13,11 @@
 QMAKE_CXXFLAGS += @CXXFLAGS@
 QMAKE_LFLAGS += @LDFLAGS@
 
+CONFIG += @CXXSTANDARD@
+
 linux*:LIBS += -L$$PWD -lbase -lasound -ldl
 
+macx*:DEFINES += HAVE_COREAUDIO
 macx*:LIBS += -framework CoreAudio -framework CoreMidi -framework AudioUnit -framework AudioToolbox -framework CoreFoundation -framework CoreServices
 
 LIBS += @LIBS@
--- a/configure	Fri Sep 14 14:55:24 2018 +0100
+++ b/configure	Thu Jul 18 14:58:51 2019 +0100
@@ -624,12 +624,14 @@
 LIBOBJS
 QMAKE_CONFIG
 HAVES
-CXXFLAGS_MINIMAL
+CXXSTANDARD
 CUT
 SHA1SUM
 MAKEDEPEND
 XARGS
 PERL
+opus_LIBS
+opus_CFLAGS
 id3tag_LIBS
 id3tag_CFLAGS
 mad_LIBS
@@ -761,7 +763,9 @@
 mad_CFLAGS
 mad_LIBS
 id3tag_CFLAGS
-id3tag_LIBS'
+id3tag_LIBS
+opus_CFLAGS
+opus_LIBS'
 
 
 # Initialize some variables set by options.
@@ -1423,6 +1427,8 @@
   id3tag_CFLAGS
               C compiler flags for id3tag, overriding pkg-config
   id3tag_LIBS linker flags for id3tag, overriding pkg-config
+  opus_CFLAGS C compiler flags for opus, overriding pkg-config
+  opus_LIBS   linker flags for opus, overriding pkg-config
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -4368,8 +4374,7 @@
 
 
 SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING"
-SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING"
-SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE"
+SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING -DNO_HIT_COUNTS"
 
 # Now we have: USER_CXXFLAGS contains any flags the user set
 # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought
@@ -4377,17 +4382,63 @@
 # allow ourselves to be overridden (later) by the former
 
 CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS"
+OPTFLAGS_DEBUG="-O2"
+LDFLAGS_DEBUG=""
 CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS"
-CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS"
+OPTFLAGS_RELEASE="-O2"
+LDFLAGS_RELEASE=""
+CXXSTANDARD=c++14
 
 if test "x$GCC" = "xyes"; then
-   	CXXFLAGS_ANY="-std=c++11 -fpic -Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe"
+   	CXXFLAGS_ANY="-fpic -Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe"
         CXXFLAGS_DEBUG="$CXXFLAGS_ANY -g -Werror"
-   	CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O3 -ffast-math"
-   	CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0"
-fi
-
-CXXFLAGS_BUILD="$CXXFLAGS_RELEASE"
+        OPTFLAGS_DEBUG="-O2"
+   	CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0"
+        OPTFLAGS_RELEASE="-O3 -ffast-math"
+        LIBS_DEBUG="$LIBS"
+        as_CACHEVAR=`$as_echo "ax_cv_check_cxxflags__--std=$CXXSTANDARD" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts --std=$CXXSTANDARD" >&5
+$as_echo_n "checking whether C++ compiler accepts --std=$CXXSTANDARD... " >&6; }
+if eval \${$as_CACHEVAR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  --std=$CXXSTANDARD"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  eval "$as_CACHEVAR=yes"
+else
+  eval "$as_CACHEVAR=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CXXFLAGS=$ax_check_save_flags
+fi
+eval ac_res=\$$as_CACHEVAR
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_CACHEVAR"\" = x"yes"; then :
+  :
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: Compiler does not appear to support $CXXSTANDARD, falling back to c++11" >&5
+$as_echo "$as_me: Compiler does not appear to support $CXXSTANDARD, falling back to c++11" >&6;}
+        CXXSTANDARD=c++11
+fi
+
+fi
+
+CXXFLAGS_BUILD="$CXXFLAGS_RELEASE $OPTFLAGS_RELEASE"
+LDFLAGS_BUILD="$LDFLAGS_RELEASE $OPTFLAGS_RELEASE"
 SV_DEFINES_BUILD="$SV_DEFINES_RELEASE"
 
 QMAKE_CONFIG="release"
@@ -4397,8 +4448,10 @@
   enableval=$enable_debug; { $as_echo "$as_me:${as_lineno-$LINENO}: enabling debug build" >&5
 $as_echo "$as_me: enabling debug build" >&6;}
 QMAKE_CONFIG="debug"
-CXXFLAGS_BUILD="$CXXFLAGS_DEBUG"
+CXXFLAGS_BUILD="$CXXFLAGS_DEBUG $OPTFLAGS_DEBUG"
+LDFLAGS_BUILD="$LDFLAGS_DEBUG"
 SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"
+LIBS="$LIBS_DEBUG"
 fi
 
 
@@ -4408,10 +4461,11 @@
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: Overriding default compiler flags with the above user setting." >&5
 $as_echo "$as_me: Overriding default compiler flags with the above user setting." >&6;}
 	CXXFLAGS_BUILD="$USER_CXXFLAGS"
-	CXXFLAGS_MINIMAL="$USER_CXXFLAGS"
+        LDFLAGS_BUILD=""
 fi
 
 CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD"
+LDFLAGS="$LDFLAGS_BUILD"
 
 # On IRIX 5.3, sys/types and inttypes.h are conflicting.
 for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
@@ -6419,6 +6473,163 @@
 fi
 
 
+SV_MODULE_MODULE=opus
+SV_MODULE_VERSION_TEST="opusfile"
+SV_MODULE_HEADER=opus/opusfile.h
+SV_MODULE_LIB=opusfile
+SV_MODULE_FUNC=op_read_float
+SV_MODULE_HAVE=HAVE_$(echo opus | tr 'a-z' 'A-Z')
+SV_MODULE_FAILED=1
+if test -n "$opus_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 $opus_CFLAGS"
+   LIBS="$LIBS $opus_LIBS"
+   SV_MODULE_FAILED=""
+fi
+if test -z "$SV_MODULE_VERSION_TEST" ; then
+   SV_MODULE_VERSION_TEST=$SV_MODULE_MODULE
+fi
+if test -n "$SV_MODULE_FAILED" && test -n "$PKG_CONFIG"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for opus" >&5
+$as_echo_n "checking for opus... " >&6; }
+
+if test -n "$opus_CFLAGS"; then
+    pkg_cv_opus_CFLAGS="$opus_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
+  ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_opus_CFLAGS=`$PKG_CONFIG --cflags "$SV_MODULE_VERSION_TEST" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$opus_LIBS"; then
+    pkg_cv_opus_LIBS="$opus_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
+  ($PKG_CONFIG --exists --print-errors "$SV_MODULE_VERSION_TEST") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_opus_LIBS=`$PKG_CONFIG --libs "$SV_MODULE_VERSION_TEST" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        opus_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$SV_MODULE_VERSION_TEST" 2>&1`
+        else
+	        opus_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 "$opus_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;}
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	{ $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
+	opus_CFLAGS=$pkg_cv_opus_CFLAGS
+	opus_LIBS=$pkg_cv_opus_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	HAVES="$HAVES $SV_MODULE_HAVE";CXXFLAGS="$CXXFLAGS $opus_CFLAGS";LIBS="$LIBS $opus_LIBS";SV_MODULE_FAILED=""
+fi
+fi
+if test -n "$SV_MODULE_FAILED"; then
+   as_ac_Header=`$as_echo "ac_cv_header_$SV_MODULE_HEADER" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" "$SV_MODULE_HEADER" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  HAVES="$HAVES $SV_MODULE_HAVE";SV_MODULE_FAILED=""
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&5
+$as_echo "$as_me: Failed to find header $SV_MODULE_HEADER for optional module $SV_MODULE_MODULE" >&6;}
+fi
+
+
+   if test -z "$SV_MODULE_FAILED"; then
+      if test -n "$SV_MODULE_LIB"; then
+           as_ac_Lib=`$as_echo "ac_cv_lib_$SV_MODULE_LIB''_$SV_MODULE_FUNC" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB" >&5
+$as_echo_n "checking for $SV_MODULE_FUNC in -l$SV_MODULE_LIB... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$SV_MODULE_LIB  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $SV_MODULE_FUNC ();
+int
+main ()
+{
+return $SV_MODULE_FUNC ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  eval "$as_ac_Lib=yes"
+else
+  eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+  LIBS="$LIBS -l$SV_MODULE_LIB"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&5
+$as_echo "$as_me: Failed to find library $SV_MODULE_LIB for optional module $SV_MODULE_MODULE" >&6;}
+fi
+
+      fi
+   fi
+fi
+
+
+
+
 
 
 
--- a/configure.ac	Fri Sep 14 14:55:24 2018 +0100
+++ b/configure.ac	Thu Jul 18 14:58:51 2019 +0100
@@ -40,8 +40,7 @@
 SV_CHECK_QT
 
 SV_DEFINES_DEBUG="-DDEBUG -DBUILD_DEBUG -DWANT_TIMING"
-SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING"
-SV_DEFINES_MINIMAL="$SV_DEFINES_RELEASE"
+SV_DEFINES_RELEASE="-DNDEBUG -DBUILD_RELEASE -DNO_TIMING -DNO_HIT_COUNTS"
 
 # Now we have: USER_CXXFLAGS contains any flags the user set
 # explicitly; AUTOCONF_CXXFLAGS contains flags that Autoconf thought
@@ -49,34 +48,46 @@
 # allow ourselves to be overridden (later) by the former
 
 CXXFLAGS_DEBUG="$AUTOCONF_CXXFLAGS"
+OPTFLAGS_DEBUG="-O2"
+LDFLAGS_DEBUG=""
 CXXFLAGS_RELEASE="$AUTOCONF_CXXFLAGS"
-CXXFLAGS_MINIMAL="$AUTOCONF_CXXFLAGS"
+OPTFLAGS_RELEASE="-O2"
+LDFLAGS_RELEASE=""
+CXXSTANDARD=c++14
 
 if test "x$GCC" = "xyes"; then
-   	CXXFLAGS_ANY="-std=c++11 -fpic -Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe"
+   	CXXFLAGS_ANY="-fpic -Wall -Wextra -Woverloaded-virtual -Wformat-nonliteral -Wformat-security -Winit-self -Wswitch-enum -Wconversion -pipe"
         CXXFLAGS_DEBUG="$CXXFLAGS_ANY -g -Werror"
-   	CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0 -O3 -ffast-math"
-   	CXXFLAGS_MINIMAL="$CXXFLAGS_ANY -g0 -O0"
+        OPTFLAGS_DEBUG="-O2"
+   	CXXFLAGS_RELEASE="$CXXFLAGS_ANY -g0"
+        OPTFLAGS_RELEASE="-O3 -ffast-math"
+        LIBS_DEBUG="$LIBS"
+        AX_CHECK_COMPILE_FLAG(--std=$CXXSTANDARD, [], [AC_MSG_NOTICE([Compiler does not appear to support $CXXSTANDARD, falling back to c++11])
+        CXXSTANDARD=c++11])
 fi
 
-CXXFLAGS_BUILD="$CXXFLAGS_RELEASE"
+CXXFLAGS_BUILD="$CXXFLAGS_RELEASE $OPTFLAGS_RELEASE"
+LDFLAGS_BUILD="$LDFLAGS_RELEASE $OPTFLAGS_RELEASE"
 SV_DEFINES_BUILD="$SV_DEFINES_RELEASE"
 
 QMAKE_CONFIG="release"
 
 AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug],[enable debug support [default=no]])],[AC_MSG_NOTICE([enabling debug build])
 QMAKE_CONFIG="debug"
-CXXFLAGS_BUILD="$CXXFLAGS_DEBUG"
-SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"])
+CXXFLAGS_BUILD="$CXXFLAGS_DEBUG $OPTFLAGS_DEBUG"
+LDFLAGS_BUILD="$LDFLAGS_DEBUG"
+SV_DEFINES_BUILD="$SV_DEFINES_DEBUG"
+LIBS="$LIBS_DEBUG"])
 
 if test x"$USER_CXXFLAGS" != x; then
    	AC_MSG_NOTICE([The CXXFLAGS environment variable is set to "$USER_CXXFLAGS".])
 	AC_MSG_NOTICE(Overriding default compiler flags with the above user setting.)
 	CXXFLAGS_BUILD="$USER_CXXFLAGS"
-	CXXFLAGS_MINIMAL="$USER_CXXFLAGS"
+        LDFLAGS_BUILD=""
 fi
 
 CXXFLAGS="$CXXFLAGS_BUILD $SV_DEFINES_BUILD"
+LDFLAGS="$LDFLAGS_BUILD"
 
 SV_MODULE_REQUIRED([bz2],[],[bzlib.h],[bz2],[BZ2_bzReadOpen])
 SV_MODULE_REQUIRED([fftw3],[fftw3 >= 3.0.0],[fftw3.h],[fftw3],[fftw_execute])
@@ -92,6 +103,7 @@
 SV_MODULE_OPTIONAL([fishsound],[fishsound >= 1.0.0],[fishsound/fishsound.h],[fishsound],[fish_sound_new])
 SV_MODULE_OPTIONAL([mad],[mad >= 0.15.0],[mad.h],[mad],[mad_decoder_init])
 SV_MODULE_OPTIONAL([id3tag],[id3tag >= 0.15.0],[id3tag.h],[id3tag],[id3_tag_new])
+SV_MODULE_OPTIONAL([opus],[opusfile],[opus/opusfile.h],[opusfile],[op_read_float])
 
 AC_SUBST(PERL)
 AC_SUBST(XARGS)
@@ -101,7 +113,7 @@
 
 AC_SUBST(CFLAGS)
 AC_SUBST(CXXFLAGS)
-AC_SUBST(CXXFLAGS_MINIMAL)
+AC_SUBST(CXXSTANDARD)
 AC_SUBST(LDFLAGS)
 AC_SUBST(HAVES)
 AC_SUBST(LIBS)
@@ -109,6 +121,8 @@
 AC_SUBST(CC)
 AC_SUBST(CXX)
 
+AC_SUBST(prefix)
+
 AC_SUBST(QMAKE_CONFIG)
 
 AC_CONFIG_FILES([config.pri])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/win/build-32.bat	Thu Jul 18 14:58:51 2019 +0100
@@ -0,0 +1,42 @@
+rem  Run this from within the top-level SV dir: deploy\win64\build-32.bat
+rem  To build from clean, delete the folder build_win32
+
+set STARTPWD=%CD%
+
+set QTDIR=C:\Qt\5.11.2\mingw53_32
+if not exist %QTDIR% (
+@   echo Could not find 32-bit Qt
+@   exit /b 2
+)
+
+set ORIGINALPATH=%PATH%
+set PATH=%PATH%;C:\Program Files (x86)\SMLNJ\bin;%QTDIR%\bin;C:\Qt\Tools\QtCreator\bin;C:\Qt\Tools\mingw530_32\bin
+
+cd %STARTPWD%
+
+call .\repoint install
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+mkdir build_win32
+cd build_win32
+
+qmake -spec win32-g++ -r ..\sonic-annotator.pro
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+mingw32-make
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+copy %QTDIR%\bin\Qt5Core.dll .\release
+copy %QTDIR%\bin\Qt5Network.dll .\release
+copy %QTDIR%\bin\Qt5Xml.dll .\release
+copy %QTDIR%\bin\Qt5Test.dll .\release
+copy %QTDIR%\bin\libgcc_s_dw2-1.dll .\release
+copy %QTDIR%\bin\"libstdc++-6.dll" .\release
+copy %QTDIR%\bin\libwinpthread-1.dll .\release
+copy %QTDIR%\plugins\platforms\qminimal.dll .\release
+copy %QTDIR%\plugins\platforms\qwindows.dll .\release
+
+.\release\test-svcore-base
+.\release\test-svcore-system
+
+set PATH=%ORIGINALPATH%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/win/build-64.bat	Thu Jul 18 14:58:51 2019 +0100
@@ -0,0 +1,49 @@
+rem  Run this from within the top-level SV dir: deploy\win64\build-64.bat
+rem  To build from clean, delete the folder build_win64 first
+
+echo on
+
+set STARTPWD=%CD%
+
+set QTDIR=C:\Qt\5.11.2\msvc2017_64
+if not exist %QTDIR% (
+@   echo Could not find 64-bit Qt
+@   exit /b 2
+)
+
+if not exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" (
+@   echo "Could not find MSVC vars batch file"
+@   exit /b 2
+)
+
+call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
+
+set ORIGINALPATH=%PATH%
+set PATH=%PATH%;C:\Program Files (x86)\SMLNJ\bin;%QTDIR%\bin
+
+cd %STARTPWD%
+
+call .\repoint install
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+mkdir build_win64
+cd build_win64
+
+qmake -spec win32-msvc -r -tp vc ..\sonic-annotator.pro
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+msbuild sonic-annotator.sln /t:Build /p:Configuration=Release
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+copy %QTDIR%\bin\Qt5Core.dll .\release
+copy %QTDIR%\bin\Qt5Network.dll .\release
+copy %QTDIR%\bin\Qt5Xml.dll .\release
+copy %QTDIR%\bin\Qt5Test.dll .\release
+copy %QTDIR%\plugins\platforms\qminimal.dll .\release
+copy %QTDIR%\plugins\platforms\qwindows.dll .\release
+copy ..\sv-dependency-builds\win64-msvc\lib\libsndfile-1.dll .\release
+
+.\release\test-svcore-base
+.\release\test-svcore-system
+
+set PATH=%ORIGINALPATH%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/win/build-both.bat	Thu Jul 18 14:58:51 2019 +0100
@@ -0,0 +1,31 @@
+rem  Run this from within the top-level dir: deploy\win\build-and-package.bat
+
+set STARTPWD=%CD%
+
+if not exist "C:\Program Files (x86)\SMLNJ\bin" (
+@   echo Could not find SML/NJ, required for Repoint
+@   exit /b 2
+)
+
+set ORIGINALPATH=%PATH%
+set PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin;%PATH%
+
+@echo ""
+@echo Rebuilding 32-bit
+
+cd %STARTPWD%
+del /q /s build_win32
+call .\deploy\win\build-32.bat
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+@echo Rebuilding 64-bit
+
+cd %STARTPWD%
+del /q /s build_win64
+call .\deploy\win\build-64.bat
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+set PATH=%ORIGINALPATH%
+
+@echo Done
+
--- a/deploy/win64/build-32.bat	Fri Sep 14 14:55:24 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-rem  Run this from within the top-level SV dir: deploy\win64\build-32.bat
-rem  To build from clean, delete the folder build_win32
-
-set STARTPWD=%CD%
-
-set QTDIR=C:\Qt\5.11.0\mingw53_32
-if not exist %QTDIR% (
-@   echo Could not find 32-bit Qt
-@   exit /b 2
-)
-
-set ORIGINALPATH=%PATH%
-set PATH=%PATH%;C:\Program Files (x86)\SMLNJ\bin;%QTDIR%\bin;C:\Qt\Tools\QtCreator\bin;C:\Qt\Tools\mingw530_32\bin
-
-cd %STARTPWD%
-
-call .\repoint install
-if %errorlevel% neq 0 exit /b %errorlevel%
-
-mkdir build_win32
-cd build_win32
-
-qmake -spec win32-g++ -r ..\sonic-annotator.pro
-if %errorlevel% neq 0 exit /b %errorlevel%
-
-mingw32-make
-if %errorlevel% neq 0 exit /b %errorlevel%
-
-copy %QTDIR%\bin\Qt5Core.dll .\release
-copy %QTDIR%\bin\Qt5Network.dll .\release
-copy %QTDIR%\bin\Qt5Xml.dll .\release
-copy %QTDIR%\bin\Qt5Test.dll .\release
-copy %QTDIR%\bin\libgcc_s_dw2-1.dll .\release
-copy %QTDIR%\bin\"libstdc++-6.dll" .\release
-copy %QTDIR%\bin\libwinpthread-1.dll .\release
-copy %QTDIR%\plugins\platforms\qminimal.dll .\release
-copy %QTDIR%\plugins\platforms\qwindows.dll .\release
-
-.\release\test-svcore-base
-.\release\test-svcore-system
-.\release\test-svcore-data-fileio
-
-set PATH=%ORIGINALPATH%
--- a/deploy/win64/build-64.bat	Fri Sep 14 14:55:24 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-rem  Run this from within the top-level SV dir: deploy\win64\build-64.bat
-rem  To build from clean, delete the folder build_win64 first
-
-echo on
-
-set STARTPWD=%CD%
-
-set QTDIR=C:\Qt\5.11.0\msvc2017_64
-if not exist %QTDIR% (
-@   echo Could not find 64-bit Qt
-@   exit /b 2
-)
-
-if not exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" (
-@   echo "Could not find MSVC vars batch file"
-@   exit /b 2
-)
-
-call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
-
-set ORIGINALPATH=%PATH%
-set PATH=%PATH%;C:\Program Files (x86)\SMLNJ\bin;%QTDIR%\bin
-
-cd %STARTPWD%
-
-call .\repoint install
-if %errorlevel% neq 0 exit /b %errorlevel%
-
-mkdir build_win64
-cd build_win64
-
-qmake -spec win32-msvc -r -tp vc ..\sonic-annotator.pro
-if %errorlevel% neq 0 exit /b %errorlevel%
-
-msbuild sonic-annotator.sln /t:Build /p:Configuration=Release
-if %errorlevel% neq 0 exit /b %errorlevel%
-
-copy %QTDIR%\bin\Qt5Core.dll .\release
-copy %QTDIR%\bin\Qt5Network.dll .\release
-copy %QTDIR%\bin\Qt5Xml.dll .\release
-copy %QTDIR%\bin\Qt5Test.dll .\release
-copy %QTDIR%\plugins\platforms\qminimal.dll .\release
-copy %QTDIR%\plugins\platforms\qwindows.dll .\release
-copy ..\sv-dependency-builds\win64-msvc\lib\libsndfile-1.dll .\release
-
-.\release\test-svcore-base
-.\release\test-svcore-system
-.\release\test-svcore-data-fileio
-
-set PATH=%ORIGINALPATH%
--- a/noconfig.pri	Fri Sep 14 14:55:24 2018 +0100
+++ b/noconfig.pri	Thu Jul 18 14:58:51 2019 +0100
@@ -1,8 +1,10 @@
+
+CONFIG += c++14
 
 CONFIG += release
+#CONFIG += debug
 
-#CONFIG -= release
-#CONFIG += debug
+PREFIX_PATH = /usr/local
 
 DEFINES += NDEBUG BUILD_RELEASE
 DEFINES += NO_TIMING
@@ -17,8 +19,9 @@
 	HAVE_SNDFILE \
 	HAVE_SAMPLERATE \
 	HAVE_MAD \
-	HAVE_ID3TAG
-        
+	HAVE_ID3TAG \
+	HAVE_OPUS
+
 # Default set of libs for the above. Config sections below may update
 # these.
 
@@ -34,6 +37,8 @@
 	-lvorbis \
 	-lvorbisenc \
 	-lvorbisfile \
+	-lopusfile \
+	-lopus \
 	-logg \
 	-lmad \
 	-lid3tag \
@@ -46,7 +51,7 @@
 
     # This config is currently used for 32-bit Windows builds.
 
-    INCLUDEPATH += $$PWD/sv-dependency-builds/win32-mingw/include
+    INCLUDEPATH += $$PWD/sv-dependency-builds/win32-mingw/include $$PWD/sv-dependency-builds/win32-mingw/include/opus
 
     LIBS += -Lrelease -L$$PWD/sv-dependency-builds/win32-mingw/lib
 
@@ -54,6 +59,8 @@
 
     QMAKE_CXXFLAGS_RELEASE += -ffast-math
     
+    # (We don't have MediaFoundation support, with this build sadly)
+    
     LIBS += -lwinmm -lws2_32
 }
 
@@ -64,38 +71,39 @@
     # we want to do 32-bit builds with MSVC as well, then we'll
     # need to add a way to distinguish the two.
     
-    INCLUDEPATH += $$PWD/sv-dependency-builds/win64-msvc/include
+    INCLUDEPATH += $$PWD/sv-dependency-builds/win64-msvc/include $$PWD/sv-dependency-builds/win64-msvc/include/opus
 
     CONFIG(release) {
-        LIBS += -Lrelease \
+        LIBS += -NODEFAULTLIB:LIBCMT -Lrelease \
             -L$$PWD/sv-dependency-builds/win64-msvc/lib
     }
 
-    DEFINES += NOMINMAX _USE_MATH_DEFINES
+    DEFINES += NOMINMAX _USE_MATH_DEFINES HAVE_MEDIAFOUNDATION
 
     QMAKE_CXXFLAGS_RELEASE += -fp:fast -gl
     QMAKE_LFLAGS_RELEASE += -ltcg
 
     # No Ogg/FLAC support in the sndfile build on this platform yet
-    LIBS -= -lFLAC -logg -lvorbis -lvorbisenc -lvorbisfile
+    LIBS -= -lFLAC -lvorbis -lvorbisenc -lvorbisfile
 
     # These have different names
     LIBS -= -lsord-0 -lserd-0
     LIBS += -lsord -lserd
     
-    LIBS += -ladvapi32 -lwinmm -lws2_32
+    LIBS += -lmfplat -lmfreadwrite -lmfuuid -lpropsys -ladvapi32 -lwinmm -lws2_32
 }
 
 macx* {
 
     # All Mac builds are 64-bit these days.
 
-    INCLUDEPATH += $$PWD/sv-dependency-builds/osx/include
+    INCLUDEPATH += $$PWD/sv-dependency-builds/osx/include $$PWD/sv-dependency-builds/osx/include/opus
     LIBS += -L$$PWD/sv-dependency-builds/osx/lib -L$$PWD
 
-    QMAKE_CXXFLAGS_RELEASE += -O3 -ffast-math
+    QMAKE_CXXFLAGS_RELEASE += -O3 -ffast-math -flto
+    QMAKE_LFLAGS_RELEASE += -O3 -flto
 
-    DEFINES += HAVE_VDSP
+    DEFINES += HAVE_COREAUDIO HAVE_VDSP
     LIBS += \
         -framework CoreAudio \
 	-framework CoreMidi \
--- a/repoint	Fri Sep 14 14:55:24 2018 +0100
+++ b/repoint	Thu Jul 18 14:58:51 2019 +0100
@@ -58,7 +58,7 @@
     # That is fixed in v5.7.1, so we could promote it up the order
     # again at some point in future
     elif echo | poly -v 2>/dev/null | grep -q 'Poly/ML'; then
-	sml="poly"
+	sml="polyml"
     elif mlton 2>&1 | grep -q 'MLton'; then
 	sml="mlton"
     # MLKit is at the bottom because it leaves compiled files around
@@ -109,7 +109,7 @@
 done
 
 case "$sml" in
-    poly)
+    polyml)
         if [ -n "$local_install" ] && polyc --help >/dev/null 2>&1 ; then
             if [ ! -x "$gen_out" ]; then
                 polyc -o "$gen_out" "$program"
--- a/repoint-lock.json	Fri Sep 14 14:55:24 2018 +0100
+++ b/repoint-lock.json	Thu Jul 18 14:58:51 2019 +0100
@@ -1,31 +1,37 @@
 {
   "libraries": {
     "vamp-plugin-sdk": {
-      "pin": "da86fb0bccb3"
+      "pin": "62987b6d6a3b"
     },
     "svcore": {
-      "pin": "a92e94215863"
+      "pin": "9a8327e7b2dc"
     },
     "checker": {
-      "pin": "2e8a5f665a07"
+      "pin": "c8c17e51aab0"
     },
-    "piper-cpp": {
-      "pin": "44cb74e186a703e7e6ce403aa295913a87b88d62"
+    "piper-vamp-cpp": {
+      "pin": "0e3328c6091f59c912e25bc392a7dc75182be1c7"
     },
     "dataquay": {
-      "pin": "807b55408d9e"
+      "pin": "b82360a98f49"
     },
     "bqvec": {
-      "pin": "3c9de9e7f6e8"
+      "pin": "c2d355c29372"
     },
     "bqfft": {
-      "pin": "a766fe47501b"
+      "pin": "ff1d1bd48876"
     },
     "bqresample": {
-      "pin": "a9a5555d9b6d"
+      "pin": "f5dee7d40378"
+    },
+    "bqthingfactory": {
+      "pin": "7686116dcdd5"
+    },
+    "bqaudiostream": {
+      "pin": "e3a6c41e042f"
     },
     "sv-dependency-builds": {
-      "pin": "f1a9b270e043"
+      "pin": "f3731af47c4b"
     }
   }
 }
--- a/repoint-project.json	Fri Sep 14 14:55:24 2018 +0100
+++ b/repoint-project.json	Thu Jul 18 14:58:51 2019 +0100
@@ -23,11 +23,10 @@
 	    "service": "soundsoftware",
 	    "repository": "vamp-plugin-load-checker"
         },
-        "piper-cpp": {
+        "piper-vamp-cpp": {
             "vcs": "git",
 	    "service": "github",
-	    "owner": "piper-audio",
-            "repository": "piper-vamp-cpp"
+	    "owner": "piper-audio"
         },
         "dataquay": {
             "vcs": "hg",
@@ -49,6 +48,16 @@
             "service": "bitbucket",
             "owner": "breakfastquay"
         },
+        "bqthingfactory": {
+            "vcs": "hg",
+            "service": "bitbucket",
+            "owner": "breakfastquay"
+        },
+        "bqaudiostream": {
+            "vcs": "hg",
+            "service": "bitbucket",
+            "owner": "breakfastquay"
+        },
         "sv-dependency-builds": {
             "vcs": "hg",
 	    "service": "soundsoftware"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/repoint.pri	Thu Jul 18 14:58:51 2019 +0100
@@ -0,0 +1,7 @@
+
+repoint.target = $$PWD/.repoint.point
+repoint.depends = $$PWD/repoint-project.json $$PWD/repoint-lock.json
+repoint.commands = $$PWD/repoint install --directory $$PWD
+
+QMAKE_EXTRA_TARGETS += repoint
+PRE_TARGETDEPS += $$repoint.target
--- a/repoint.sml	Fri Sep 14 14:55:24 2018 +0100
+++ b/repoint.sml	Thu Jul 18 14:58:51 2019 +0100
@@ -38,7 +38,7 @@
     authorization.
 *)
 
-val repoint_version = "0.9.98"
+val repoint_version = "1.1"
 
 
 datatype vcs =
@@ -136,6 +136,7 @@
 structure RepointFilenames = struct
     val project_file = "repoint-project.json"
     val project_lock_file = "repoint-lock.json"
+    val project_completion_file = ".repoint.point"
     val user_config_file = ".repoint.json"
     val archive_dir = ".repoint-archive"
 end
@@ -215,6 +216,7 @@
     val nonempty_dir_exists : string -> bool
     val project_spec_path : string -> string
     val project_lock_path : string -> string
+    val project_completion_path : string -> string
     val verbose : unit -> bool
 end = struct
 
@@ -272,6 +274,9 @@
     fun project_lock_path rootpath =
         project_file_path rootpath (RepointFilenames.project_lock_file)
 
+    fun project_completion_path rootpath =
+        project_file_path rootpath (RepointFilenames.project_completion_file)
+
     fun trim str =
         hd (String.fields (fn x => x = #"\n" orelse x = #"\r") str)
             
@@ -2420,7 +2425,14 @@
     in
         JsonBits.save_json_to lock_file lock_json
     end
-        
+
+fun checkpoint_completion_file rootpath =
+    let val completion_file = FileBits.project_completion_path rootpath
+        val stream = TextIO.openOut completion_file
+    in
+        TextIO.closeOut stream
+    end
+                                                               
 fun pad_to n str =
     if n <= String.size str then str
     else pad_to n (str ^ " ")
@@ -2586,8 +2598,12 @@
         val _ = if List.exists (fn (_, OK _) => true | _ => false) outcomes
                 then lock_project project
                 else OS.Process.success
+        val return_code = return_code_for outcomes
     in
-        return_code_for outcomes
+        if OS.Process.isSuccess return_code
+        then checkpoint_completion_file (#rootpath context)
+        else ();
+        return_code
     end
     
 fun load_local_project pintype =
@@ -2625,18 +2641,23 @@
 fun usage () =
     (print "\nRepoint ";
      version ();
-     print ("\nA simple manager for third-party source code dependencies.\n\n"
+     print ("\n  A simple manager for third-party source code dependencies.\n"
+            ^ "  http://all-day-breakfast.com/repoint/\n\n"
             ^ "Usage:\n\n"
-            ^ "  repoint <command>\n\n"
+            ^ "  repoint <command> [<options>]\n\n"
             ^ "where <command> is one of:\n\n"
             ^ "  status   print quick report on local status only, without using network\n"
             ^ "  review   check configured libraries against their providers, and report\n"
             ^ "  install  update configured libraries according to project specs and lock file\n"
             ^ "  update   update configured libraries and lock file according to project specs\n"
-            ^ "  lock     update lock file to match local library status\n"
-            ^ "  archive  pack up project and all libraries into an archive file\n"
-            ^ "           (invoke as 'repoint archive target-file.tar.gz')\n"
-            ^ "  version  print the Repoint version number and exit\n\n");
+            ^ "  lock     rewrite lock file to match local library status\n"
+            ^ "  archive  pack up project and all libraries into an archive file:\n"
+            ^ "           invoke as 'repoint archive targetfile.tar.gz --exclude unwanted.txt'\n"
+            ^ "  version  print the Repoint version number and exit\n\n"
+            ^ "and <options> may include:\n\n"
+            ^ "  --directory <dir>\n"
+            ^ "           change to directory <dir> before doing anything; in particular,\n"
+            ^ "           expect to find project spec file in that directory\n\n");
     OS.Process.failure)
 
 fun archive target args =
@@ -2647,8 +2668,26 @@
         with_local_project USE_LOCKFILE (Archive.archive (target, xs))
       | _ => usage ()
 
+fun handleSystemArgs args =
+    let fun handleSystemArgs' leftover args =
+            case args of
+                "--directory"::dir::rest =>
+                (OS.FileSys.chDir dir;
+                 handleSystemArgs' leftover rest)
+              | arg::rest =>
+                handleSystemArgs' (leftover @ [arg]) rest
+              | [] => leftover
+    in
+        OK (handleSystemArgs' [] args)
+        handle e => ERROR (exnMessage e)
+    end
+                   
 fun repoint args =
-    let val return_code = 
+    case handleSystemArgs args of
+        ERROR e => (print ("Error: " ^ e ^ "\n");
+                    OS.Process.exit OS.Process.failure)
+      | OK args => 
+        let val return_code = 
             case args of
                 ["review"] => review ()
               | ["status"] => status ()
@@ -2660,10 +2699,9 @@
               | arg::_ => (print ("Error: unknown argument \"" ^ arg ^ "\"\n");
                            usage ())
               | _ => usage ()
-    in
-        OS.Process.exit return_code;
-        ()
-    end
+        in
+            OS.Process.exit return_code
+        end
         
 fun main () =
     repoint (CommandLine.arguments ())
--- a/runner/MIDIFeatureWriter.h	Fri Sep 14 14:55:24 2018 +0100
+++ b/runner/MIDIFeatureWriter.h	Thu Jul 18 14:58:51 2019 +0100
@@ -14,11 +14,12 @@
     COPYING included with this distribution for more information.
 */
 
-#ifndef _MIDI_FEATURE_WRITER_H_
-#define _MIDI_FEATURE_WRITER_H_
+#ifndef MIDI_FEATURE_WRITER_H
+#define MIDI_FEATURE_WRITER_H
 
 #include "transform/FileFeatureWriter.h"
-#include "data/model/NoteData.h"
+#include "base/NoteData.h"
+#include "base/NoteExportable.h"
 
 class MIDIFileWriter;
 
@@ -52,7 +53,11 @@
 	virtual NoteList getNotes() const {
 	    return m_notes;
 	}
-	virtual NoteList getNotesWithin(sv_frame_t, sv_frame_t) const {
+	virtual NoteList getNotesActiveAt(sv_frame_t) const {
+	    // Not required by MIDIFileWriter, not supported
+	    return NoteList();
+	}
+	virtual NoteList getNotesStartingWithin(sv_frame_t, sv_frame_t) const {
 	    // Not required by MIDIFileWriter, not supported
 	    return NoteList();
 	}
--- a/runner/MultiplexedReader.h	Fri Sep 14 14:55:24 2018 +0100
+++ b/runner/MultiplexedReader.h	Thu Jul 18 14:58:51 2019 +0100
@@ -33,6 +33,9 @@
     virtual QString getError() const override { return m_error; }
     virtual bool isQuicklySeekable() const override { return m_quicklySeekable; }
 
+    virtual QString getTitle() const override { return ""; }
+    virtual QString getMaker() const override { return ""; }
+
     virtual floatvec_t getInterleavedFrames
     (sv_frame_t start, sv_frame_t count) const override;