Hello community,

here is the log from the commit of package libopenmpt for openSUSE:Factory 
checked in at 2019-04-10 23:10:02
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libopenmpt (Old)
 and      /work/SRC/openSUSE:Factory/.libopenmpt.new.27019 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libopenmpt"

Wed Apr 10 23:10:02 2019 rev:18 rq:692149 version:0.4.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/libopenmpt/libopenmpt.changes    2019-02-24 
16:58:34.184818177 +0100
+++ /work/SRC/openSUSE:Factory/.libopenmpt.new.27019/libopenmpt.changes 
2019-04-10 23:10:03.507896384 +0200
@@ -1,0 +2,13 @@
+Sun Apr  7 15:29:38 UTC 2019 - Martin Herkt <9+suse@cirno.systems>
+
+- Update to version 0.4.4:
+  * [Bug] Channel VU meters were swapped.
+  * Startrekker: Clamp speed to 31 ticks per row.
+  * MTM: Ignore unused Exy commands on import.
+    Command E5x (Set Finetune) is now applied correctly.
+  * MOD: Sample swapping was always enabled since it has been
+    separated from the ProTracker 1/2 compatibility flag. Now it is
+    always enabled for Amiga-style modules and otherwise the old
+    heuristic is used again.
+
+-------------------------------------------------------------------

Old:
----
  libopenmpt-0.4.3+release.autotools.tar.gz

New:
----
  libopenmpt-0.4.4+release.autotools.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libopenmpt.spec ++++++
--- /var/tmp/diff_new_pack.pchnz8/_old  2019-04-10 23:10:04.151897115 +0200
+++ /var/tmp/diff_new_pack.pchnz8/_new  2019-04-10 23:10:04.155897120 +0200
@@ -21,7 +21,7 @@
 %define libopenmpt_modplug libopenmpt_modplug1
 %bcond_without mpg123
 Name:           libopenmpt
-Version:        0.4.3
+Version:        0.4.4
 Release:        0
 Summary:        C++ and C library to decode tracker music files
 License:        BSD-3-Clause

++++++ libopenmpt-0.4.3+release.autotools.tar.gz -> 
libopenmpt-0.4.4+release.autotools.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.3+release.autotools/Doxyfile.in 
new/libopenmpt-0.4.4+release.autotools/Doxyfile.in
--- old/libopenmpt-0.4.3+release.autotools/Doxyfile.in  2019-02-11 
06:39:59.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/Doxyfile.in  2019-04-07 
15:30:29.000000000 +0200
@@ -784,9 +784,12 @@
                          README.md \
                          libopenmpt/dox/dependencies.md \
                          libopenmpt/dox/packaging.md \
+                         doc/contributing.md \
+                         doc/libopenmpt_styleguide.md \
                          libopenmpt/dox/tests.md \
                          libopenmpt/dox/changelog.md \
                          libopenmpt/dox/todo.md \
+                         doc/module_formats.md \
                          libopenmpt/libopenmpt.hpp \
                          libopenmpt/libopenmpt.h \
                          libopenmpt/libopenmpt_stream_callbacks_buffer.h \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.3+release.autotools/Makefile.am 
new/libopenmpt-0.4.4+release.autotools/Makefile.am
--- old/libopenmpt-0.4.3+release.autotools/Makefile.am  2018-11-03 
09:00:04.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/Makefile.am  2019-02-28 
14:37:59.000000000 +0100
@@ -6,6 +6,9 @@
 EXTRA_DIST += LICENSE
 EXTRA_DIST += README.md
 EXTRA_DIST += Doxyfile.in
+EXTRA_DIST += doc/contributing.md
+EXTRA_DIST += doc/libopenmpt_styleguide.md
+EXTRA_DIST += doc/module_formats.md
 EXTRA_DIST += libopenmpt/dox/changelog.md
 EXTRA_DIST += libopenmpt/dox/dependencies.md
 EXTRA_DIST += libopenmpt/dox/index.dox
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.3+release.autotools/Makefile.in 
new/libopenmpt-0.4.4+release.autotools/Makefile.in
--- old/libopenmpt-0.4.3+release.autotools/Makefile.in  2019-02-11 
06:40:09.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/Makefile.in  2019-04-07 
15:30:40.000000000 +0200
@@ -1227,12 +1227,13 @@
 ACLOCAL_AMFLAGS = -I m4 --install
 EXTRA_DIST = m4/emptydir libopenmpt/libopenmpt.pc.in \
        libmodplug/libmodplug.pc.in LICENSE README.md Doxyfile.in \
-       libopenmpt/dox/changelog.md libopenmpt/dox/dependencies.md \
-       libopenmpt/dox/index.dox libopenmpt/dox/packaging.md \
-       libopenmpt/dox/quickstart.md libopenmpt/dox/tests.md \
-       libopenmpt/dox/todo.md libopenmpt/libopenmpt_version.mk \
-       test/test.xm test/test.s3m test/test.mptm man/openmpt123.1 \
-       examples/.clang-format \
+       doc/contributing.md doc/libopenmpt_styleguide.md \
+       doc/module_formats.md libopenmpt/dox/changelog.md \
+       libopenmpt/dox/dependencies.md libopenmpt/dox/index.dox \
+       libopenmpt/dox/packaging.md libopenmpt/dox/quickstart.md \
+       libopenmpt/dox/tests.md libopenmpt/dox/todo.md \
+       libopenmpt/libopenmpt_version.mk test/test.xm test/test.s3m \
+       test/test.mptm man/openmpt123.1 examples/.clang-format \
        libopenmpt/bindings/freebasic/libopenmpt.bi
 MOSTLYCLEANFILES = $(DX_CLEANFILES)
 dist_doc_DATA = LICENSE README.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.3+release.autotools/README.md 
new/libopenmpt-0.4.4+release.autotools/README.md
--- old/libopenmpt-0.4.3+release.autotools/README.md    2018-10-13 
13:53:55.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/README.md    2019-02-28 
13:58:57.000000000 +0100
@@ -1,3 +1,8 @@
+
+README
+======
+
+
 OpenMPT and libopenmpt
 ======================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/common/mptExceptionText.h 
new/libopenmpt-0.4.4+release.autotools/common/mptExceptionText.h
--- old/libopenmpt-0.4.3+release.autotools/common/mptExceptionText.h    
2018-07-16 14:07:14.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/common/mptExceptionText.h    
2019-03-27 11:06:44.000000000 +0100
@@ -28,7 +28,7 @@
 namespace mpt
 {
 
-template <typename T> T get_exception_text_impl(const std::exception & e) 
noexcept
+template <typename T> T get_exception_text_impl(const std::exception & e)
 {
        if(e.what() && (std::strlen(e.what()) > 0))
        {
@@ -42,28 +42,28 @@
        }
 }
 
-template <typename T> inline T get_exception_text(const std::exception & e) 
noexcept
+template <typename T> inline T get_exception_text(const std::exception & e)
 {
        return mpt::get_exception_text_impl<T>(e);
 }
-template <> inline std::string get_exception_text<std::string>(const 
std::exception & e) noexcept
+template <> inline std::string get_exception_text<std::string>(const 
std::exception & e)
 {
        return mpt::get_exception_text_impl<std::string>(e);
 }
 #if defined(MPT_ENABLE_CHARSET_LOCALE)
-template <> inline mpt::lstring get_exception_text<mpt::lstring>(const 
std::exception & e) noexcept
+template <> inline mpt::lstring get_exception_text<mpt::lstring>(const 
std::exception & e)
 {
        return mpt::ToLocale(mpt::CharsetLocaleOrUTF8, 
mpt::get_exception_text_impl<std::string>(e));
 }
 #endif
 #if MPT_WSTRING_FORMAT
-template <> inline std::wstring get_exception_text<std::wstring>(const 
std::exception & e) noexcept
+template <> inline std::wstring get_exception_text<std::wstring>(const 
std::exception & e)
 {
        return mpt::ToWide(mpt::CharsetLocaleOrUTF8, 
mpt::get_exception_text_impl<std::string>(e));
 }
 #endif
 #if MPT_USTRING_MODE_UTF8
-template <> inline mpt::ustring get_exception_text<mpt::ustring>(const 
std::exception & e) noexcept
+template <> inline mpt::ustring get_exception_text<mpt::ustring>(const 
std::exception & e)
 {
        return mpt::ToUnicode(mpt::CharsetLocaleOrUTF8, 
mpt::get_exception_text_impl<std::string>(e));
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/common/mptPathString.cpp 
new/libopenmpt-0.4.4+release.autotools/common/mptPathString.cpp
--- old/libopenmpt-0.4.3+release.autotools/common/mptPathString.cpp     
2018-12-06 15:29:05.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/common/mptPathString.cpp     
2019-03-11 13:37:56.000000000 +0100
@@ -224,6 +224,14 @@
        {
                if(fname) *fname = mpt::PathString::FromNative(p);
                if(ext) *ext = mpt::PathString();
+       } else if(last_dot == 0)
+       {
+               if(fname) *fname = mpt::PathString::FromNative(p);
+               if(ext) *ext = mpt::PathString();
+       } else if(p == PL_(".") || p == PL_(".."))
+       {
+               if(fname) *fname = mpt::PathString::FromNative(p);
+               if(ext) *ext = mpt::PathString();
        } else
        {
                if(fname) *fname = mpt::PathString::FromNative(p.substr(0, 
last_dot));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/common/mptString.h 
new/libopenmpt-0.4.4+release.autotools/common/mptString.h
--- old/libopenmpt-0.4.3+release.autotools/common/mptString.h   2018-09-15 
15:33:26.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/common/mptString.h   2019-03-04 
11:45:18.000000000 +0100
@@ -245,10 +245,17 @@
 #define MPT_LITERAL(x)   x
 #define MPT_STRING(x)    std::string( x )
 
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
 #define MPT_WCHAR_TYPE   wchar_t
 #define MPT_WCHAR(x)     L ## x
 #define MPT_WLITERAL(x)  L ## x
 #define MPT_WSTRING(x)   std::wstring( L ## x )
+#else // MPT_COMPILER_QUIRK_NO_WCHAR
+#define MPT_WCHAR_TYPE   char32_t
+#define MPT_WCHAR(x)     U ## x
+#define MPT_WLITERAL(x)  U ## x
+#define MPT_WSTRING(x)   std::u32string( U ## x )
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
 
 
 template <mpt::Charset charset_tag>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/common/mptStringBuffer.h 
new/libopenmpt-0.4.4+release.autotools/common/mptStringBuffer.h
--- old/libopenmpt-0.4.3+release.autotools/common/mptStringBuffer.h     
2018-07-16 14:07:14.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/common/mptStringBuffer.h     
2019-03-23 15:50:45.000000000 +0100
@@ -185,7 +185,6 @@
                , mode(mode)
        {
                MPT_STATIC_ASSERT(sizeof(Tchar) == 1);
-               MPT_ASSERT(size > 0);
        }
        StringModeBufRefImpl(const StringModeBufRefImpl &) = delete;
        StringModeBufRefImpl(StringModeBufRefImpl &&) = default;
@@ -218,7 +217,6 @@
                , mode(mode)
        {
                MPT_STATIC_ASSERT(sizeof(Tchar) == 1);
-               MPT_ASSERT(size > 0);
        }
        StringModeBufRefImpl(const StringModeBufRefImpl &) = delete;
        StringModeBufRefImpl(StringModeBufRefImpl &&) = default;
@@ -400,6 +398,8 @@
                buffer[size - 1] = 0;
        }
 
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
        template <size_t size>
        void SetNullTerminator(wchar_t (&buffer)[size])
        {
@@ -413,6 +413,8 @@
                buffer[size - 1] = 0;
        }
 
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
 
        // Remove any chars after the first null char
        template <size_t size>
@@ -633,6 +635,11 @@
        }
 
 
+#if MPT_GCC_AT_LEAST(8,1,0)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstringop-truncation"
+#endif
+
        // Copy from a char array to a fixed size char array.
        template <size_t destSize>
        void CopyN(char (&destBuffer)[destSize], const char *srcBuffer, const 
size_t srcSize = std::numeric_limits<size_t>::max())
@@ -676,6 +683,10 @@
                dest.assign(src);
        }
 
+#if MPT_GCC_AT_LEAST(8,1,0)
+#pragma GCC diagnostic pop
+#endif
+
 
 #if MPT_COMPILER_MSVC
 #pragma warning(pop)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/common/versionNumber.h 
new/libopenmpt-0.4.4+release.autotools/common/versionNumber.h
--- old/libopenmpt-0.4.3+release.autotools/common/versionNumber.h       
2019-02-10 21:01:40.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/common/versionNumber.h       
2019-04-07 14:34:32.000000000 +0200
@@ -20,7 +20,7 @@
 //Version definitions. The only thing that needs to be changed when changing 
version number.
 #define VER_MAJORMAJOR  1
 #define VER_MAJOR      28
-#define VER_MINOR      03
+#define VER_MINOR      04
 #define VER_MINORMINOR 00
 
 //Numerical value of the version.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.3+release.autotools/configure 
new/libopenmpt-0.4.4+release.autotools/configure
--- old/libopenmpt-0.4.3+release.autotools/configure    2019-02-11 
06:40:08.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/configure    2019-04-07 
15:30:39.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for libopenmpt 0.4.3+release.autotools.
+# Generated by GNU Autoconf 2.69 for libopenmpt 0.4.4+release.autotools.
 #
 # Report bugs to <https://bugs.openmpt.org/>.
 #
@@ -590,8 +590,8 @@
 # Identity of this package.
 PACKAGE_NAME='libopenmpt'
 PACKAGE_TARNAME='libopenmpt'
-PACKAGE_VERSION='0.4.3+release.autotools'
-PACKAGE_STRING='libopenmpt 0.4.3+release.autotools'
+PACKAGE_VERSION='0.4.4+release.autotools'
+PACKAGE_STRING='libopenmpt 0.4.4+release.autotools'
 PACKAGE_BUGREPORT='https://bugs.openmpt.org/'
 PACKAGE_URL='https://lib.openmpt.org/'
 
@@ -1485,7 +1485,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 libopenmpt 0.4.3+release.autotools to adapt to many 
kinds of systems.
+\`configure' configures libopenmpt 0.4.4+release.autotools to adapt to many 
kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1556,7 +1556,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of libopenmpt 
0.4.3+release.autotools:";;
+     short | recursive ) echo "Configuration of libopenmpt 
0.4.4+release.autotools:";;
    esac
   cat <<\_ACEOF
 
@@ -1756,7 +1756,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-libopenmpt configure 0.4.3+release.autotools
+libopenmpt configure 0.4.4+release.autotools
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2246,7 +2246,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by libopenmpt $as_me 0.4.3+release.autotools, which was
+It was created by libopenmpt $as_me 0.4.4+release.autotools, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3117,7 +3117,7 @@
 
 # Define the identity of the package.
  PACKAGE='libopenmpt'
- VERSION='0.4.3+release.autotools'
+ VERSION='0.4.4+release.autotools'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -17281,13 +17281,13 @@
 
 
 
-$as_echo "#define MPT_SVNURL 
\"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.4.3\""; >>confdefs.h
+$as_echo "#define MPT_SVNURL 
\"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.4.4\""; >>confdefs.h
 
 
-$as_echo "#define MPT_SVNVERSION \"11358\"" >>confdefs.h
+$as_echo "#define MPT_SVNVERSION \"11531\"" >>confdefs.h
 
 
-$as_echo "#define MPT_SVNDATE \"2019-02-11T05:32:52.673531Z\"" >>confdefs.h
+$as_echo "#define MPT_SVNDATE \"2019-04-07T13:13:38.985151Z\"" >>confdefs.h
 
 
 $as_echo "#define MPT_PACKAGE true" >>confdefs.h
@@ -23527,7 +23527,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by libopenmpt $as_me 0.4.3+release.autotools, which was
+This file was extended by libopenmpt $as_me 0.4.4+release.autotools, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -23594,7 +23594,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-libopenmpt config.status 0.4.3+release.autotools
+libopenmpt config.status 0.4.4+release.autotools
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.3+release.autotools/configure.ac 
new/libopenmpt-0.4.4+release.autotools/configure.ac
--- old/libopenmpt-0.4.3+release.autotools/configure.ac 2019-02-11 
06:39:59.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/configure.ac 2019-04-07 
15:30:29.000000000 +0200
@@ -1,4 +1,4 @@
-AC_INIT([libopenmpt], [0.4.3+release.autotools], [https://bugs.openmpt.org/], 
[libopenmpt], [https://lib.openmpt.org/])
+AC_INIT([libopenmpt], [0.4.4+release.autotools], [https://bugs.openmpt.org/], 
[libopenmpt], [https://lib.openmpt.org/])
 AC_PREREQ([2.68])
 
 AC_CONFIG_MACRO_DIR([m4])
@@ -27,9 +27,9 @@
 AC_SUBST([LIBOPENMPT_LTVER_REVISION])
 AC_SUBST([LIBOPENMPT_LTVER_AGE])
 
-AC_DEFINE([MPT_SVNURL], 
["https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.4.3";], [svn version])
-AC_DEFINE([MPT_SVNVERSION], ["11358"], [svn version])
-AC_DEFINE([MPT_SVNDATE], ["2019-02-11T05:32:52.673531Z"], [svn date])
+AC_DEFINE([MPT_SVNURL], 
["https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.4.4";], [svn version])
+AC_DEFINE([MPT_SVNVERSION], ["11531"], [svn version])
+AC_DEFINE([MPT_SVNDATE], ["2019-04-07T13:13:38.985151Z"], [svn date])
 AC_DEFINE([MPT_PACKAGE], [true], [is package])
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/doc/contributing.md 
new/libopenmpt-0.4.4+release.autotools/doc/contributing.md
--- old/libopenmpt-0.4.3+release.autotools/doc/contributing.md  1970-01-01 
01:00:00.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/doc/contributing.md  2018-02-10 
01:09:26.000000000 +0100
@@ -0,0 +1,43 @@
+
+Contributing
+============
+
+OpenMPT, libopenmpt, openmpt123, xmp-openmpt, in_openmpt and foo_openmpt are
+developed in the Subversion repository at
+[https://source.openmpt.org/browse/openmpt/trunk/OpenMPT/](https://source.openmpt.org/browse/openmpt/trunk/OpenMPT/).
+Patches can be provided either against this Subversion repository or against 
our
+GitHub mirror at
+[https://github.com/OpenMPT/openmpt/](https://github.com/OpenMPT/openmpt/).
+
+We do not have a developer mailing list. Discussions about new features or
+problems can happen at:
+ *  [Issue Tracker](https://bugs.openmpt.org/), preferred for specific bug
+    reports or bug fixes and feature development discussion
+ *  [Forum](https://forum.openmpt.org/), preferred for long-term discussion of
+    new features or specific questions about development
+ *  [IRC channel (`EsperNET/#modplug`)](irc://irc.esper.net:5555/#modplug),
+    preferred for shorter questions
+ *  [GitHub pull requests](https://github.com/OpenMPT/openmpt/pulls), please
+    only use for rather tiny fixes, see below
+
+For patch submissions, please also see
+[OpenMPT style guide](openmpt_styleguide.md) and
+[libopenmpt style guide](libopenmpt_styleguide.md).
+
+### Contributing via GitHub
+
+As OpenMPT is developed in a Subversion repository and the GitHub repository is
+just mirrored from that, we cannot directly take pull requests via GitHub. We
+recognize that, especially for tiny bug fixes, the burden to choose a different
+way than GitHub for contributing can be too high. Thus, we will of course 
react,
+give feedback, and take patches also via GitHub pull requests. However, as the
+GitHub repository is strictly downstream from our Subversion repository (and
+this will not change, due to considerable complications when synchronizing this
+two-way), we cannot directly merge pull requests on GitHub. We will merge
+contributions to our Subversion repository, which will then in turn be mirrored
+to GitHub automatically, after which we will close the pull request. Authorship
+attribution in git relies on the email address used in the commit header, which
+is not how it usually works in Subversion. We will thus add an additional line
+to the commit message in the form of `Patch-by: John Doe <u...@example.com>`. 
If
+you prefer to be attributed with your nickname and/or without your email
+address, that would also be fine for us.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/doc/libopenmpt_styleguide.md 
new/libopenmpt-0.4.4+release.autotools/doc/libopenmpt_styleguide.md
--- old/libopenmpt-0.4.3+release.autotools/doc/libopenmpt_styleguide.md 
1970-01-01 01:00:00.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/doc/libopenmpt_styleguide.md 
2018-02-05 09:32:49.000000000 +0100
@@ -0,0 +1,104 @@
+
+Coding conventions
+------------------
+
+
+### libopenmpt
+
+**Note:**
+**This applies to `libopenmpt/` and `openmpt123/` directories only.**
+**Use OpenMPT style otherwise.**
+
+The code generally tries to follow these conventions, but they are not
+strictly enforced and there are valid reasons to diverge from these
+conventions. Using common sense is recommended.
+
+ -  In general, the most important thing is to keep style consistent with
+    directly surrounding code.
+ -  Use C++ std types when possible, prefer `std::size_t` and `std::int32_t`
+    over `long` or `int`. Do not use C99 std types (e.g. no pure `int32_t`)
+ -  Qualify namespaces explicitly, do not use `using`.
+    Members of `namespace openmpt` can be named without full namespace
+    qualification.
+ -  Prefer the C++ version in `namespace std` if the same functionality is
+    provided by the C standard library as well. Also, include the C++
+    version of C standard library headers (e.g. use `<cstdio>` instead of
+    `<stdio.h>`.
+ -  Do not use ANY locale-dependant C functions. For locale-dependant C++
+    functionaly (especially iostream), always imbue the
+    `std::locale::classic()` locale.
+ -  Prefer kernel_style_names over CamelCaseNames.
+ -  If a folder (or one of its parent folders) contains .clang-format,
+    use clang-format v3.5 for indenting C++ and C files, otherwise:
+     -  `{` are placed at the end of the opening line.
+     -  Enclose even single statements in curly braces.
+     -  Avoid placing single statements on the same line as the `if`.
+     -  Opening parentheses are separated from keywords with a space.
+     -  Opening parentheses are not separated from function names.
+     -  Place spaces around operators and inside parentheses.
+     -  Align `:` and `,` when inheriting or initializing members in a
+        constructor.
+     -  The pointer `*` is separated from both the type and the variable name.
+     -  Use tabs for identation, spaces for formatting.
+        Tabs should only appear at the very beginning of a line.
+        Do not assume any particular width of the TAB character. If width is
+        important for formatting reasons, use spaces.
+     -  Use empty lines at will.
+ -  API documentation is done with doxygen.
+    Use general C doxygen for the C API.
+    Use QT-style doxygen for the C++ API.
+
+#### libopenmpt indentation example
+
+~~~~{.cpp}
+namespace openmpt {
+
+// This is totally meaningless code and just illustrates indentation.
+
+class foo
+       : public base
+       , public otherbase
+{
+
+private:
+
+       std::int32_t x;
+       std::int16_t y;
+
+public:
+
+       foo()
+               : x(0)
+               , y(-1)
+       {
+               return;
+       }
+
+       int bar() const;
+
+}; // class foo
+
+int foo::bar() const {
+
+       for ( int i = 0; i < 23; ++i ) {
+               switch ( x ) {
+                       case 2:
+                               something( y );
+                               break;
+                       default:
+                               something( ( y - 1 ) * 2 );
+                               break;
+               }
+       }
+       if ( x == 12 ) {
+               return -1;
+       } else if ( x == 42 ) {
+               return 1;
+       }
+       return 42;
+
+}
+
+} // namespace openmpt
+~~~~
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/doc/module_formats.md 
new/libopenmpt-0.4.4+release.autotools/doc/module_formats.md
--- old/libopenmpt-0.4.3+release.autotools/doc/module_formats.md        
1970-01-01 01:00:00.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/doc/module_formats.md        
2018-09-09 13:28:35.000000000 +0200
@@ -0,0 +1,106 @@
+How to add support for new module formats
+=========================================
+
+This document describes the basics of writing a new module loader and related
+work that has to be done. We will not discuss in detail how to write the 
loader,
+have a look at existing loaders to get an idea how they work in general.
+
+General hints
+-------------
+* We strive for quality over quantity. The goal is not to support as many 
module
+  formats as possible, but to support them as well as possible. 
+* Write defensive code. Guard against out-of-bound values, division by zero and
+  similar stuff. libopenmpt is constantly fuzz-tested to catch any crashes, but
+  of course we want our code to be reliable from the start.
+* Every format should have its own `MODTYPE` flag, unless it can be reasonably
+  represented as a subset of another format (like Ice Tracker ICE files being
+  a subset of ProTracker MOD).
+* When reading binary structs from the file, use our data types with defined
+  endianness, which can be found in `common/Endianness.h`:
+  * Big-Endian: (u)int8/16/32/64be, float32be, float64be
+  * Little-Endian: (u)int8/16/32/64le, float32le, float64le
+
+  Entire structs containing integers with defined endianness can be read in one
+  go if they are tagged with `MPT_BINARY_STRUCT` (see existing loaders for an
+  example).
+* `m_nChannels` **MUST NOT** be changed after a pattern has been created, as
+  existing patterns will be interpreted incorrectly. For module formats that
+  support per-pattern channel amounts, the maximum number of channels must be
+  determined beforehand.
+* Strings can be safely handled using:
+  * `FileReader::ReadString` and friends for reading them directly from a file
+  * `mpt::String::Read` for reading them from a struct or char array,
+  * `mpt::String::Copy` for copying between char arrays or `std::string`.
+
+  "Read" functions take care of string padding (zero / space padding), so those
+  should be used when extracting strings from files. "Copy" should only be used
+  on strings that have previously been read using the "Read" functions.
+  If the target is a char array rather than a `std::string`, these will take
+  care of properly null-terminating the target char array, and prevent reading
+  past the end of a (supposedly null-terminated) source char array.
+* Do not use non-const static variables in your loader. Loaders need to be
+  thread-safe for libopenmpt.
+* `FileReader` instances may be used to treat a portion of another file as its
+  own independent file (through `FileReader::ReadChunk`). This can be useful
+  with "embedded files" such as WAV or Ogg samples. Container formats are
+  another good example for this usage.
+* Samples *either* use middle-C frequency *or* finetune + transpose. For the 
few
+  weird formats that use both, it may make sense to translate everything into
+  middle-C frequency.
+* Add the new `MODTYPE` to `CSoundFile::UseFinetuneAndTranspose` if applicable,
+  and see if any effect handlers in `soundlib/Snd_fx.cpp` need to know the new
+  `MODTYPE`.
+* Do not rely on hard-coded magic numbers. For example, when comparing if an
+  index is valid for a given array, do not hard-code the array size but rather
+  use `mpt::size` or, for ensuring that char arrays are null-terminated,
+  `mpt::String::SetNullTerminator`. Similarly, do not assume any specific
+  quantities for OpenMPT's constants like MAX_SAMPLES, MAX_PATTERN_ROWS, etc.
+  These may change at any time.
+* Pay attention to off-by-one errors when comparing against MAX_SAMPLES and
+  MAX_INSTRUMENTS, since sample and instrument numbers are 1-based. 
+* Placement of the loader function in `CSoundFile::Create` depends on various
+  factors. In general, module formats that have very bad magic numbers (and 
thus
+  might cause other formats to get mis-interpreted) should be placed at the
+  bottom of the list. Two notable examples are 669 files, where the first two
+  bytes of the file are "if" (which may e.g. cause a song title starting with
+  "if ..." in various other formats to be interpreted as a 669 module), and of
+  course Ultimate SoundTracker modules, which have no magic bytes at all.
+* Avoid use of functions tagged with MPT_DEPRECATED.
+
+Probing
+-------
+libopenmpt provides fast probing functions that can be used by library users
+to quickly check if a file is most likely playable with libopenmpt, even if 
only
+a fraction of the file is available (e.g. when streaming from the internet).
+
+In order to satisfy these requirements, probing functions should do as little
+work as possible (e.g. only parse the header of the file), but as much as
+required to tell with some certainty that the file is really of a certain mod
+format. However, probing functions should not rely on having access to more 
than
+the first `CSoundFile::ProbeRecommendedSize` bytes of the file.
+
+* Probing functions **must not** allocate any memory on the heap.
+* Probing functions **must not** return ProbeFailure or ProbeWantMoreData for
+  any file that would normally be accepted by the loader. In particular, this
+  means that any header checks must not be any more aggressive than they would
+  be in the real loader (hence it is a good idea to not copy-paste this code 
but
+  rather put it in a separate function), and the minimum additional size passed
+  to `CSoundFile::ProbeAdditionalSize` must not be higher than the biggest size
+  that would cause a hard failure (i.e. returning `false`) in the module 
loader.
+* Probing functions **may** return ProbeSuccess for files that would be 
rejected
+  by a loader after a more thorough inspection. For example, probing functions
+  do not need to verify that all required chunks of an IFF-like file format are
+  actually present, if the header makes it obvious enough that the file is
+  highly likely to be a module.
+
+Adding loader to the build systems and various other locations
+--------------------------------------------------------------
+Apart from writing the module loader itself, there are a couple of other places
+that need to be updated:
+* Add loader file to `build/android_ndk/Android.mk`.
+* Add loader file to `build/autotools/Makefile.am`.
+* Run `build/regenerate_vs_projects.sh` / `build/regenerate_vs_projects.cmd`
+  (depending on your platform)
+* Add file extension to `installer/filetypes.iss` (in four places).
+* Add file extension to `CTrackApp::OpenModulesDialog` in 
`mptrack/Mptrack.cpp`.
+* Add format information to `soundlib/Tables.cpp`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/libopenmpt/dox/changelog.md 
new/libopenmpt-0.4.4+release.autotools/libopenmpt/dox/changelog.md
--- old/libopenmpt-0.4.3+release.autotools/libopenmpt/dox/changelog.md  
2019-02-11 06:32:46.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/libopenmpt/dox/changelog.md  
2019-04-07 15:13:36.000000000 +0200
@@ -5,6 +5,19 @@
 For fully detailed change log, please see the source repository directly. This
 is just a high-level summary.
 
+### libopenmpt 0.4.4 (2019-04-07)
+
+ *  [**Bug**] Channel VU meters were swapped.
+
+ *  Startrekker: Clamp speed to 31 ticks per row.
+ *  MTM: Ignore unused Exy commands on import. Command E5x (Set Finetune) is 
now
+    applied correctly.
+ *  MOD: Sample swapping was always enabled since it has been separated from 
the
+    ProTracker 1/2 compatibility flag. Now it is always enabled for Amiga-style
+    modules and otherwise the old heuristic is used again.
+
+ *  stb_vorbis: Update to v1.16 (2019-03-05).
+
 ### libopenmpt 0.4.3 (2019-02-11)
 
  *  [**Sec**] Possible crash due to null-pointer access when doing a portamento
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/libopenmpt/dox/index.dox 
new/libopenmpt-0.4.4+release.autotools/libopenmpt/dox/index.dox
--- old/libopenmpt-0.4.3+release.autotools/libopenmpt/dox/index.dox     
2018-01-27 18:01:36.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/libopenmpt/dox/index.dox     
2019-02-28 14:37:59.000000000 +0100
@@ -11,8 +11,11 @@
  * - \ref md_README "README"
  * - \ref dependencies "Dependencies"
  * - \ref packaging "Packaging"
+ * - \ref md_doc_contributing "Contributing"
+ * - \ref md_doc_libopenmpt_styleguide "Style Guide"
  * - \ref tests "Tests"
  * - \ref changelog "Changelog"
+ * - \ref md_doc_module_formats "Implementing new Module Formats"
  * - \ref todo "TODO"
  * \subsection toc_apis APIs
  * - libopenmpt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/libopenmpt/libopenmpt_version.h 
new/libopenmpt-0.4.4+release.autotools/libopenmpt/libopenmpt_version.h
--- old/libopenmpt-0.4.3+release.autotools/libopenmpt/libopenmpt_version.h      
2019-02-11 06:32:46.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/libopenmpt/libopenmpt_version.h      
2019-04-07 15:13:36.000000000 +0200
@@ -19,7 +19,7 @@
 /*! \brief libopenmpt minor version number */
 #define OPENMPT_API_VERSION_MINOR 4
 /*! \brief libopenmpt patch version number */
-#define OPENMPT_API_VERSION_PATCH 3
+#define OPENMPT_API_VERSION_PATCH 4
 /*! \brief libopenmpt pre-release tag */
 #define OPENMPT_API_VERSION_PREREL ""
 /*! \brief libopenmpt pre-release flag */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/libopenmpt/libopenmpt_version.mk 
new/libopenmpt-0.4.4+release.autotools/libopenmpt/libopenmpt_version.mk
--- old/libopenmpt-0.4.3+release.autotools/libopenmpt/libopenmpt_version.mk     
2019-02-11 06:32:46.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/libopenmpt/libopenmpt_version.mk     
2019-04-07 15:13:36.000000000 +0200
@@ -1,8 +1,8 @@
 LIBOPENMPT_VERSION_MAJOR=0
 LIBOPENMPT_VERSION_MINOR=4
-LIBOPENMPT_VERSION_PATCH=3
+LIBOPENMPT_VERSION_PATCH=4
 LIBOPENMPT_VERSION_PREREL=
 
 LIBOPENMPT_LTVER_CURRENT=1
-LIBOPENMPT_LTVER_REVISION=3
+LIBOPENMPT_LTVER_REVISION=4
 LIBOPENMPT_LTVER_AGE=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.3+release.autotools/man/openmpt123.1 
new/libopenmpt-0.4.4+release.autotools/man/openmpt123.1
--- old/libopenmpt-0.4.3+release.autotools/man/openmpt123.1     2019-02-11 
06:39:58.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/man/openmpt123.1     2019-04-07 
15:30:29.000000000 +0200
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
-.TH OPENMPT123 "1" "February 2019" "openmpt123 v0.4.3" "User Commands"
+.TH OPENMPT123 "1" "April 2019" "openmpt123 v0.4.4" "User Commands"
 .SH NAME
 openmpt123 - command line module music player based on libopenmpt
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/InstrumentExtensions.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/InstrumentExtensions.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/InstrumentExtensions.cpp    
2018-08-24 19:25:50.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/InstrumentExtensions.cpp    
2019-03-08 21:52:17.000000000 +0100
@@ -120,9 +120,9 @@
 PSE.                   PanEnv.nSustainEnd;
 PTTL                   pitchToTempoLock;
 PTTF                   pitchToTempoLock (fractional part);
-PVEH                   nPluginVelocityHandling;
-PVOH                   nPluginVolumeHandling;
-R...                   nResampling;
+PVEH                   pluginVelocityHandling;
+PVOH                   pluginVolumeHandling;
+R...                   resampling;
 RP..   [EXT]   nRestartPos;
 RPB.   [EXT]   nRowsPerBeat;
 RPM.   [EXT]   nRowsPerMeasure;
@@ -314,12 +314,12 @@
        WRITE_MPTHEADER_envelope_member(        ENV_PITCH       , value         
, uint8         , MagicBE("PiE[")       )
        WRITE_MPTHEADER_sized_member(   nMixPlug                                
        , uint8         , MagicBE("MiP.")       )
        WRITE_MPTHEADER_sized_member(   nVolRampUp                              
        , uint16        , MagicBE("VR..")       )
-       WRITE_MPTHEADER_trunc_member(   nResampling                             
        , uint16        , MagicBE("R...")       )
+       WRITE_MPTHEADER_sized_member(   resampling                              
        , uint8         , MagicBE("R...")       )
        WRITE_MPTHEADER_sized_member(   nCutSwing                               
        , uint8         , MagicBE("CS..")       )
        WRITE_MPTHEADER_sized_member(   nResSwing                               
        , uint8         , MagicBE("RS..")       )
        WRITE_MPTHEADER_sized_member(   nFilterMode                             
        , uint8         , MagicBE("FM..")       )
-       WRITE_MPTHEADER_sized_member(   nPluginVelocityHandling         , uint8 
        , MagicBE("PVEH")       )
-       WRITE_MPTHEADER_sized_member(   nPluginVolumeHandling           , uint8 
        , MagicBE("PVOH")       )
+       WRITE_MPTHEADER_sized_member(   pluginVelocityHandling          , uint8 
        , MagicBE("PVEH")       )
+       WRITE_MPTHEADER_sized_member(   pluginVolumeHandling            , uint8 
        , MagicBE("PVOH")       )
        WRITE_MPTHEADER_trunc_member(   pitchToTempoLock.GetInt()       , 
uint16        , MagicBE("PTTL")       )
        WRITE_MPTHEADER_trunc_member(   pitchToTempoLock.GetFract() , uint16    
, MagicLE("PTTF")       )
        WRITE_MPTHEADER_sized_member(   PitchEnv.nReleaseNode           , uint8 
        , MagicBE("PERN")       )
@@ -373,9 +373,9 @@
        WritePropertyIfNeeded(*this, &ModInstrument::nMidiChannel, 
MagicBE("MC.."), sizeof(ModInstrument::nMidiChannel), f, numInstruments);
        WritePropertyIfNeeded(*this, &ModInstrument::nMidiProgram, 
MagicBE("MP.."), sizeof(ModInstrument::nMidiProgram), f, numInstruments);
        WritePropertyIfNeeded(*this, &ModInstrument::wMidiBank,    
MagicBE("MB.."), sizeof(ModInstrument::wMidiBank),    f, numInstruments);
-       WritePropertyIfNeeded(*this, &ModInstrument::nResampling,  
MagicBE("R..."), sizeof(ModInstrument::nResampling),  f, numInstruments);
-       WritePropertyIfNeeded(*this, &ModInstrument::nPluginVelocityHandling, 
MagicBE("PVEH"), sizeof(ModInstrument::nPluginVelocityHandling), f, 
numInstruments);
-       WritePropertyIfNeeded(*this, &ModInstrument::nPluginVolumeHandling, 
MagicBE("PVOH"), sizeof(ModInstrument::nPluginVolumeHandling), f, 
numInstruments);
+       WritePropertyIfNeeded(*this, &ModInstrument::resampling,  
MagicBE("R..."), sizeof(ModInstrument::resampling),  f, numInstruments);
+       WritePropertyIfNeeded(*this, &ModInstrument::pluginVelocityHandling, 
MagicBE("PVEH"), sizeof(ModInstrument::pluginVelocityHandling), f, 
numInstruments);
+       WritePropertyIfNeeded(*this, &ModInstrument::pluginVolumeHandling, 
MagicBE("PVOH"), sizeof(ModInstrument::pluginVolumeHandling), f, 
numInstruments);
 
        if(!(GetType() & MOD_TYPE_XM))
        {
@@ -575,16 +575,15 @@
        GET_MPTHEADER_envelope_member(ENV_PITCH         , value , uint8         
        , MagicBE("PiE[")       )
        GET_MPTHEADER_array_member(     NoteMap                                 
, uint8                 , MagicBE("NM[.")       )
        GET_MPTHEADER_array_member(     Keyboard                                
, uint16                , MagicBE("K[..")       )
-       GET_MPTHEADER_chararray_member( name                                    
, char                  , MagicBE("n[..")       )
-       GET_MPTHEADER_chararray_member( filename                                
, char                  , MagicBE("fn[.")       )
+       GET_MPTHEADER_chararray_member( name                            , char  
                , MagicBE("n[..")       )
+       GET_MPTHEADER_chararray_member( filename                        , char  
                , MagicBE("fn[.")       )
        GET_MPTHEADER_sized_member(     nMixPlug                                
, uint8                 , MagicBE("MiP.")       )
        GET_MPTHEADER_sized_member(     nVolRampUp                              
, uint16                , MagicBE("VR..")       )
-       GET_MPTHEADER_sized_member(     nResampling                             
, uint32                , MagicBE("R...")       )
        GET_MPTHEADER_sized_member(     nCutSwing                               
, uint8                 , MagicBE("CS..")       )
        GET_MPTHEADER_sized_member(     nResSwing                               
, uint8                 , MagicBE("RS..")       )
        GET_MPTHEADER_sized_member(     nFilterMode                             
, uint8                 , MagicBE("FM..")       )
-       GET_MPTHEADER_sized_member(     nPluginVelocityHandling , uint8         
        , MagicBE("PVEH")       )
-       GET_MPTHEADER_sized_member(     nPluginVolumeHandling   , uint8         
        , MagicBE("PVOH")       )
+       GET_MPTHEADER_sized_member(     pluginVelocityHandling  , uint8         
        , MagicBE("PVEH")       )
+       GET_MPTHEADER_sized_member(     pluginVolumeHandling    , uint8         
        , MagicBE("PVOH")       )
        GET_MPTHEADER_sized_member(     PitchEnv.nReleaseNode   , uint8         
        , MagicBE("PERN")       )
        GET_MPTHEADER_sized_member(     PanEnv.nReleaseNode             , uint8 
                , MagicBE("AERN")       )
        GET_MPTHEADER_sized_member(     VolEnv.nReleaseNode             , uint8 
                , MagicBE("VERN")       )
@@ -592,6 +591,14 @@
        GET_MPTHEADER_sized_member(     PanEnv.dwFlags                  , uint8 
                , MagicBE("AFLG")       )
        GET_MPTHEADER_sized_member(     VolEnv.dwFlags                  , uint8 
                , MagicBE("VFLG")       )
        GET_MPTHEADER_sized_member(     midiPWD                                 
, int8                  , MagicBE("MPWD")       )
+       case MagicBE("R..."):
+       {
+               // Resampling has been written as various sizes including 
uint16 and uint32 in the past
+               uint32 tmp = file.ReadTruncatedIntLE<uint32>(fsize);
+               if(Resampling::IsKnownMode(tmp))
+                       input->resampling = static_cast<ResamplingMode>(tmp);
+               result = true;
+       } break;
        case MagicBE("PTTL"):
        {
                // Integer part of pitch/tempo lock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/Load_mod.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/Load_mod.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/Load_mod.cpp        
2018-12-21 14:11:03.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/Load_mod.cpp        
2019-04-06 15:49:58.000000000 +0200
@@ -345,23 +345,23 @@
 // Synthesized StarTrekker instruments
 struct AMInstrument
 {
-       char     am[2];                 // "AM"
+       char     am[2];        // "AM"
        char     zero[4];
-       uint16be startLevel;    // Start level
-       uint16be attack1Level;  // Attack 1 level
-       uint16be attack1Speed;  // Attack 1 speed
-       uint16be attack2Level;  // Attack 2 level
-       uint16be attack2Speed;  // Attack 2 speed
-       uint16be sustainLevel;  // Sustain level
-       uint16be decaySpeed;    // Decay speed
-       uint16be sustainTime;   // Sustain time
-       uint16be nt;                    // ?
-       uint16be releaseSpeed;  // Release speed
-       uint16be waveform;              // Waveform
-       int16be  pitchFall;             // Pitch fall
-       uint16be vibAmp;                // Vibrato amplitude
-       uint16be vibSpeed;              // Vibrato speed
-       uint16be octave;                // Base frequency
+       uint16be startLevel;   // Start level
+       uint16be attack1Level; // Attack 1 level
+       uint16be attack1Speed; // Attack 1 speed
+       uint16be attack2Level; // Attack 2 level
+       uint16be attack2Speed; // Attack 2 speed
+       uint16be sustainLevel; // Sustain level
+       uint16be decaySpeed;   // Decay speed
+       uint16be sustainTime;  // Sustain time
+       uint16be nt;           // ?
+       uint16be releaseSpeed; // Release speed
+       uint16be waveform;     // Waveform
+       int16be  pitchFall;    // Pitch fall
+       uint16be vibAmp;       // Vibrato amplitude
+       uint16be vibSpeed;     // Vibrato speed
+       uint16be octave;       // Base frequency
 
        void ConvertToMPT(ModSample &sample, ModInstrument &ins, mpt::fast_prng 
&rng) const
        {
@@ -376,15 +376,16 @@
                sample.RelativeTone = static_cast<int8>(-12 * octave);
                if(sample.AllocateSample())
                {
+                       int8 *p = sample.sample8();
                        for(SmpLength i = 0; i < sample.nLength; i++)
                        {
                                switch(waveform)
                                {
                                default:
-                               case 0: sample.sample8()[i] = ModSinusTable[i * 
2];                             break;  // Sine
-                               case 1: sample.sample8()[i] = 
static_cast<int8>(-128 + i * 8);  break;  // Saw
-                               case 2: sample.sample8()[i] = i < 16 ? -128 : 
127;                              break;  // Square
-                               case 3: sample.sample8()[i] = 
mpt::random<int8>(rng);                   break;  // Noise
+                               case 0: p[i] = ModSinusTable[i * 2];            
break; // Sine
+                               case 1: p[i] = static_cast<int8>(-128 + i * 8); 
break; // Saw
+                               case 2: p[i] = i < 16 ? -128 : 127;             
break; // Square
+                               case 3: p[i] = mpt::random<int8>(rng);          
break; // Noise
                                }
                        }
                }
@@ -492,7 +493,7 @@
 
 
 // Check if header magic equals a given string.
-static bool IsMagic(const char *magic1, const char *magic2)
+static bool IsMagic(const char *magic1, const char (&magic2)[5])
 {
        return std::memcmp(magic1, magic2, 4) == 0;
 }
@@ -1023,11 +1024,15 @@
 
                                if(m.command || m.param)
                                {
-                                       // No support for Startrekker assembly 
macros
                                        if(isStartrekker && m.command == 0x0E)
                                        {
+                                               // No support for Startrekker 
assembly macros
                                                m.command = CMD_NONE;
                                                m.param = 0;
+                                       } else if(isStartrekker && m.command == 
0x0F && m.param > 0x1F)
+                                       {
+                                               // Startrekker caps speed at 31 
ticks per row
+                                               m.param = 0x1F;
                                        }
                                        ConvertModCommand(m);
                                }
@@ -1281,13 +1286,13 @@
 // Thanks for Fraggie for this information! 
(https://www.un4seen.com/forum/?topic=14471.msg100829#msg100829)
 enum STVersions
 {
-       UST1_00,                                // Ultimate Soundtracker 
1.0-1.21 (K. Obarski)
-       UST1_80,                                // Ultimate Soundtracker 
1.8-2.0 (K. Obarski)
-       ST2_00_Exterminator,    // SoundTracker 2.0 (The Exterminator), D.O.C. 
Sountracker II (Unknown/D.O.C.)
-       ST_III,                                 // Defjam Soundtracker III (Il 
Scuro/Defjam), Alpha Flight SoundTracker IV (Alpha Flight), D.O.C. SoundTracker 
IV (Unknown/D.O.C.), D.O.C. SoundTracker VI (Unknown/D.O.C.)
-       ST_IX,                                  // D.O.C. SoundTracker IX 
(Unknown/D.O.C.)
-       MST1_00,                                // Master Soundtracker 1.0 
(Tip/The New Masters)
-       ST2_00,                                 // SoundTracker 2.0, 2.1, 2.2 
(Unknown/D.O.C.)
+       UST1_00,             // Ultimate Soundtracker 1.0-1.21 (K. Obarski)
+       UST1_80,             // Ultimate Soundtracker 1.8-2.0 (K. Obarski)
+       ST2_00_Exterminator, // SoundTracker 2.0 (The Exterminator), D.O.C. 
Sountracker II (Unknown/D.O.C.)
+       ST_III,              // Defjam Soundtracker III (Il Scuro/Defjam), 
Alpha Flight SoundTracker IV (Alpha Flight), D.O.C. SoundTracker IV 
(Unknown/D.O.C.), D.O.C. SoundTracker VI (Unknown/D.O.C.)
+       ST_IX,               // D.O.C. SoundTracker IX (Unknown/D.O.C.)
+       MST1_00,             // Master Soundtracker 1.0 (Tip/The New Masters)
+       ST2_00,              // SoundTracker 2.0, 2.1, 2.2 (Unknown/D.O.C.)
 };
 
 
@@ -1521,8 +1526,7 @@
        if(fileHeader.restartPos != 0x78)
        {
                // Convert to CIA timing
-               //m_nDefaultTempo = TEMPO(((709378.92 / 50.0) * 125.0) / ((240 
- fileHeader.restartPos) * 122.0));
-               m_nDefaultTempo.Set((709379 / ((240 - fileHeader.restartPos) * 
122)) * 125 / 50);
+               m_nDefaultTempo = TEMPO((709379.0 * 125.0 / 50.0) / ((240 - 
fileHeader.restartPos) * 122.0));
                if(minVersion > UST1_80)
                {
                        // D.O.C. SoundTracker IX re-introduced the variable 
tempo after some other versions dropped it.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/Load_mt2.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/Load_mt2.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/Load_mt2.cpp        
2018-12-06 15:29:05.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/Load_mt2.cpp        
2019-03-08 21:52:17.000000000 +0100
@@ -1060,7 +1060,7 @@
                                {
                                        if(drumSample[drum] == i && 
Instruments[drumMap[drum]] != nullptr)
                                        {
-                                               
Instruments[drumMap[drum]]->nResampling = SRCMODE_NEAREST;
+                                               
Instruments[drumMap[drum]]->resampling = SRCMODE_NEAREST;
                                        }
                                }
                        }
@@ -1105,7 +1105,7 @@
                                                mptSmp.nFineTune = group.pitch;
                                                if(sampleNoInterpolation[sample 
- 1])
                                                {
-                                                       mptIns->nResampling = 
SRCMODE_NEAREST;
+                                                       mptIns->resampling = 
SRCMODE_NEAREST;
                                                }
                                                if(sampleSynchronized[sample - 
1])
                                                {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/Load_mtm.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/Load_mtm.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/Load_mtm.cpp        
2018-12-06 15:29:05.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/Load_mtm.cpp        
2019-02-28 21:53:19.000000000 +0100
@@ -58,8 +58,8 @@
                        LimitMax(mptSmp.nLoopEnd, mptSmp.nLength);
                        if(mptSmp.nLoopStart + 4 >= mptSmp.nLoopEnd) 
mptSmp.nLoopStart = mptSmp.nLoopEnd = 0;
                        if(mptSmp.nLoopEnd) mptSmp.uFlags.set(CHN_LOOP);
-                       mptSmp.nFineTune = MOD2XMFineTune(finetune);
-                       mptSmp.nC5Speed = ModSample::TransposeToFrequency(0, 
mptSmp.nFineTune);
+                       mptSmp.nFineTune = finetune; // Uses MOD units but 
allows the full int8 range rather than just -8...+7 so we keep the value as-is 
and convert it during playback
+                       mptSmp.nC5Speed = ModSample::TransposeToFrequency(0, 
finetune * 16);
 
                        if(attribute & 0x01)
                        {
@@ -204,11 +204,25 @@
                                {
                                        // No 8xx panning in MultiTracker, only 
E8x
                                        cmd = param = 0;
+                               } else if(cmd == 0x0E)
+                               {
+                                       // MultiTracker does not support these 
commands
+                                       switch(param & 0xF0)
+                                       {
+                                       case 0x00:
+                                       case 0x30:
+                                       case 0x40:
+                                       case 0x60:
+                                       case 0x70:
+                                       case 0xF0:
+                                               cmd = param = 0;
+                                               break;
+                                       }
                                }
-                               m->command = cmd;
-                               m->param = param;
                                if(cmd != 0 || param != 0)
                                {
+                                       m->command = cmd;
+                                       m->param = param;
                                        ConvertModCommand(*m);
 #ifdef MODPLUG_TRACKER
                                        m->Convert(MOD_TYPE_MTM, MOD_TYPE_S3M, 
*this);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/ModChannel.h 
new/libopenmpt-0.4.4+release.autotools/soundlib/ModChannel.h
--- old/libopenmpt-0.4.3+release.autotools/soundlib/ModChannel.h        
2018-11-02 01:00:49.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/ModChannel.h        
2019-03-08 21:52:17.000000000 +0100
@@ -87,7 +87,7 @@
        CHANNELINDEX nMasterChn;
        ModCommand rowCommand;
        // 8-bit members
-       uint8 resamplingMode;
+       ResamplingMode resamplingMode;
        uint8 nRestoreResonanceOnNewNote;       // See nRestorePanOnNewNote
        uint8 nRestoreCutoffOnNewNote;          // ditto
        uint8 nNote;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/ModInstrument.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/ModInstrument.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/ModInstrument.cpp   
2018-09-15 15:07:34.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/ModInstrument.cpp   
2019-03-08 21:52:17.000000000 +0100
@@ -163,13 +163,13 @@
 
        nMixPlug = 0;
        nVolRampUp = 0;
-       nResampling = SRCMODE_DEFAULT;
+       resampling = SRCMODE_DEFAULT;
        nCutSwing = 0;
        nResSwing = 0;
        nFilterMode = FLTMODE_UNCHANGED;
        pitchToTempoLock.Set(0);
-       nPluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL;
-       nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
+       pluginVelocityHandling = PLUGIN_VELOCITYHANDLING_CHANNEL;
+       pluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE;
 
        pTuning = CSoundFile::GetDefaultTuning();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/ModInstrument.h 
new/libopenmpt-0.4.4+release.autotools/soundlib/ModInstrument.h
--- old/libopenmpt-0.4.3+release.autotools/soundlib/ModInstrument.h     
2018-08-24 19:25:50.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/ModInstrument.h     
2019-03-08 21:52:17.000000000 +0100
@@ -64,46 +64,46 @@
 // Instrument Struct
 struct ModInstrument
 {
-       uint32 nFadeOut;                                        // Instrument 
fadeout speed
-       uint32 nGlobalVol;                                      // Global 
volume (0...64, all sample volumes are multiplied with this - TODO: This is 
0...128 in Impulse Tracker)
-       uint32 nPan;                                            // Default pan 
(0...256), if the appropriate flag is set. Sample panning overrides instrument 
panning.
-
-       uint16 nVolRampUp;                                      // Default 
sample ramping up, 0 = use global default
-
-       uint16 wMidiBank;                                       // MIDI Bank 
(1...16384). 0 = Don't send.
-       uint8 nMidiProgram;                                     // MIDI Program 
(1...128). 0 = Don't send.
-       uint8 nMidiChannel;                                     // MIDI Channel 
(1...16). 0 = Don't send. 17 = Mapped (Send to tracker channel modulo 16).
-       uint8 nMidiDrumKey;                                     // Drum set 
note mapping (currently only used by the .MID loader)
-       int8 midiPWD;                                           // MIDI Pitch 
Wheel Depth in semitones
-
-       FlagSet<InstrumentFlags> dwFlags;       // Instrument flags
-       NewNoteAction nNNA;                                     // New note 
action
-       DuplicateCheckType nDCT;                        // Duplicate check type 
(i.e. which condition will trigger the duplicate note action)
-       DuplicateNoteAction nDNA;                       // Duplicate note action
-       uint8 nPanSwing;                                        // Random 
panning factor (0...64)
-       uint8 nVolSwing;                                        // Random 
volume factor (0...100)
-       uint8 nIFC;                                                     // 
Default filter cutoff (0...127). Used if the high bit is set
-       uint8 nIFR;                                                     // 
Default filter resonance (0...127). Used if the high bit is set
-
-       int8 nPPS;                                                      // 
Pitch/Pan separation (i.e. how wide the panning spreads, -32...32)
-       uint8 nPPC;                                                     // 
Pitch/Pan centre (zero-based, default is NOTE_MIDDLE_C - 1)
-
-       PLUGINDEX nMixPlug;                                     // Plugin 
assigned to this instrument (0 = no plugin, 1 = first plugin)
-       uint8 nCutSwing;                                        // Random 
cutoff factor (0...64)
-       uint8 nResSwing;                                        // Random 
resonance factor (0...64)
-       InstrFilterMode nFilterMode;            // Default filter mode
-       uint8 nPluginVelocityHandling;          // How to deal with plugin 
velocity (PLUGIN_VELOCITYHANDLING_* constants)
-       uint8 nPluginVolumeHandling;            // How to deal with plugin 
volume (PLUGIN_VOLUMEHANDLING_* constants)
-       TEMPO pitchToTempoLock;                         // BPM at which the 
samples assigned to this instrument loop correctly (0 = unset)
-       uint32 nResampling;                                     // Resampling 
mode (SRCMODE_* constants)
-       CTuning *pTuning;                                       // sample 
tuning assigned to this instrument
-
-       InstrumentEnvelope VolEnv;                      // Volume envelope data
-       InstrumentEnvelope PanEnv;                      // Panning envelope data
-       InstrumentEnvelope PitchEnv;            // Pitch / filter envelope data
+       uint32 nFadeOut;                             // Instrument fadeout speed
+       uint32 nGlobalVol;                           // Global volume (0...64, 
all sample volumes are multiplied with this - TODO: This is 0...128 in Impulse 
Tracker)
+       uint32 nPan;                                 // Default pan (0...256), 
if the appropriate flag is set. Sample panning overrides instrument panning.
+
+       uint16 nVolRampUp;                           // Default sample ramping 
up, 0 = use global default
+
+       uint16 wMidiBank;                            // MIDI Bank (1...16384). 
0 = Don't send.
+       uint8 nMidiProgram;                          // MIDI Program (1...128). 
0 = Don't send.
+       uint8 nMidiChannel;                          // MIDI Channel (1...16). 
0 = Don't send. 17 = Mapped (Send to tracker channel modulo 16).
+       uint8 nMidiDrumKey;                          // Drum set note mapping 
(currently only used by the .MID loader)
+       int8 midiPWD;                                // MIDI Pitch Wheel Depth 
in semitones
+
+       FlagSet<InstrumentFlags> dwFlags;            // Instrument flags
+       NewNoteAction nNNA;                          // New note action
+       DuplicateCheckType nDCT;                     // Duplicate check type 
(i.e. which condition will trigger the duplicate note action)
+       DuplicateNoteAction nDNA;                    // Duplicate note action
+       uint8 nPanSwing;                             // Random panning factor 
(0...64)
+       uint8 nVolSwing;                             // Random volume factor 
(0...100)
+       uint8 nIFC;                                  // Default filter cutoff 
(0...127). Used if the high bit is set
+       uint8 nIFR;                                  // Default filter 
resonance (0...127). Used if the high bit is set
+
+       int8 nPPS;                                   // Pitch/Pan separation 
(i.e. how wide the panning spreads, -32...32)
+       uint8 nPPC;                                  // Pitch/Pan centre 
(zero-based, default is NOTE_MIDDLE_C - 1)
+
+       PLUGINDEX nMixPlug;                          // Plugin assigned to this 
instrument (0 = no plugin, 1 = first plugin)
+       uint8 nCutSwing;                             // Random cutoff factor 
(0...64)
+       uint8 nResSwing;                             // Random resonance factor 
(0...64)
+       InstrFilterMode nFilterMode;                 // Default filter mode
+       PlugVelocityHandling pluginVelocityHandling; // How to deal with plugin 
velocity
+       PlugVolumeHandling pluginVolumeHandling;     // How to deal with plugin 
volume
+       ResamplingMode resampling;                   // Resampling mode
+       TEMPO pitchToTempoLock;                      // BPM at which the 
samples assigned to this instrument loop correctly (0 = unset)
+       CTuning *pTuning;                            // sample tuning assigned 
to this instrument
+
+       InstrumentEnvelope VolEnv;                   // Volume envelope data
+       InstrumentEnvelope PanEnv;                   // Panning envelope data
+       InstrumentEnvelope PitchEnv;                 // Pitch / filter envelope 
data
 
-       uint8 NoteMap[128];                                     // Note 
mapping, e.g. C-5 => D-5.
-       SAMPLEINDEX Keyboard[128];                      // Sample mapping, e.g. 
C-5 => Sample 1
+       uint8 NoteMap[128];                          // Note mapping, e.g. C-5 
=> D-5.
+       SAMPLEINDEX Keyboard[128];                   // Sample mapping, e.g. 
C-5 => Sample 1
 
        char name[MAX_INSTRUMENTNAME];
        char filename[MAX_INSTRUMENTFILENAME];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/ModSample.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/ModSample.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/ModSample.cpp       
2018-09-14 22:12:15.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/ModSample.cpp       
2019-03-19 21:54:13.000000000 +0100
@@ -113,6 +113,11 @@
        if(!CSoundFile::SupportsOPL(toType) && uFlags[CHN_ADLIB])
        {
                SetAdlib(false);
+       } else if(toType == MOD_TYPE_S3M && uFlags[CHN_ADLIB])
+       {
+               // No support for OPL3 waveforms in S3M
+               adlib[8] &= 0x03;
+               adlib[9] &= 0x03;
        }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/SampleFormatFLAC.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/SampleFormatFLAC.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/SampleFormatFLAC.cpp        
2018-12-23 00:46:00.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/SampleFormatFLAC.cpp        
2019-03-22 18:40:56.000000000 +0100
@@ -196,8 +196,8 @@
                                if(length > 6 && !mpt::CompareNoCaseAscii(tag, 
"TITLE=", 6))
                                {
                                        mpt::ustring sampleName;
-                                       
mpt::String::Read<mpt::String::maybeNullTerminated>(sampleName, 
client.sndFile.GetCharsetInternal(), tag + 6, length - 6);
-                                       
mpt::String::Copy(client.sndFile.m_szNames[client.sample], 
mpt::ToCharset(mpt::CharsetUTF8, sampleName));
+                                       
mpt::String::Read<mpt::String::maybeNullTerminated>(sampleName, 
mpt::CharsetUTF8, tag + 6, length - 6);
+                                       
mpt::String::Copy(client.sndFile.m_szNames[client.sample], 
mpt::ToCharset(client.sndFile.GetCharsetInternal(), sampleName));
                                } else if(length > 11 && 
!mpt::CompareNoCaseAscii(tag, "SAMPLERATE=", 11))
                                {
                                        uint32 sampleRate = 
ConvertStrTo<uint32>(tag + 11);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/SampleIO.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/SampleIO.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/SampleIO.cpp        
2018-08-24 19:25:50.000000000 +0200
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/SampleIO.cpp        
2019-03-31 14:10:53.000000000 +0200
@@ -1018,8 +1018,7 @@
                MPT_ASSERT(len == numSamples);
                if(sample.uFlags[CHN_16BIT])
                {
-                       const int16 *const pSample16 = sample.sample16();
-                       const int16 *p = pSample16;
+                       const int16 *p = sample.sample16();
                        int s_old = 0;
                        const int s_ofs = (GetEncoding() == unsignedPCM) ? 0x80 
: 0;
                        for(SmpLength j = 0; j < numSamples; j++)
@@ -1028,7 +1027,7 @@
                                p++;
                                if(sample.uFlags[CHN_STEREO])
                                {
-                                       s_new = (s_new + (static_cast<int>(*p)) 
+ 1) / 2;
+                                       s_new = (s_new + mpt::rshift_signed(*p, 
8) + 1) / 2;
                                        p++;
                                }
                                if(GetEncoding() == deltaPCM)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/Snd_defs.h 
new/libopenmpt-0.4.4+release.autotools/soundlib/Snd_defs.h
--- old/libopenmpt-0.4.3+release.autotools/soundlib/Snd_defs.h  2019-01-28 
23:02:51.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/Snd_defs.h  2019-03-08 
21:52:17.000000000 +0100
@@ -366,14 +366,14 @@
 };
 
 // Plugin velocity handling options
-enum PLUGVELOCITYHANDLING
+enum PlugVelocityHandling : uint8
 {
        PLUGIN_VELOCITYHANDLING_CHANNEL = 0,
        PLUGIN_VELOCITYHANDLING_VOLUME
 };
 
 // Plugin volumecommand handling options
-enum PLUGVOLUMEHANDLING
+enum PlugVolumeHandling : uint8
 {
        PLUGIN_VOLUMEHANDLING_MIDI = 0,
        PLUGIN_VOLUMEHANDLING_DRYWET,
@@ -514,6 +514,7 @@
        kFT2NoteDelayWithoutInstr,      // Sometime between OpenMPT 1.18.03.00 
and 1.19.01.00, delayed instrument-less notes in XM started recalling the 
default sample volume and panning
        kOPLFlexibleNoteOff,            // Full control after note-off over OPL 
voices, ^^^ sends note cut instead of just note-off
        kITInstrWithNoteOffOldEffects,  // Instrument number with note-off 
recalls default volume - special cases with Old Effects enabled
+       kMIDIVolumeOnNoteOffBug,        // Update MIDI channel volume on 
note-off (legacy bug emulation)
 
        // Add new play behaviours here.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/Snd_fx.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/Snd_fx.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/Snd_fx.cpp  2019-02-01 
22:17:25.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/Snd_fx.cpp  2019-02-28 
21:53:19.000000000 +0100
@@ -1452,7 +1452,6 @@
 
        if(returnAfterVolumeAdjust) return;
 
-
        // Instrument adjust
        chn.nNewIns = 0;
 
@@ -4487,6 +4486,15 @@
                                {
                                        chn.nFineTune = MOD2XMFineTune(param);
                                        if(chn.nPeriod && 
chn.rowCommand.IsNote()) chn.nPeriod = GetPeriodFromNote(chn.nNote, 
chn.nFineTune, chn.nC5Speed);
+                               } else if(GetType() == MOD_TYPE_MTM)
+                               {
+                                       if(chn.rowCommand.IsNote() && 
chn.pModSample != nullptr)
+                                       {
+                                               // Effect is permanent in 
MultiTracker
+                                               const_cast<ModSample 
*>(chn.pModSample)->nFineTune = param;
+                                               chn.nFineTune = param;
+                                               if(chn.nPeriod) chn.nPeriod = 
GetPeriodFromNote(chn.nNote, chn.nFineTune, chn.nC5Speed);
+                                       }
                                } else if(chn.rowCommand.IsNote())
                                {
                                        chn.nFineTune = MOD2XMFineTune(param - 
8);
@@ -5837,15 +5845,18 @@
                        return Util::muldiv_unsigned(8363, (FreqS3MTable[note % 
12u] << 5), nC5Speed << (note / 12u));
                        //8363 * freq[note%12] / nC5Speed * 2^(5-note/12)
                }
-       } else if (GetType() == MOD_TYPE_XM)
+       } else if (GetType() & (MOD_TYPE_XM | MOD_TYPE_MTM))
        {
                if (note < 12) note = 12;
                note -= 12;
 
-               // FT2 Compatibility: The lower three bits of the finetune are 
truncated.
-               // Test case: Finetune-Precision.xm
-               if(m_playBehaviour[kFT2FinetunePrecision])
+               if(GetType() == MOD_TYPE_MTM)
+               {
+                       nFineTune *= 16;
+               } else if(m_playBehaviour[kFT2FinetunePrecision])
                {
+                       // FT2 Compatibility: The lower three bits of the 
finetune are truncated.
+                       // Test case: Finetune-Precision.xm
                        nFineTune &= ~7;
                }
 
@@ -5892,7 +5903,7 @@
 uint32 CSoundFile::GetFreqFromPeriod(uint32 period, uint32 c5speed, int32 
nPeriodFrac) const
 {
        if (!period) return 0;
-       if (GetType() == MOD_TYPE_XM)
+       if (GetType() & (MOD_TYPE_XM | MOD_TYPE_MTM))
        {
                if(m_playBehaviour[kFT2Periods])
                {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/Sndfile.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/Sndfile.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/Sndfile.cpp 2019-01-28 
23:02:51.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/Sndfile.cpp 2019-03-06 
17:42:34.000000000 +0100
@@ -711,7 +711,7 @@
 {
 #ifdef ENABLE_ASM
 #ifndef NO_REVERB
-       if(!(GetProcSupport() & PROCSUPPORT_MMX)) DSPMask &= ~SNDDSP_REVERB;
+       if(!(GetRealProcSupport() & PROCSUPPORT_MMX)) DSPMask &= ~SNDDSP_REVERB;
 #endif
 #endif
        m_MixerSettings.DSPMask = DSPMask;
@@ -1163,7 +1163,6 @@
                break;
 
        case MOD_TYPE_MOD:
-               playBehaviour.set(kMODSampleSwap);
                playBehaviour.set(kRowDelayWithNoteDelay);
                break;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/Sndmix.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/Sndmix.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/Sndmix.cpp  2019-02-09 
23:38:18.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/Sndmix.cpp  2019-03-27 
15:25:18.000000000 +0100
@@ -2315,12 +2315,12 @@
                if (chn.pCurrentSample || (chn.HasMIDIOutput() && 
!chn.dwFlags[CHN_KEYOFF | CHN_NOTEFADE]))
                {
                        // Update VU-Meter (nRealVolume is 14-bit)
-                       uint32 vul = (chn.nRealVolume * chn.nRealPan) / (1 << 
14);
+                       uint32 vul = (chn.nRealVolume * (256-chn.nRealPan)) / 
(1 << 14);
                        if (vul > 127) vul = 127;
                        if (chn.nLeftVU > 127) chn.nLeftVU = (uint8)vul;
                        vul /= 2;
                        if (chn.nLeftVU < vul) chn.nLeftVU = (uint8)vul;
-                       uint32 vur = (chn.nRealVolume * (256-chn.nRealPan)) / 
(1 << 14);
+                       uint32 vur = (chn.nRealVolume * chn.nRealPan) / (1 << 
14);
                        if (vur > 127) vur = 127;
                        if (chn.nRightVU > 127) chn.nRightVU = (uint8)vur;
                        vur /= 2;
@@ -2394,13 +2394,13 @@
                        //if (chn.nNewRightVol > 0xFFFF) chn.nNewRightVol = 
0xFFFF;
                        //if (chn.nNewLeftVol > 0xFFFF) chn.nNewLeftVol = 
0xFFFF;
 
-                       if(chn.pModInstrument && 
Resampling::IsKnownMode(chn.pModInstrument->nResampling))
+                       if(chn.pModInstrument && 
Resampling::IsKnownMode(chn.pModInstrument->resampling))
                        {
                                // For defined resampling modes, use 
per-instrument resampling mode if set
-                               chn.resamplingMode = 
static_cast<uint8>(chn.pModInstrument->nResampling);
+                               chn.resamplingMode = 
chn.pModInstrument->resampling;
                        } else if(Resampling::IsKnownMode(m_nResampling))
                        {
-                               chn.resamplingMode = 
static_cast<uint8>(m_nResampling);
+                               chn.resamplingMode = m_nResampling;
                        } else if(m_SongFlags[SONG_ISAMIGA] && 
m_Resampler.m_Settings.emulateAmiga)
                        {
                                // Enforce Amiga resampler for Amiga modules
@@ -2408,7 +2408,7 @@
                        } else
                        {
                                // Default to global mixer settings
-                               chn.resamplingMode = 
static_cast<uint8>(m_Resampler.m_Settings.SrcMode);
+                               chn.resamplingMode = 
m_Resampler.m_Settings.SrcMode;
                        }
 
                        if(chn.increment.IsUnity() && 
!(chn.dwFlags[CHN_VIBRATO] || chn.nAutoVibDepth || chn.resamplingMode == 
SRCMODE_AMIGA))
@@ -2540,11 +2540,13 @@
        if(note != NOTE_NONE)
        {
                int32 velocity = static_cast<int32>(4 * defaultVolume);
-               switch(pIns->nPluginVelocityHandling)
+               switch(pIns->pluginVelocityHandling)
                {
                        case PLUGIN_VELOCITYHANDLING_CHANNEL:
                                velocity = chn.nVolume;
-                       break;
+                               break;
+                       default:
+                               break;
                }
 
                int32 swing = chn.nVolSwing;
@@ -2560,23 +2562,23 @@
                SendMIDINote(nChn, realNote, static_cast<uint16>(velocity));
        }
 
+       const bool processVolumeAlsoOnNote = (pIns->pluginVelocityHandling == 
PLUGIN_VELOCITYHANDLING_VOLUME);
+       const bool hasNote = m_playBehaviour[kMIDIVolumeOnNoteOffBug] ? (note 
!= NOTE_NONE) : ModCommand::IsNote(note);
 
-       const bool processVolumeAlsoOnNote = (pIns->nPluginVelocityHandling == 
PLUGIN_VELOCITYHANDLING_VOLUME);
-
-       if((hasVolCommand && !note) || (note && processVolumeAlsoOnNote))
+       if((hasVolCommand && !hasNote) || (hasNote && processVolumeAlsoOnNote))
        {
-               switch(pIns->nPluginVolumeHandling)
+               switch(pIns->pluginVolumeHandling)
                {
                        case PLUGIN_VOLUMEHANDLING_DRYWET:
                                if(hasVolCommand) pPlugin->SetDryRatio(2 * vol);
                                else pPlugin->SetDryRatio(2 * defaultVolume);
                                break;
-
                        case PLUGIN_VOLUMEHANDLING_MIDI:
                                if(hasVolCommand) 
pPlugin->MidiCC(MIDIEvents::MIDICC_Volume_Coarse, std::min<uint8>(127u, 2u * 
vol), nChn);
                                else 
pPlugin->MidiCC(MIDIEvents::MIDICC_Volume_Coarse, 
static_cast<uint8>(std::min<uint32>(127u, 2u * defaultVolume)), nChn);
                                break;
-
+                       default:
+                               break;
                }
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.3+release.autotools/soundlib/UpgradeModule.cpp 
new/libopenmpt-0.4.4+release.autotools/soundlib/UpgradeModule.cpp
--- old/libopenmpt-0.4.3+release.autotools/soundlib/UpgradeModule.cpp   
2019-01-28 23:02:51.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/soundlib/UpgradeModule.cpp   
2019-03-08 21:52:17.000000000 +0100
@@ -413,6 +413,18 @@
                }
        }
 
+       if(m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 28, 03, 04))
+       {
+               for(INSTRUMENTINDEX i = 1; i <= GetNumInstruments(); i++) if 
(Instruments[i] != nullptr)
+               {
+                       if(Instruments[i]->pluginVolumeHandling == 
PLUGIN_VOLUMEHANDLING_MIDI || Instruments[i]->pluginVolumeHandling == 
PLUGIN_VOLUMEHANDLING_DRYWET)
+                       {
+                               m_playBehaviour.set(kMIDIVolumeOnNoteOffBug);
+                               break;
+                       }
+               }
+       }
+
        Patterns.ForEachModCommand(UpgradePatternData(*this));
 
        // Convert compatibility flags
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.3+release.autotools/test/test.cpp 
new/libopenmpt-0.4.4+release.autotools/test/test.cpp
--- old/libopenmpt-0.4.3+release.autotools/test/test.cpp        2019-01-19 
23:34:55.000000000 +0100
+++ new/libopenmpt-0.4.4+release.autotools/test/test.cpp        2019-03-11 
13:37:56.000000000 +0100
@@ -2598,6 +2598,41 @@
        VERIFY_EQUAL(P_("\\directory\\file.txt").GetFileExt(), P_(".txt"));
        VERIFY_EQUAL(P_("\\directory\\file.txt").GetFullFileName(), 
P_("file.txt"));
 
+       VERIFY_EQUAL(P_(".").GetDrive(), P_(""));
+       VERIFY_EQUAL(P_(".").GetDir(), P_(""));
+       VERIFY_EQUAL(P_(".").GetPath(), P_(""));
+       VERIFY_EQUAL(P_(".").GetFileName(), P_("."));
+       VERIFY_EQUAL(P_(".").GetFileExt(), P_(""));
+       VERIFY_EQUAL(P_(".").GetFullFileName(), P_("."));
+
+       VERIFY_EQUAL(P_("..").GetDrive(), P_(""));
+       VERIFY_EQUAL(P_("..").GetDir(), P_(""));
+       VERIFY_EQUAL(P_("..").GetPath(), P_(""));
+       VERIFY_EQUAL(P_("..").GetFileName(), P_(".."));
+       VERIFY_EQUAL(P_("..").GetFileExt(), P_(""));
+       VERIFY_EQUAL(P_("..").GetFullFileName(), P_(".."));
+
+       VERIFY_EQUAL(P_("dir\\.").GetDrive(), P_(""));
+       VERIFY_EQUAL(P_("dir\\.").GetDir(), P_("dir\\"));
+       VERIFY_EQUAL(P_("dir\\.").GetPath(), P_("dir\\"));
+       VERIFY_EQUAL(P_("dir\\.").GetFileName(), P_("."));
+       VERIFY_EQUAL(P_("dir\\.").GetFileExt(), P_(""));
+       VERIFY_EQUAL(P_("dir\\.").GetFullFileName(), P_("."));
+
+       VERIFY_EQUAL(P_("dir\\..").GetDrive(), P_(""));
+       VERIFY_EQUAL(P_("dir\\..").GetDir(), P_("dir\\"));
+       VERIFY_EQUAL(P_("dir\\..").GetPath(), P_("dir\\"));
+       VERIFY_EQUAL(P_("dir\\..").GetFileName(), P_(".."));
+       VERIFY_EQUAL(P_("dir\\..").GetFileExt(), P_(""));
+       VERIFY_EQUAL(P_("dir\\..").GetFullFileName(), P_(".."));
+
+       VERIFY_EQUAL(P_(".txt").GetDrive(), P_(""));
+       VERIFY_EQUAL(P_(".txt").GetDir(), P_(""));
+       VERIFY_EQUAL(P_(".txt").GetPath(), P_(""));
+       VERIFY_EQUAL(P_(".txt").GetFileName(), P_(".txt"));
+       VERIFY_EQUAL(P_(".txt").GetFileExt(), P_(""));
+       VERIFY_EQUAL(P_(".txt").GetFullFileName(), P_(".txt"));
+
        VERIFY_EQUAL(P_("C:tmp.txt").GetDrive(), P_("C:"));
        VERIFY_EQUAL(P_("C:tmp.txt").GetDir(), P_(""));
        VERIFY_EQUAL(P_("C:tmp.txt").GetPath(), P_("C:"));
@@ -3079,7 +3114,7 @@
        VERIFY_EQUAL_NONCONT(pIns->nPPC, NOTE_MIDDLEC - 1);
 
        VERIFY_EQUAL_NONCONT(pIns->nVolRampUp, 1200);
-       VERIFY_EQUAL_NONCONT(pIns->nResampling, (unsigned)SRCMODE_SINC8LP);
+       VERIFY_EQUAL_NONCONT(pIns->resampling, SRCMODE_SINC8LP);
 
        VERIFY_EQUAL_NONCONT(pIns->IsCutoffEnabled(), false);
        VERIFY_EQUAL_NONCONT(pIns->GetCutoff(), 0);
@@ -3105,8 +3140,8 @@
 
        VERIFY_EQUAL_NONCONT(pIns->pitchToTempoLock, TEMPO(0, 0));
 
-       VERIFY_EQUAL_NONCONT(pIns->nPluginVelocityHandling, 
PLUGIN_VELOCITYHANDLING_VOLUME);
-       VERIFY_EQUAL_NONCONT(pIns->nPluginVolumeHandling, 
PLUGIN_VOLUMEHANDLING_MIDI);
+       VERIFY_EQUAL_NONCONT(pIns->pluginVelocityHandling, 
PLUGIN_VELOCITYHANDLING_VOLUME);
+       VERIFY_EQUAL_NONCONT(pIns->pluginVolumeHandling, 
PLUGIN_VOLUMEHANDLING_MIDI);
 
        for(size_t i = sndFile.GetModSpecifications().noteMin; i < 
sndFile.GetModSpecifications().noteMax; i++)
        {
@@ -3372,7 +3407,7 @@
                VERIFY_EQUAL_NONCONT(pIns->nPPC, (NOTE_MIDDLEC - NOTE_MIN) + 
6);        // F#5
 
                VERIFY_EQUAL_NONCONT(pIns->nVolRampUp, 1200);
-               VERIFY_EQUAL_NONCONT(pIns->nResampling, 
(unsigned)SRCMODE_SINC8LP);
+               VERIFY_EQUAL_NONCONT(pIns->resampling, SRCMODE_SINC8LP);
 
                VERIFY_EQUAL_NONCONT(pIns->IsCutoffEnabled(), true);
                VERIFY_EQUAL_NONCONT(pIns->GetCutoff(), 0x32);
@@ -3399,8 +3434,8 @@
 
                VERIFY_EQUAL_NONCONT(pIns->pitchToTempoLock, TEMPO(130, 2000));
 
-               VERIFY_EQUAL_NONCONT(pIns->nPluginVelocityHandling, 
PLUGIN_VELOCITYHANDLING_VOLUME);
-               VERIFY_EQUAL_NONCONT(pIns->nPluginVolumeHandling, 
PLUGIN_VOLUMEHANDLING_MIDI);
+               VERIFY_EQUAL_NONCONT(pIns->pluginVelocityHandling, 
PLUGIN_VELOCITYHANDLING_VOLUME);
+               VERIFY_EQUAL_NONCONT(pIns->pluginVolumeHandling, 
PLUGIN_VOLUMEHANDLING_MIDI);
 
                for(size_t i = 0; i < NOTE_MAX; i++)
                {


Reply via email to