Hello community,

here is the log from the commit of package libopenmpt for openSUSE:Factory 
checked in at 2020-04-15 19:53:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libopenmpt (Old)
 and      /work/SRC/openSUSE:Factory/.libopenmpt.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libopenmpt"

Wed Apr 15 19:53:05 2020 rev:24 rq:793695 version:0.4.12

Changes:
--------
--- /work/SRC/openSUSE:Factory/libopenmpt/libopenmpt.changes    2020-02-03 
11:12:13.981812019 +0100
+++ /work/SRC/openSUSE:Factory/.libopenmpt.new.2738/libopenmpt.changes  
2020-04-15 19:53:07.269561828 +0200
@@ -1,0 +2,12 @@
+Mon Apr 13 21:59:44 UTC 2020 - Mia Herkt <[email protected]>
+
+- Update to 0.4.12:
+  * IT: Vibrato was too fast in Old Effects mode since
+    libopenmpt 0.3.
+  * XM: Treat 8bitbubsy’s FT2 clone exactly like Fasttracker 2 with
+    respect to compatibility and playback flags. For example,
+    FT2 Pan Law was not applied.
+  * DMF: Some files had a wrong tempo since
+    libopenmpt 0.2.5705-beta15.
+
+-------------------------------------------------------------------

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

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

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

Other differences:
------------------
++++++ libopenmpt.spec ++++++
--- /var/tmp/diff_new_pack.CDd8Mi/_old  2020-04-15 19:53:08.641562447 +0200
+++ /var/tmp/diff_new_pack.CDd8Mi/_new  2020-04-15 19:53:08.645562448 +0200
@@ -20,7 +20,7 @@
 %define libopenmpt libopenmpt0
 %define libopenmpt_modplug libopenmpt_modplug1
 Name:           libopenmpt
-Version:        0.4.11
+Version:        0.4.12
 Release:        0
 Summary:        C++ and C library to decode tracker music files
 License:        BSD-3-Clause

++++++ libopenmpt-0.4.11+release.autotools.tar.gz -> 
libopenmpt-0.4.12+release.autotools.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.11+release.autotools/LICENSE 
new/libopenmpt-0.4.12+release.autotools/LICENSE
--- old/libopenmpt-0.4.11+release.autotools/LICENSE     2019-01-01 
10:10:16.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/LICENSE     2020-01-01 
09:49:37.000000000 +0100
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2019, OpenMPT contributors
+Copyright (c) 2004-2020, OpenMPT contributors
 Copyright (c) 1997-2003, Olivier Lapicque
 All rights reserved.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/common/mptFileIO.h 
new/libopenmpt-0.4.12+release.autotools/common/mptFileIO.h
--- old/libopenmpt-0.4.11+release.autotools/common/mptFileIO.h  2018-12-22 
11:22:35.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/common/mptFileIO.h  2020-03-15 
19:25:13.000000000 +0100
@@ -181,7 +181,7 @@
 private:
        FlushMode m_FlushMode;
 #if MPT_COMPILER_MSVC
-       FILE *m_f;
+       FILE *m_f = nullptr;
 #endif // MPT_COMPILER_MSVC
        mpt::ofstream m_s;
 #if MPT_COMPILER_MSVC
@@ -198,6 +198,8 @@
                , m_s(filename, mode)
 #endif // MPT_COMPILER_MSVC
        {
+               if(!stream().is_open())
+                       stream().setstate(mpt::ofstream::failbit);
        }
        mpt::ofstream& stream()
        {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.11+release.autotools/common/mptUUID.h 
new/libopenmpt-0.4.12+release.autotools/common/mptUUID.h
--- old/libopenmpt-0.4.11+release.autotools/common/mptUUID.h    2018-07-16 
14:07:14.000000000 +0200
+++ new/libopenmpt-0.4.12+release.autotools/common/mptUUID.h    2020-02-11 
14:03:19.000000000 +0100
@@ -15,6 +15,8 @@
 
 #include "Endianness.h"
 
+#include <stdexcept>
+
 #if MPT_OS_WINDOWS
 #if defined(MODPLUG_TRACKER) || !defined(NO_DMO)
 #include <guiddef.h>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/common/version.cpp 
new/libopenmpt-0.4.12+release.autotools/common/version.cpp
--- old/libopenmpt-0.4.11+release.autotools/common/version.cpp  2019-01-01 
10:10:16.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/common/version.cpp  2020-01-01 
09:49:37.000000000 +0100
@@ -595,12 +595,12 @@
                "libopenmpt (based on OpenMPT / ModPlug Tracker)\n"
 #endif
                "\n"
-               "Copyright \xC2\xA9 2004-2019 Contributors\n"
+               "Copyright \xC2\xA9 2004-2020 Contributors\n"
                "Copyright \xC2\xA9 1997-2003 Olivier Lapicque\n"
                "\n"
                "Contributors:\n"
-               "Johannes Schultz (2008-2019)\n"
-               "J\xC3\xB6rn Heusipp (2012-2019)\n"
+               "Johannes Schultz (2008-2020)\n"
+               "J\xC3\xB6rn Heusipp (2012-2020)\n"
                "Ahti Lepp\xC3\xA4nen (2005-2011)\n"
                "Robin Fernandes (2004-2007)\n"
                "Sergiy Pylypenko (2007)\n"
@@ -785,7 +785,7 @@
 mpt::ustring GetLicenseString()
 {
        return MPT_UTF8(
-               "Copyright (c) 2004-2019, OpenMPT contributors" "\n"
+               "Copyright (c) 2004-2020, OpenMPT contributors" "\n"
                "Copyright (c) 1997-2003, Olivier Lapicque" "\n"
                "All rights reserved." "\n"
                "" "\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/common/versionNumber.h 
new/libopenmpt-0.4.12+release.autotools/common/versionNumber.h
--- old/libopenmpt-0.4.11+release.autotools/common/versionNumber.h      
2019-12-22 17:14:06.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/common/versionNumber.h      
2020-04-13 15:02:52.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      09
+#define VER_MINOR      10
 #define VER_MINORMINOR 00
 
 //Numerical value of the version.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.11+release.autotools/configure 
new/libopenmpt-0.4.12+release.autotools/configure
--- old/libopenmpt-0.4.11+release.autotools/configure   2019-12-22 
20:21:08.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/configure   2020-04-13 
15:44:56.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.11+release.autotools.
+# Generated by GNU Autoconf 2.69 for libopenmpt 0.4.12+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.11+release.autotools'
-PACKAGE_STRING='libopenmpt 0.4.11+release.autotools'
+PACKAGE_VERSION='0.4.12+release.autotools'
+PACKAGE_STRING='libopenmpt 0.4.12+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.11+release.autotools to adapt to many 
kinds of systems.
+\`configure' configures libopenmpt 0.4.12+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.11+release.autotools:";;
+     short | recursive ) echo "Configuration of libopenmpt 
0.4.12+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.11+release.autotools
+libopenmpt configure 0.4.12+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.11+release.autotools, which was
+It was created by libopenmpt $as_me 0.4.12+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.11+release.autotools'
+ VERSION='0.4.12+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.11\""; >>confdefs.h
+$as_echo "#define MPT_SVNURL 
\"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.4.12\""; >>confdefs.h
 
 
-$as_echo "#define MPT_SVNVERSION \"12392\"" >>confdefs.h
+$as_echo "#define MPT_SVNVERSION \"12633\"" >>confdefs.h
 
 
-$as_echo "#define MPT_SVNDATE \"2019-12-22T19:09:25.374363Z\"" >>confdefs.h
+$as_echo "#define MPT_SVNDATE \"2020-04-13T13:25:04.191224Z\"" >>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.11+release.autotools, which was
+This file was extended by libopenmpt $as_me 0.4.12+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.11+release.autotools
+libopenmpt config.status 0.4.12+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.11+release.autotools/configure.ac 
new/libopenmpt-0.4.12+release.autotools/configure.ac
--- old/libopenmpt-0.4.11+release.autotools/configure.ac        2019-12-22 
20:20:58.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/configure.ac        2020-04-13 
15:44:47.000000000 +0200
@@ -1,4 +1,4 @@
-AC_INIT([libopenmpt], [0.4.11+release.autotools], [https://bugs.openmpt.org/], 
[libopenmpt], [https://lib.openmpt.org/])
+AC_INIT([libopenmpt], [0.4.12+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.11";], [svn 
version])
-AC_DEFINE([MPT_SVNVERSION], ["12392"], [svn version])
-AC_DEFINE([MPT_SVNDATE], ["2019-12-22T19:09:25.374363Z"], [svn date])
+AC_DEFINE([MPT_SVNURL], 
["https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.4.12";], [svn 
version])
+AC_DEFINE([MPT_SVNVERSION], ["12633"], [svn version])
+AC_DEFINE([MPT_SVNDATE], ["2020-04-13T13:25:04.191224Z"], [svn date])
 AC_DEFINE([MPT_PACKAGE], [true], [is package])
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/libopenmpt/dox/changelog.md 
new/libopenmpt-0.4.12+release.autotools/libopenmpt/dox/changelog.md
--- old/libopenmpt-0.4.11+release.autotools/libopenmpt/dox/changelog.md 
2019-12-22 20:09:19.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/libopenmpt/dox/changelog.md 
2020-04-13 15:25:01.000000000 +0200
@@ -5,6 +5,13 @@
 For fully detailed change log, please see the source repository directly. This
 is just a high-level summary.
 
+### libopenmpt 0.4.12 (2020-04-13)
+
+ *  IT: Vibrato was too fast in Old Effects mode since libopenmpt 0.3.
+ *  XM: Treat 8bitbubsy's FT2 clone exactly like Fasttracker 2 with respect to
+    compatibility and playback flags. For example, FT2 Pan Law was not applied.
+ *  DMF: Some files had a wrong tempo since libopenmpt 0.2.5705-beta15.
+
 ### libopenmpt 0.4.11 (2019-12-22)
 
  *  MOD: Fix initial instrument change with no note playing. Fixes first 
pattern
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/libopenmpt/libopenmpt_c.cpp 
new/libopenmpt-0.4.12+release.autotools/libopenmpt/libopenmpt_c.cpp
--- old/libopenmpt-0.4.11+release.autotools/libopenmpt/libopenmpt_c.cpp 
2018-07-05 14:36:28.000000000 +0200
+++ new/libopenmpt-0.4.12+release.autotools/libopenmpt/libopenmpt_c.cpp 
2020-01-07 16:33:04.000000000 +0100
@@ -924,7 +924,7 @@
        return NULL;
 }
 
-LIBOPENMPT_API int32_t openmpt_module_get_current_speed( openmpt_module * mod 
) {
+int32_t openmpt_module_get_current_speed( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_speed();
@@ -933,7 +933,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_current_tempo( openmpt_module * mod 
) {
+int32_t openmpt_module_get_current_tempo( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_tempo();
@@ -942,7 +942,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_current_order( openmpt_module * mod 
) {
+int32_t openmpt_module_get_current_order( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_order();
@@ -951,7 +951,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_current_pattern( openmpt_module * 
mod ) {
+int32_t openmpt_module_get_current_pattern( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_pattern();
@@ -960,7 +960,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_current_row( openmpt_module * mod ) {
+int32_t openmpt_module_get_current_row( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_row();
@@ -969,7 +969,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_current_playing_channels( 
openmpt_module * mod ) {
+int32_t openmpt_module_get_current_playing_channels( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_playing_channels();
@@ -979,7 +979,7 @@
        return 0;
 }
 
-LIBOPENMPT_API float openmpt_module_get_current_channel_vu_mono( 
openmpt_module * mod, int32_t channel ) {
+float openmpt_module_get_current_channel_vu_mono( openmpt_module * mod, 
int32_t channel ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_channel_vu_mono( channel );
@@ -988,7 +988,7 @@
        }
        return 0.0;
 }
-LIBOPENMPT_API float openmpt_module_get_current_channel_vu_left( 
openmpt_module * mod, int32_t channel ) {
+float openmpt_module_get_current_channel_vu_left( openmpt_module * mod, 
int32_t channel ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_channel_vu_left( channel );
@@ -997,7 +997,7 @@
        }
        return 0.0;
 }
-LIBOPENMPT_API float openmpt_module_get_current_channel_vu_right( 
openmpt_module * mod, int32_t channel ) {
+float openmpt_module_get_current_channel_vu_right( openmpt_module * mod, 
int32_t channel ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_channel_vu_right( channel );
@@ -1006,7 +1006,7 @@
        }
        return 0.0;
 }
-LIBOPENMPT_API float openmpt_module_get_current_channel_vu_rear_left( 
openmpt_module * mod, int32_t channel ) {
+float openmpt_module_get_current_channel_vu_rear_left( openmpt_module * mod, 
int32_t channel ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_channel_vu_rear_left( channel );
@@ -1015,7 +1015,7 @@
        }
        return 0.0;
 }
-LIBOPENMPT_API float openmpt_module_get_current_channel_vu_rear_right( 
openmpt_module * mod, int32_t channel ) {
+float openmpt_module_get_current_channel_vu_rear_right( openmpt_module * mod, 
int32_t channel ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_current_channel_vu_rear_right( channel );
@@ -1025,7 +1025,7 @@
        return 0.0;
 }
 
-LIBOPENMPT_API int32_t openmpt_module_get_num_subsongs( openmpt_module * mod ) 
{
+int32_t openmpt_module_get_num_subsongs( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_num_subsongs();
@@ -1034,7 +1034,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_num_channels( openmpt_module * mod ) 
{
+int32_t openmpt_module_get_num_channels( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_num_channels();
@@ -1043,7 +1043,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_num_orders( openmpt_module * mod ) {
+int32_t openmpt_module_get_num_orders( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_num_orders();
@@ -1052,7 +1052,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_num_patterns( openmpt_module * mod ) 
{
+int32_t openmpt_module_get_num_patterns( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_num_patterns();
@@ -1061,7 +1061,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_num_instruments( openmpt_module * 
mod ) {
+int32_t openmpt_module_get_num_instruments( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_num_instruments();
@@ -1070,7 +1070,7 @@
        }
        return 0;
 }
-LIBOPENMPT_API int32_t openmpt_module_get_num_samples( openmpt_module * mod ) {
+int32_t openmpt_module_get_num_samples( openmpt_module * mod ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_num_samples();
@@ -1080,7 +1080,7 @@
        return 0;
 }
 
-LIBOPENMPT_API const char * openmpt_module_get_subsong_name( openmpt_module * 
mod, int32_t index ) {
+const char * openmpt_module_get_subsong_name( openmpt_module * mod, int32_t 
index ) {
        try {
                openmpt::interface::check_soundfile( mod );
                std::vector<std::string> names = mod->impl->get_subsong_names();
@@ -1096,7 +1096,7 @@
        }
        return NULL;
 }
-LIBOPENMPT_API const char * openmpt_module_get_channel_name( openmpt_module * 
mod, int32_t index ) {
+const char * openmpt_module_get_channel_name( openmpt_module * mod, int32_t 
index ) {
        try {
                openmpt::interface::check_soundfile( mod );
                std::vector<std::string> names = mod->impl->get_channel_names();
@@ -1112,7 +1112,7 @@
        }
        return NULL;
 }
-LIBOPENMPT_API const char * openmpt_module_get_order_name( openmpt_module * 
mod, int32_t index ) {
+const char * openmpt_module_get_order_name( openmpt_module * mod, int32_t 
index ) {
        try {
                openmpt::interface::check_soundfile( mod );
                std::vector<std::string> names = mod->impl->get_order_names();
@@ -1128,7 +1128,7 @@
        }
        return NULL;
 }
-LIBOPENMPT_API const char * openmpt_module_get_pattern_name( openmpt_module * 
mod, int32_t index ) {
+const char * openmpt_module_get_pattern_name( openmpt_module * mod, int32_t 
index ) {
        try {
                openmpt::interface::check_soundfile( mod );
                std::vector<std::string> names = mod->impl->get_pattern_names();
@@ -1144,7 +1144,7 @@
        }
        return NULL;
 }
-LIBOPENMPT_API const char * openmpt_module_get_instrument_name( openmpt_module 
* mod, int32_t index ) {
+const char * openmpt_module_get_instrument_name( openmpt_module * mod, int32_t 
index ) {
        try {
                openmpt::interface::check_soundfile( mod );
                std::vector<std::string> names = 
mod->impl->get_instrument_names();
@@ -1160,7 +1160,7 @@
        }
        return NULL;
 }
-LIBOPENMPT_API const char * openmpt_module_get_sample_name( openmpt_module * 
mod, int32_t index ) {
+const char * openmpt_module_get_sample_name( openmpt_module * mod, int32_t 
index ) {
        try {
                openmpt::interface::check_soundfile( mod );
                std::vector<std::string> names = mod->impl->get_sample_names();
@@ -1177,7 +1177,7 @@
        return NULL;
 }
 
-LIBOPENMPT_API int32_t openmpt_module_get_order_pattern( openmpt_module * mod, 
int32_t order ) {
+int32_t openmpt_module_get_order_pattern( openmpt_module * mod, int32_t order 
) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_order_pattern( order );
@@ -1187,7 +1187,7 @@
        return 0;
 }
 
-LIBOPENMPT_API int32_t openmpt_module_get_pattern_num_rows( openmpt_module * 
mod, int32_t pattern ) {
+int32_t openmpt_module_get_pattern_num_rows( openmpt_module * mod, int32_t 
pattern ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_pattern_num_rows( pattern );
@@ -1197,7 +1197,7 @@
        return 0;
 }
 
-LIBOPENMPT_API uint8_t openmpt_module_get_pattern_row_channel_command( 
openmpt_module * mod, int32_t pattern, int32_t row, int32_t channel, int 
command ) {
+uint8_t openmpt_module_get_pattern_row_channel_command( openmpt_module * mod, 
int32_t pattern, int32_t row, int32_t channel, int command ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return mod->impl->get_pattern_row_channel_command( pattern, 
row, channel, command );
@@ -1207,7 +1207,7 @@
        return 0;
 }
 
-LIBOPENMPT_API const char * openmpt_module_format_pattern_row_channel_command( 
openmpt_module * mod, int32_t pattern, int32_t row, int32_t channel, int 
command ) {
+const char * openmpt_module_format_pattern_row_channel_command( openmpt_module 
* mod, int32_t pattern, int32_t row, int32_t channel, int command ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return openmpt::strdup( 
mod->impl->format_pattern_row_channel_command( pattern, row, channel, command 
).c_str() );
@@ -1217,7 +1217,7 @@
        return 0;
 }
 
-LIBOPENMPT_API const char * 
openmpt_module_highlight_pattern_row_channel_command( openmpt_module * mod, 
int32_t pattern, int32_t row, int32_t channel, int command ) {
+const char * openmpt_module_highlight_pattern_row_channel_command( 
openmpt_module * mod, int32_t pattern, int32_t row, int32_t channel, int 
command ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return openmpt::strdup( 
mod->impl->highlight_pattern_row_channel_command( pattern, row, channel, 
command ).c_str() );
@@ -1227,7 +1227,7 @@
        return 0;
 }
 
-LIBOPENMPT_API const char * openmpt_module_format_pattern_row_channel( 
openmpt_module * mod, int32_t pattern, int32_t row, int32_t channel, size_t 
width, int pad ) {
+const char * openmpt_module_format_pattern_row_channel( openmpt_module * mod, 
int32_t pattern, int32_t row, int32_t channel, size_t width, int pad ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return openmpt::strdup( mod->impl->format_pattern_row_channel( 
pattern, row, channel, width, pad ? true : false ).c_str() );
@@ -1237,7 +1237,7 @@
        return 0;
 }
 
-LIBOPENMPT_API const char * openmpt_module_highlight_pattern_row_channel( 
openmpt_module * mod, int32_t pattern, int32_t row, int32_t channel, size_t 
width, int pad ) {
+const char * openmpt_module_highlight_pattern_row_channel( openmpt_module * 
mod, int32_t pattern, int32_t row, int32_t channel, size_t width, int pad ) {
        try {
                openmpt::interface::check_soundfile( mod );
                return openmpt::strdup( 
mod->impl->highlight_pattern_row_channel( pattern, row, channel, width, pad ? 
true : false ).c_str() );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/libopenmpt/libopenmpt_version.h 
new/libopenmpt-0.4.12+release.autotools/libopenmpt/libopenmpt_version.h
--- old/libopenmpt-0.4.11+release.autotools/libopenmpt/libopenmpt_version.h     
2019-12-22 20:09:19.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/libopenmpt/libopenmpt_version.h     
2020-04-13 15:25:01.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 11
+#define OPENMPT_API_VERSION_PATCH 12
 /*! \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.11+release.autotools/libopenmpt/libopenmpt_version.mk 
new/libopenmpt-0.4.12+release.autotools/libopenmpt/libopenmpt_version.mk
--- old/libopenmpt-0.4.11+release.autotools/libopenmpt/libopenmpt_version.mk    
2019-12-22 20:09:19.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/libopenmpt/libopenmpt_version.mk    
2020-04-13 15:25:01.000000000 +0200
@@ -1,8 +1,8 @@
 LIBOPENMPT_VERSION_MAJOR=0
 LIBOPENMPT_VERSION_MINOR=4
-LIBOPENMPT_VERSION_PATCH=11
+LIBOPENMPT_VERSION_PATCH=12
 LIBOPENMPT_VERSION_PREREL=
 
 LIBOPENMPT_LTVER_CURRENT=1
-LIBOPENMPT_LTVER_REVISION=11
+LIBOPENMPT_LTVER_REVISION=12
 LIBOPENMPT_LTVER_AGE=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.4.11+release.autotools/man/openmpt123.1 
new/libopenmpt-0.4.12+release.autotools/man/openmpt123.1
--- old/libopenmpt-0.4.11+release.autotools/man/openmpt123.1    2019-12-22 
20:20:58.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/man/openmpt123.1    2020-04-13 
15:44:46.000000000 +0200
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.4.
-.TH OPENMPT123 "1" "December 2019" "openmpt123 v0.4.11" "User Commands"
+.TH OPENMPT123 "1" "April 2020" "openmpt123 v0.4.12" "User Commands"
 .SH NAME
 openmpt123 - command line module music player based on libopenmpt
 .SH SYNOPSIS
@@ -163,4 +163,4 @@
 \fB\-\-\fR
 Interpret further arguments as filenames
 .SH COPYRIGHT
-Copyright \(co 2013\-2019 OpenMPT developers <https://lib.openmpt.org/>
+Copyright \(co 2013\-2020 OpenMPT developers <https://lib.openmpt.org/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/openmpt123/openmpt123.cpp 
new/libopenmpt-0.4.12+release.autotools/openmpt123/openmpt123.cpp
--- old/libopenmpt-0.4.11+release.autotools/openmpt123/openmpt123.cpp   
2019-01-01 10:10:16.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/openmpt123/openmpt123.cpp   
2020-01-01 09:49:37.000000000 +0100
@@ -8,7 +8,7 @@
  */
 
 static const char * const license =
-"Copyright (c) 2004-2019, OpenMPT contributors" "\n"
+"Copyright (c) 2004-2020, OpenMPT contributors" "\n"
 "Copyright (c) 1997-2003, Olivier Lapicque" "\n"
 "All rights reserved." "\n"
 "" "\n"
@@ -441,7 +441,7 @@
 
 static void show_info( std::ostream & log, bool verbose ) {
        log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << ", 
libopenmpt " << openmpt::string::get( "library_version" ) << " (" << "OpenMPT " 
<< openmpt::string::get( "core_version" ) << ")" << std::endl;
-       log << "Copyright (c) 2013-2019 OpenMPT developers 
<https://lib.openmpt.org/>" << std::endl;
+       log << "Copyright (c) 2013-2020 OpenMPT developers 
<https://lib.openmpt.org/>" << std::endl;
        if ( !verbose ) {
                log << std::endl;
                return;
@@ -530,7 +530,7 @@
 static void show_man_version( textout & log ) {
        log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << std::endl;
        log << std::endl;
-       log << "Copyright (c) 2013-2019 OpenMPT developers 
<https://lib.openmpt.org/>" << std::endl;
+       log << "Copyright (c) 2013-2020 OpenMPT developers 
<https://lib.openmpt.org/>" << std::endl;
 }
 
 static void show_short_version( textout & log ) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/openmpt123/openmpt123_sdl.hpp 
new/libopenmpt-0.4.12+release.autotools/openmpt123/openmpt123_sdl.hpp
--- old/libopenmpt-0.4.11+release.autotools/openmpt123/openmpt123_sdl.hpp       
2018-07-05 14:23:04.000000000 +0200
+++ new/libopenmpt-0.4.12+release.autotools/openmpt123/openmpt123_sdl.hpp       
2019-12-25 09:41:04.000000000 +0100
@@ -26,7 +26,14 @@
 namespace openmpt123 {
 
 struct sdl_exception : public exception {
-       sdl_exception( int /*code*/ ) : exception( "SDL error" ) { }
+private:
+       static std::string text_from_code( int code ) {
+               std::ostringstream s;
+               s << code;
+               return s.str();
+       }
+public:
+       sdl_exception( int code, const char * error ) : exception( 
text_from_code( code ) + " (" + ( error ? std::string(error) : 
std::string("NULL") ) + ")" ) { }
 };
 
 class sdl_stream_raii : public write_buffers_blocking_wrapper {
@@ -36,8 +43,7 @@
 protected:
        void check_sdl_error( int e ) {
                if ( e < 0 ) {
-                       throw sdl_exception( e );
-                       return;
+                       throw sdl_exception( e, SDL_GetError() );
                }
        }
        std::uint32_t round_up_power2(std::uint32_t x)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/openmpt123/openmpt123_sdl2.hpp 
new/libopenmpt-0.4.12+release.autotools/openmpt123/openmpt123_sdl2.hpp
--- old/libopenmpt-0.4.11+release.autotools/openmpt123/openmpt123_sdl2.hpp      
2018-07-05 14:23:04.000000000 +0200
+++ new/libopenmpt-0.4.12+release.autotools/openmpt123/openmpt123_sdl2.hpp      
2019-12-25 09:41:04.000000000 +0100
@@ -26,13 +26,19 @@
 namespace openmpt123 {
 
 struct sdl2_exception : public exception {
-       sdl2_exception( int /*code*/ ) : exception( "SDL2 error" ) { }
+private:
+       static std::string text_from_code( int code ) {
+               std::ostringstream s;
+               s << code;
+               return s.str();
+       }
+public:
+       sdl2_exception( int code, const char * error ) : exception( 
text_from_code( code ) + " (" + ( error ? std::string(error) : 
std::string("NULL") ) + ")" ) { }
 };
 
 static void check_sdl2_error( int e ) {
        if ( e < 0 ) {
-               throw sdl2_exception( e );
-               return;
+               throw sdl2_exception( e, SDL_GetError() );
        }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/soundlib/Load_dmf.cpp 
new/libopenmpt-0.4.12+release.autotools/soundlib/Load_dmf.cpp
--- old/libopenmpt-0.4.11+release.autotools/soundlib/Load_dmf.cpp       
2018-12-06 15:29:05.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/soundlib/Load_dmf.cpp       
2020-03-21 21:42:27.000000000 +0100
@@ -466,18 +466,16 @@
                                //const int tickspeed = (tempoRealBPMmode) ? 
MAX(1, (tempoData * beat * 4) / 60) : tempoData;
                                const int tickspeed = (settings.realBPMmode) ? 
std::max(1, settings.tempoBPM * settings.beat * 2) : ((settings.tempoTicks + 1) 
* 30);
                                // Try to find matching speed - try higher 
speeds first, so that effects like arpeggio and tremor work better.
-                               for(speed = 255; speed > 2; speed--)
+                               for(speed = 255; speed >= 1; speed--)
                                {
                                        // Original unoptimized formula:
                                        // tempo = 30 * tickspeed * speed / 48;
                                        tempo = tickspeed * speed / 48;
                                        if(tempo >= 32 && tempo <= 255)
-                                       {
                                                break;
-                                       }
                                }
                                Limit(tempo, 32, 255);
-                               settings.internalTicks = (uint8)speed;
+                               settings.internalTicks = 
static_cast<uint8>(std::max(1, speed));
                        } else
                        {
                                tempoChange = false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/soundlib/Load_xm.cpp 
new/libopenmpt-0.4.12+release.autotools/soundlib/Load_xm.cpp
--- old/libopenmpt-0.4.11+release.autotools/soundlib/Load_xm.cpp        
2018-12-06 15:29:05.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/soundlib/Load_xm.cpp        
2020-03-21 14:34:15.000000000 +0100
@@ -361,6 +361,10 @@
                        {
                                m_nMixLevels = mixLevelsCompatibleFT2;
                        }
+               } else if(!memcmp(fileHeader.trackerName, "Fasttracker II 
clone", 20))
+               {
+                       // 8bitbubsy's FT2 clone should be treated exactly like 
FT2
+                       madeWith = verFT2Generic | verConfirmed;
                } else if(!memcmp(fileHeader.trackerName, "MadTracker 2.0\0", 
15))
                {
                        // Fix channel 2 in m3_cha.xm
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/soundlib/ModSample.cpp 
new/libopenmpt-0.4.12+release.autotools/soundlib/ModSample.cpp
--- old/libopenmpt-0.4.11+release.autotools/soundlib/ModSample.cpp      
2019-03-19 21:54:13.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/soundlib/ModSample.cpp      
2020-03-29 16:16:41.000000000 +0200
@@ -125,6 +125,7 @@
 // Initialize sample slot with default values.
 void ModSample::Initialize(MODTYPE type)
 {
+       FreeSample();
        nLength = 0;
        nLoopStart = nLoopEnd = 0;
        nSustainStart = nSustainEnd = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/soundlib/Snd_fx.cpp 
new/libopenmpt-0.4.12+release.autotools/soundlib/Snd_fx.cpp
--- old/libopenmpt-0.4.11+release.autotools/soundlib/Snd_fx.cpp 2019-11-01 
16:17:56.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/soundlib/Snd_fx.cpp 2020-04-07 
20:02:25.000000000 +0200
@@ -127,22 +127,21 @@
                        if(i >= portaStart)
                        {
                                chn.isFirstTick = false;
-                               const ModCommand &p = 
*sndFile.Patterns[state->m_nPattern].GetpModCommand(state->m_nRow, channel);
-                               if(p.command == CMD_TONEPORTAMENTO) 
sndFile.TonePortamento(chn, p.param);
-                               else if(p.command == CMD_TONEPORTAVOL) 
sndFile.TonePortamento(chn, 0);
-                               if(p.volcmd == VOLCMD_TONEPORTAMENTO)
-                               {
-                                       uint32 param = p.vol;
-                                       if(sndFile.GetType() & (MOD_TYPE_IT | 
MOD_TYPE_MPT | MOD_TYPE_AMS | MOD_TYPE_DMF | MOD_TYPE_DBM | MOD_TYPE_IMF | 
MOD_TYPE_PSM | MOD_TYPE_J2B | MOD_TYPE_ULT | MOD_TYPE_OKT | MOD_TYPE_MT2 | 
MOD_TYPE_MDL))
-                                       {
-                                               param = 
ImpulseTrackerPortaVolCmd[param & 0x0F];
-                                       } else
-                                       {
-                                               // Close enough. Do not bother 
with idiosyncratic FT2 behaviour here.
-                                               param <<= 4;
-                                       }
-                                       sndFile.TonePortamento(chn, param);
-                               }
+                               const ModCommand &m = 
*sndFile.Patterns[state->m_nPattern].GetpModCommand(state->m_nRow, channel);
+                               auto command = m.command;
+                               if(m.volcmd == VOLCMD_TONEPORTAMENTO)
+                               {
+                                       const auto retVal = 
sndFile.GetVolCmdTonePorta(m, 0);
+                                       const auto porta = retVal.first;
+                                       const auto clearEffectCommand = 
retVal.second;
+                                       sndFile.TonePortamento(chn, porta);
+                                       if(clearEffectCommand)
+                                               command = CMD_NONE;
+                               }
+                               if(command == CMD_TONEPORTAMENTO)
+                                       sndFile.TonePortamento(chn, m.param);
+                               else if(command == CMD_TONEPORTAVOL)
+                                       sndFile.TonePortamento(chn, 0);
                                updateInc = true;
                        }
 
@@ -571,6 +570,17 @@
                                if(chn.rowCommand.vol != 0)
                                        chn.nOldVolParam = chn.rowCommand.vol;
                                break;
+                       case VOLCMD_TONEPORTAMENTO:
+                               if(chn.rowCommand.vol)
+                               {
+                                       const auto retVal = 
GetVolCmdTonePorta(chn.rowCommand, 0);
+                                       const auto porta = retVal.first;
+                                       const auto clearEffectCommand = 
retVal.second;
+                                       chn.nPortamentoSlide = porta * 4;
+                                       if(clearEffectCommand)
+                                               command = CMD_NONE;
+                               }
+                               break;
                        }
 
                        switch(command)
@@ -2959,30 +2969,13 @@
                {
                        if (volcmd == VOLCMD_TONEPORTAMENTO)
                        {
-                               uint32 porta = 0;
-                               if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | 
MOD_TYPE_AMS | MOD_TYPE_DMF | MOD_TYPE_DBM | MOD_TYPE_IMF | MOD_TYPE_PSM | 
MOD_TYPE_J2B | MOD_TYPE_ULT | MOD_TYPE_OKT | MOD_TYPE_MT2 | MOD_TYPE_MDL))
-                               {
-                                       porta = ImpulseTrackerPortaVolCmd[vol & 
0x0F];
-                               } else
-                               {
-                                       if(cmd == CMD_TONEPORTAMENTO && 
GetType() == MOD_TYPE_XM)
-                                       {
-                                               // Yes, FT2 is *that* weird. If 
there is a Mx command in the volume column
-                                               // and a normal 3xx command, 
the 3xx command is ignored but the Mx command's
-                                               // effectiveness is doubled.
-                                               // Test case: 
TonePortamentoMemory.xm
-                                               cmd = CMD_NONE;
-                                               vol *= 2;
-                                       }
-                                       porta = vol << 4;
-
-                                       // FT2 compatibility: If there's a 
portamento and a note delay, execute the portamento, but don't update the 
parameter
-                                       // Test case: PortaDelay.xm
-                                       if(m_playBehaviour[kFT2PortaDelay] && 
nStartTick != 0)
-                                       {
-                                               porta = 0;
-                                       }
-                               }
+                               const auto retVal = 
GetVolCmdTonePorta(chn.rowCommand, nStartTick);
+                               const auto porta = retVal.first;
+                               const auto clearEffectCommand = retVal.second;
+
+                               if(clearEffectCommand)
+                                       cmd = CMD_NONE;
+
                                TonePortamento(chn, porta);
                        } else
                        {
@@ -4026,6 +4019,36 @@
        }
 }
 
+
+std::pair<uint32, bool> CSoundFile::GetVolCmdTonePorta(const ModCommand &m, 
uint32 startTick) const
+{
+       if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_AMS | 
MOD_TYPE_DMF | MOD_TYPE_DBM | MOD_TYPE_IMF | MOD_TYPE_PSM | MOD_TYPE_J2B | 
MOD_TYPE_ULT | MOD_TYPE_OKT | MOD_TYPE_MT2 | MOD_TYPE_MDL))
+       {
+               return {ImpulseTrackerPortaVolCmd[m.vol & 0x0F], false};
+       } else
+       {
+               bool clearEffectColumn = false;
+               uint32 vol = m.vol;
+               if(m.command == CMD_TONEPORTAMENTO && GetType() == MOD_TYPE_XM)
+               {
+                       // Yes, FT2 is *that* weird. If there is a Mx command 
in the volume column
+                       // and a normal 3xx command, the 3xx command is ignored 
but the Mx command's
+                       // effectiveness is doubled.
+                       // Test case: TonePortamentoMemory.xm
+                       clearEffectColumn = true;
+                       vol *= 2;
+               }
+
+               // FT2 compatibility: If there's a portamento and a note delay, 
execute the portamento, but don't update the parameter
+               // Test case: PortaDelay.xm
+               if(m_playBehaviour[kFT2PortaDelay] && startTick != 0)
+                       return {0, clearEffectColumn};
+               else
+                       return {vol * 16, clearEffectColumn};
+       }
+}
+
+
 // Portamento Slide
 void CSoundFile::TonePortamento(ModChannel &chn, uint32 param) const
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/soundlib/Sndfile.h 
new/libopenmpt-0.4.12+release.autotools/soundlib/Sndfile.h
--- old/libopenmpt-0.4.11+release.autotools/soundlib/Sndfile.h  2019-10-27 
15:47:44.000000000 +0100
+++ new/libopenmpt-0.4.12+release.autotools/soundlib/Sndfile.h  2020-04-07 
20:02:25.000000000 +0200
@@ -959,6 +959,7 @@
        void PortamentoFineMPT(ModChannel &chn, int);
        void PortamentoExtraFineMPT(ModChannel &chn, int);
        void NoteSlide(ModChannel &chn, uint32 param, bool slideUp, bool 
retrig) const;
+       std::pair<uint32, bool> GetVolCmdTonePorta(const ModCommand &m, uint32 
startTick) const;
        void TonePortamento(ModChannel &chn, uint32 param) const;
        void Vibrato(ModChannel &chn, uint32 param) const;
        void FineVibrato(ModChannel &chn, uint32 param) const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.4.11+release.autotools/soundlib/Sndmix.cpp 
new/libopenmpt-0.4.12+release.autotools/soundlib/Sndmix.cpp
--- old/libopenmpt-0.4.11+release.autotools/soundlib/Sndmix.cpp 2019-09-15 
21:49:59.000000000 +0200
+++ new/libopenmpt-0.4.12+release.autotools/soundlib/Sndmix.cpp 2020-04-06 
20:00:42.000000000 +0200
@@ -1558,6 +1558,8 @@
 
        if(chn.dwFlags[CHN_VIBRATO])
        {
+               const bool advancePosition = !m_SongFlags[SONG_FIRSTTICK] || 
((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && 
!(m_SongFlags[SONG_ITOLDEFFECTS]));
+
                if(GetType() == MOD_TYPE_669)
                {
                        if(chn.nVibratoPos % 2u)
@@ -1569,7 +1571,7 @@
                }
 
                // IT compatibility: IT has its own, more precise tables and 
pre-increments the vibrato position
-               if(m_playBehaviour[kITVibratoTremoloPanbrello])
+               if(advancePosition && 
m_playBehaviour[kITVibratoTremoloPanbrello])
                        chn.nVibratoPos += 4 * chn.nVibratoSpeed;
 
                int vdelta = GetVibratoDelta(chn.nVibratoType, chn.nVibratoPos);
@@ -1672,12 +1674,9 @@
                }
 
                // Advance vibrato position - IT updates on every tick, unless 
"old effects" are enabled (in this case it only updates on non-first ticks like 
other trackers)
-               if(!m_SongFlags[SONG_FIRSTTICK] || ((GetType() & (MOD_TYPE_IT | 
MOD_TYPE_MPT)) && !(m_SongFlags[SONG_ITOLDEFFECTS])))
-               {
-                       // IT compatibility: IT has its own, more precise 
tables and pre-increments the vibrato position
-                       if(!m_playBehaviour[kITVibratoTremoloPanbrello])
-                               chn.nVibratoPos += chn.nVibratoSpeed;
-               }
+               // IT compatibility: IT has its own, more precise tables and 
pre-increments the vibrato position
+               if(advancePosition && 
!m_playBehaviour[kITVibratoTremoloPanbrello])
+                       chn.nVibratoPos += chn.nVibratoSpeed;
        } else if(chn.dwOldFlags[CHN_VIBRATO])
        {
                // Stop MIDI vibrato for plugins:


Reply via email to