Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libopenmpt for openSUSE:Factory 
checked in at 2021-12-24 20:22:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libopenmpt (Old)
 and      /work/SRC/openSUSE:Factory/.libopenmpt.new.2520 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libopenmpt"

Fri Dec 24 20:22:55 2021 rev:33 rq:942189 version:0.5.14

Changes:
--------
--- /work/SRC/openSUSE:Factory/libopenmpt/libopenmpt.changes    2021-12-06 
23:59:03.464633251 +0100
+++ /work/SRC/openSUSE:Factory/.libopenmpt.new.2520/libopenmpt.changes  
2021-12-24 20:23:11.318019686 +0100
@@ -1,0 +2,30 @@
+Thu Dec 23 06:48:17 UTC 2021 - Mia Herkt <m...@0x0.st>
+
+- Update to 0.5.14:
+  * [Sec] Possible out-of-bounds read in Chorus plugin with NaN
+    plugin parameters. Most implementations of the ???fast math???
+    compiler optimizations will prevent this crash but it is not
+    guaranteed. (r16096)
+  * [Bug] Fixed undefined behaviour with custom tunings found with
+    ubsan.
+  * OPL: Improved channel allocation strategy when there are lots
+    of faded-out notes.
+  * MOD: Digital Tracker MODs have four unknown bytes right after
+    the magic bytes which seem to be ignored even by Digital
+    Tracker itself. Just skip over them.
+  * The logic when to turn off the resonant filter was broken in
+    some edge cases since libopenmpt 0.5.1.
+  * IMF: Implemented XE1-XE3 commands, which disable individual
+    envelopes. Command Nxy (cutoff slide + resonance) is now also
+    partially supported (only resonance for now).
+  * IMF: Filter envelopes were upside down.
+  * MTM: Omitting pattern loading through the load.skip_patterns
+    ctl caused sample data to be corrupted.
+  * S3M: Ignore O00 commands in files created with Scream Tracker
+    3.00 and 3.01, as this command only gained effect memory in
+    version 3.03.
+  * STM: Use S3M-like sample swap behaviour.
+  * XM: Disable arpeggio quirk for XMs made with Skale Tracker.
+    Fixes KAPTENFL.XM.
+
+-------------------------------------------------------------------

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

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

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

Other differences:
------------------
++++++ libopenmpt.spec ++++++
--- /var/tmp/diff_new_pack.flwGZ1/_old  2021-12-24 20:23:11.754019915 +0100
+++ /var/tmp/diff_new_pack.flwGZ1/_new  2021-12-24 20:23:11.762019919 +0100
@@ -21,7 +21,7 @@
 %define libopenmpt_modplug_version 0.8.9.0
 
 Name:           libopenmpt
-Version:        0.5.13
+Version:        0.5.14
 Release:        0
 Summary:        C++ and C library to decode tracker music files
 License:        BSD-3-Clause

++++++ libopenmpt-0.5.13+release.autotools.tar.gz -> 
libopenmpt-0.5.14+release.autotools.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/common/versionNumber.h 
new/libopenmpt-0.5.14+release.autotools/common/versionNumber.h
--- old/libopenmpt-0.5.13+release.autotools/common/versionNumber.h      
2021-11-14 17:44:35.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/common/versionNumber.h      
2021-12-05 14:59:52.000000000 +0100
@@ -17,7 +17,7 @@
 // Version definitions. The only thing that needs to be changed when changing 
version number.
 #define VER_MAJORMAJOR  1
 #define VER_MAJOR      29
-#define VER_MINOR      14
+#define VER_MINOR      15
 #define VER_MINORMINOR 00
 
 OPENMPT_NAMESPACE_END
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/configure 
new/libopenmpt-0.5.14+release.autotools/configure
--- old/libopenmpt-0.5.13+release.autotools/configure   2021-11-14 
18:11:21.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/configure   2021-12-05 
15:55:23.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for libopenmpt 0.5.13+release.autotools.
+# Generated by GNU Autoconf 2.69 for libopenmpt 0.5.14+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.5.13+release.autotools'
-PACKAGE_STRING='libopenmpt 0.5.13+release.autotools'
+PACKAGE_VERSION='0.5.14+release.autotools'
+PACKAGE_STRING='libopenmpt 0.5.14+release.autotools'
 PACKAGE_BUGREPORT='https://bugs.openmpt.org/'
 PACKAGE_URL='https://lib.openmpt.org/'
 
@@ -1472,7 +1472,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.5.13+release.autotools to adapt to many 
kinds of systems.
+\`configure' configures libopenmpt 0.5.14+release.autotools to adapt to many 
kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1543,7 +1543,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of libopenmpt 
0.5.13+release.autotools:";;
+     short | recursive ) echo "Configuration of libopenmpt 
0.5.14+release.autotools:";;
    esac
   cat <<\_ACEOF
 
@@ -1729,7 +1729,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-libopenmpt configure 0.5.13+release.autotools
+libopenmpt configure 0.5.14+release.autotools
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2219,7 +2219,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.5.13+release.autotools, which was
+It was created by libopenmpt $as_me 0.5.14+release.autotools, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3090,7 +3090,7 @@
 
 # Define the identity of the package.
  PACKAGE='libopenmpt'
- VERSION='0.5.13+release.autotools'
+ VERSION='0.5.14+release.autotools'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -17251,13 +17251,13 @@
 
 
 
-$as_echo "#define MPT_SVNURL 
\"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.5.13\""; >>confdefs.h
+$as_echo "#define MPT_SVNURL 
\"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.5.14\""; >>confdefs.h
 
 
-$as_echo "#define MPT_SVNVERSION \"15956\"" >>confdefs.h
+$as_echo "#define MPT_SVNVERSION \"16119\"" >>confdefs.h
 
 
-$as_echo "#define MPT_SVNDATE \"2021-11-14T17:01:47.266406Z\"" >>confdefs.h
+$as_echo "#define MPT_SVNDATE \"2021-12-05T14:17:40.071493Z\"" >>confdefs.h
 
 
 $as_echo "#define MPT_PACKAGE true" >>confdefs.h
@@ -22524,7 +22524,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.5.13+release.autotools, which was
+This file was extended by libopenmpt $as_me 0.5.14+release.autotools, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -22591,7 +22591,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.5.13+release.autotools
+libopenmpt config.status 0.5.14+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.5.13+release.autotools/configure.ac 
new/libopenmpt-0.5.14+release.autotools/configure.ac
--- old/libopenmpt-0.5.13+release.autotools/configure.ac        2021-11-14 
18:11:12.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/configure.ac        2021-12-05 
15:54:06.000000000 +0100
@@ -1,4 +1,4 @@
-AC_INIT([libopenmpt], [0.5.13+release.autotools], [https://bugs.openmpt.org/], 
[libopenmpt], [https://lib.openmpt.org/])
+AC_INIT([libopenmpt], [0.5.14+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.5.13";], [svn 
version])
-AC_DEFINE([MPT_SVNVERSION], ["15956"], [svn version])
-AC_DEFINE([MPT_SVNDATE], ["2021-11-14T17:01:47.266406Z"], [svn date])
+AC_DEFINE([MPT_SVNURL], 
["https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.5.14";], [svn 
version])
+AC_DEFINE([MPT_SVNVERSION], ["16119"], [svn version])
+AC_DEFINE([MPT_SVNDATE], ["2021-12-05T14:17:40.071493Z"], [svn date])
 AC_DEFINE([MPT_PACKAGE], [true], [is package])
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/libopenmpt/dox/changelog.md 
new/libopenmpt-0.5.14+release.autotools/libopenmpt/dox/changelog.md
--- old/libopenmpt-0.5.13+release.autotools/libopenmpt/dox/changelog.md 
2021-11-14 18:01:45.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/libopenmpt/dox/changelog.md 
2021-12-05 15:17:38.000000000 +0100
@@ -5,6 +5,37 @@
 For fully detailed change log, please see the source repository directly. This
 is just a high-level summary.
 
+### libopenmpt 0.5.14 (2021-12-05)
+
+ *  [**Sec**] Possible out-of-bounds read in Chorus plugin with NaN plugin
+    parameters. Most implementations of the "fast math" compiler optimizations
+    will prevent this crash but it is not guaranteed. (r16096)
+
+ *  [**Bug**] Fixed undefined behaviour with custom tunings found with ubsan.
+
+ *  OPL: Improved channel allocation strategy when there are lots of faded-out
+    notes.
+ *  MOD: Digital Tracker MODs have four unknown bytes right after the magic
+    bytes which seem to be ignored even by Digital Tracker itself. Just skip
+    over them.
+ *  The logic when to turn off the resonant filter was broken in some edge 
cases
+    since libopenmpt 0.5.1.
+ *  IMF: Implemented XE1-XE3 commands, which disable individual envelopes.
+    Command Nxy (cutoff slide + resonance) is now also partially supported
+    (only resonance for now).
+ *  IMF: Filter envelopes were upside down.
+ *  MTM: Omitting pattern loading through the load.skip_patterns ctl caused
+    sample data to be corrupted.
+ *  S3M: Ignore O00 commands in files created with Scream Tracker 3.00 and 
3.01,
+    as this command only gained effect memory in version 3.03.
+ *  STM: Use S3M-like sample swap behaviour.
+ *  XM: Disable arpeggio quirk for XMs made with Skale Tracker.
+    Fixes KAPTENFL.XM.
+
+ *  miniz: Update to v2.2.0 (2021-06-27).
+ *  minimp3: Update to commit 50d2aaf360a53653b718fead8e258d654c3a7e41
+    (2021-11-27).
+
 ### libopenmpt 0.5.13 (2021-11-14)
 
  *  [**Bug**] Fixed various undefined behaviour found with ubsan.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/libopenmpt/libopenmpt_version.h 
new/libopenmpt-0.5.14+release.autotools/libopenmpt/libopenmpt_version.h
--- old/libopenmpt-0.5.13+release.autotools/libopenmpt/libopenmpt_version.h     
2021-11-14 18:01:45.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/libopenmpt/libopenmpt_version.h     
2021-12-05 15:17:38.000000000 +0100
@@ -19,7 +19,7 @@
 /*! \brief libopenmpt minor version number */
 #define OPENMPT_API_VERSION_MINOR 5
 /*! \brief libopenmpt patch version number */
-#define OPENMPT_API_VERSION_PATCH 13
+#define OPENMPT_API_VERSION_PATCH 14
 /*! \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.5.13+release.autotools/libopenmpt/libopenmpt_version.mk 
new/libopenmpt-0.5.14+release.autotools/libopenmpt/libopenmpt_version.mk
--- old/libopenmpt-0.5.13+release.autotools/libopenmpt/libopenmpt_version.mk    
2021-11-14 18:01:45.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/libopenmpt/libopenmpt_version.mk    
2021-12-05 15:17:38.000000000 +0100
@@ -1,8 +1,8 @@
 LIBOPENMPT_VERSION_MAJOR=0
 LIBOPENMPT_VERSION_MINOR=5
-LIBOPENMPT_VERSION_PATCH=13
+LIBOPENMPT_VERSION_PATCH=14
 LIBOPENMPT_VERSION_PREREL=
 
 LIBOPENMPT_LTVER_CURRENT=2
-LIBOPENMPT_LTVER_REVISION=13
+LIBOPENMPT_LTVER_REVISION=14
 LIBOPENMPT_LTVER_AGE=2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/man/openmpt123.1 
new/libopenmpt-0.5.14+release.autotools/man/openmpt123.1
--- old/libopenmpt-0.5.13+release.autotools/man/openmpt123.1    2021-11-14 
18:11:12.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/man/openmpt123.1    2021-12-05 
15:54:05.000000000 +0100
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.8.
-.TH OPENMPT123 "1" "November 2021" "openmpt123 v0.5.13" "User Commands"
+.TH OPENMPT123 "1" "December 2021" "openmpt123 v0.5.14" "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.5.13+release.autotools/soundlib/Dlsbank.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Dlsbank.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Dlsbank.cpp        
2021-11-13 15:03:12.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Dlsbank.cpp        
2021-12-04 18:42:21.000000000 +0100
@@ -1912,19 +1912,19 @@
                                ExtractSample(sndFile, nSmp, nIns, nRgn, 
transpose);
                                extractedSamples.insert(rgn.nWaveLink);
                        }
-               } else if(duplicateRegion && 
sndFile.GetSample(nSmp).GetNumChannels() == 1)
+               } else if(duplicateRegion && 
sndFile.GetSample(RgnToSmp[dupRegion]).GetNumChannels() == 1)
                {
                        // Try to combine stereo samples
                        const uint16 pan1 = GetPanning(nIns, nRgn), pan2 = 
GetPanning(nIns, dupRegion);
                        if((pan1 < 16 && pan2 >= 240) || (pan2 < 16 && pan1 >= 
240))
                        {
-                               ModSample &sample = sndFile.GetSample(nSmp);
+                               ModSample &sample = 
sndFile.GetSample(RgnToSmp[dupRegion]);
                                ctrlSmp::ConvertToStereo(sample, sndFile);
                                std::vector<uint8> pWaveForm;
                                uint32 dwLen = 0;
-                               if(ExtractWaveForm(nIns, nRgn, pWaveForm, 
dwLen) && dwLen >= sample.GetSampleSizeInBytes() / 2)
+                               if(ExtractWaveForm(nIns, nRgn, pWaveForm, 
dwLen))
                                {
-                                       SmpLength len = sample.nLength;
+                                       SmpLength len = std::min(dwLen / 2u, 
sample.nLength);
                                        const int16 *src = 
reinterpret_cast<int16 *>(pWaveForm.data());
                                        int16 *dst = sample.sample16() + ((pan1 
== 0) ? 0 : 1);
                                        while(len--)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Load_imf.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Load_imf.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_imf.cpp       
2021-11-13 02:20:37.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_imf.cpp       
2021-12-04 18:50:05.000000000 +0100
@@ -96,7 +96,8 @@
 
        void ConvertEnvelope(InstrumentEnvelope &mptEnv, EnvTypes e) const
        {
-               const int shift = (e == volEnv) ? 0 : 2;
+               const uint8 shift = (e == volEnv) ? 0 : 2;
+               const uint8 mirror = (e == filterEnv) ? 0xFF : 0x00;
 
                mptEnv.dwFlags.set(ENV_ENABLED, (env[e].flags & 1) != 0);
                mptEnv.dwFlags.set(ENV_SUSTAIN, (env[e].flags & 2) != 0);
@@ -112,7 +113,8 @@
                {
                        mptEnv[n].tick = minTick = std::max(minTick, 
nodes[e][n].tick.get());
                        minTick++;
-                       mptEnv[n].value = 
static_cast<uint8>(std::min(nodes[e][n].value >> shift, ENVELOPE_MAX));
+                       uint8 value = static_cast<uint8>(nodes[e][n].value ^ 
mirror) >> shift;
+                       mptEnv[n].value = std::min(value, uint8(ENVELOPE_MAX));
                }
                mptEnv.Convert(MOD_TYPE_XM, MOD_TYPE_IT);
        }
@@ -205,51 +207,51 @@
 static constexpr EffectCommand imfEffects[] =
 {
        CMD_NONE,
-       CMD_SPEED,                      // 0x01 1xx Set Tempo
-       CMD_TEMPO,                      // 0x02 2xx Set BPM
-       CMD_TONEPORTAMENTO, // 0x03 3xx Tone Portamento
-       CMD_TONEPORTAVOL,       // 0x04 4xy Tone Portamento + Volume Slide
-       CMD_VIBRATO,            // 0x05 5xy Vibrato
-       CMD_VIBRATOVOL,         // 0x06 6xy Vibrato + Volume Slide
-       CMD_FINEVIBRATO,        // 0x07 7xy Fine Vibrato
-       CMD_TREMOLO,            // 0x08 8xy Tremolo
-       CMD_ARPEGGIO,           // 0x09 9xy Arpeggio
-       CMD_PANNING8,           // 0x0A Axx Set Pan Position
-       CMD_PANNINGSLIDE,       // 0x0B Bxy Pan Slide
-       CMD_VOLUME,                     // 0x0C Cxx Set Volume
-       CMD_VOLUMESLIDE,        // 0x0D Dxy Volume Slide
-       CMD_VOLUMESLIDE,        // 0x0E Exy Fine Volume Slide
-       CMD_S3MCMDEX,           // 0x0F Fxx Set Finetune
-       CMD_NOTESLIDEUP,        // 0x10 Gxy Note Slide Up
-       CMD_NOTESLIDEDOWN,      // 0x11 Hxy Note Slide Down
-       CMD_PORTAMENTOUP,       // 0x12 Ixx Slide Up
-       CMD_PORTAMENTODOWN,     // 0x13 Jxx Slide Down
-       CMD_PORTAMENTOUP,       // 0x14 Kxx Fine Slide Up
-       CMD_PORTAMENTODOWN,     // 0x15 Lxx Fine Slide Down
-       CMD_MIDI,                       // 0x16 Mxx Set Filter Cutoff - XXX
-       CMD_NONE,                       // 0x17 Nxy Filter Slide + Resonance - 
XXX
-       CMD_OFFSET,                     // 0x18 Oxx Set Sample Offset
-       CMD_NONE,                       // 0x19 Pxx Set Fine Sample Offset - XXX
-       CMD_KEYOFF,                     // 0x1A Qxx Key Off
-       CMD_RETRIG,                     // 0x1B Rxy Retrig
-       CMD_TREMOR,                     // 0x1C Sxy Tremor
-       CMD_POSITIONJUMP,       // 0x1D Txx Position Jump
-       CMD_PATTERNBREAK,       // 0x1E Uxx Pattern Break
-       CMD_GLOBALVOLUME,       // 0x1F Vxx Set Mastervolume
-       CMD_GLOBALVOLSLIDE,     // 0x20 Wxy Mastervolume Slide
-       CMD_S3MCMDEX,           // 0x21 Xxx Extended Effect
-                                                       // X1x Set Filter
-                                                       // X3x Glissando
-                                                       // X5x Vibrato Waveform
-                                                       // X8x Tremolo Waveform
-                                                       // XAx Pattern Loop
-                                                       // XBx Pattern Delay
-                                                       // XCx Note Cut
-                                                       // XDx Note Delay
-                                                       // XEx Ignore Envelope
-                                                       // XFx Invert Loop
-       CMD_NONE,                       // 0x22 Yxx Chorus - XXX
-       CMD_NONE,                       // 0x23 Zxx Reverb - XXX
+       CMD_SPEED,           // 0x01 1xx Set Tempo
+       CMD_TEMPO,           // 0x02 2xx Set BPM
+       CMD_TONEPORTAMENTO,  // 0x03 3xx Tone Portamento
+       CMD_TONEPORTAVOL,    // 0x04 4xy Tone Portamento + Volume Slide
+       CMD_VIBRATO,         // 0x05 5xy Vibrato
+       CMD_VIBRATOVOL,      // 0x06 6xy Vibrato + Volume Slide
+       CMD_FINEVIBRATO,     // 0x07 7xy Fine Vibrato
+       CMD_TREMOLO,         // 0x08 8xy Tremolo
+       CMD_ARPEGGIO,        // 0x09 9xy Arpeggio
+       CMD_PANNING8,        // 0x0A Axx Set Pan Position
+       CMD_PANNINGSLIDE,    // 0x0B Bxy Pan Slide
+       CMD_VOLUME,          // 0x0C Cxx Set Volume
+       CMD_VOLUMESLIDE,     // 0x0D Dxy Volume Slide
+       CMD_VOLUMESLIDE,     // 0x0E Exy Fine Volume Slide
+       CMD_S3MCMDEX,        // 0x0F Fxx Set Finetune
+       CMD_NOTESLIDEUP,     // 0x10 Gxy Note Slide Up
+       CMD_NOTESLIDEDOWN,   // 0x11 Hxy Note Slide Down
+       CMD_PORTAMENTOUP,    // 0x12 Ixx Slide Up
+       CMD_PORTAMENTODOWN,  // 0x13 Jxx Slide Down
+       CMD_PORTAMENTOUP,    // 0x14 Kxx Fine Slide Up
+       CMD_PORTAMENTODOWN,  // 0x15 Lxx Fine Slide Down
+       CMD_MIDI,            // 0x16 Mxx Set Filter Cutoff
+       CMD_MIDI,            // 0x17 Nxy Filter Slide + Resonance
+       CMD_OFFSET,          // 0x18 Oxx Set Sample Offset
+       CMD_NONE,            // 0x19 Pxx Set Fine Sample Offset - XXX
+       CMD_KEYOFF,          // 0x1A Qxx Key Off
+       CMD_RETRIG,          // 0x1B Rxy Retrig
+       CMD_TREMOR,          // 0x1C Sxy Tremor
+       CMD_POSITIONJUMP,    // 0x1D Txx Position Jump
+       CMD_PATTERNBREAK,    // 0x1E Uxx Pattern Break
+       CMD_GLOBALVOLUME,    // 0x1F Vxx Set Mastervolume
+       CMD_GLOBALVOLSLIDE,  // 0x20 Wxy Mastervolume Slide
+       CMD_S3MCMDEX,        // 0x21 Xxx Extended Effect
+                            //      X1x Set Filter
+                            //      X3x Glissando
+                            //      X5x Vibrato Waveform
+                            //      X8x Tremolo Waveform
+                            //      XAx Pattern Loop
+                            //      XBx Pattern Delay
+                            //      XCx Note Cut
+                            //      XDx Note Delay
+                            //      XEx Ignore Envelope
+                            //      XFx Invert Loop
+       CMD_NONE,            // 0x22 Yxx Chorus - XXX
+       CMD_NONE,            // 0x23 Zxx Reverb - XXX
 };
 
 static void ImportIMFEffect(ModCommand &m)
@@ -286,6 +288,9 @@
        case 0x16: // cutoff
                m.param = (0xFF - m.param) / 2u;
                break;
+       case 0x17: // cutoff slide + resonance (TODO: cutoff slide is currently 
not handled)
+               m.param = 0x80 | (m.param & 0x0F);
+               break;
        case 0x1F: // set global volume
                m.param = mpt::saturate_cast<uint8>(m.param * 2);
                break;
@@ -325,10 +330,18 @@
                                m.command = CMD_NONE;
                        break;
                case 0xE: // ignore envelope
-                       /* predicament: we can only disable one envelope at a 
time.
-                       volume is probably most noticeable, so let's go with 
that.
-                       (... actually, orpheus doesn't even seem to implement 
this at all) */
-                       m.param = 0x77;
+                       switch(m.param & 0x0F)
+                       {
+                       // All envelopes
+                       // Predicament: we can only disable one envelope at a 
time. Volume is probably most noticeable, so let's go with that.
+                       case 0: m.param = 0x77; break;
+                       // Volume
+                       case 1: m.param = 0x77; break;
+                       // Panning
+                       case 2: m.param = 0x79; break;
+                       // Filter
+                       case 3: m.param = 0x7B; break;
+                       }
                        break;
                case 0x18: // sample offset
                        // O00 doesn't pick up the previous value
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Load_mod.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Load_mod.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_mod.cpp       
2021-10-05 11:23:08.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_mod.cpp       
2021-11-15 23:30:47.000000000 +0100
@@ -690,6 +690,7 @@
 {
        const mpt::uchar *madeWithTracker = nullptr;
        uint32 invalidByteThreshold = MODSampleHeader::INVALID_BYTE_THRESHOLD;
+       uint16 patternDataOffset    = 1084;
        CHANNELINDEX numChannels    = 0;
        bool isNoiseTracker         = false;
        bool isStartrekker          = false;
@@ -738,6 +739,8 @@
                // Digital Tracker on Atari Falcon
                result.madeWithTracker = UL_("Digital Tracker");
                result.numChannels = magic[3] - '0';
+               // Digital Tracker MODs contain four bytes (00 40 00 00) right 
after the magic bytes which don't seem to do anything special.
+               result.patternDataOffset = 1088;
        } else if((!memcmp(magic, "FLT", 3) || !memcmp(magic, "EXO", 3)) && 
magic[3] >= '4' && magic[3] <= '9')
        {
                // FLTx / EXOx - Startrekker by Exolon / Fairlight
@@ -894,7 +897,8 @@
        // Read order information
        MODFileHeader fileHeader;
        file.ReadStruct(fileHeader);
-       file.Skip(4);  // Magic bytes (we already parsed these)
+
+       file.Seek(modMagicResult.patternDataOffset);
 
        if(fileHeader.restartPos > 0)
                maybeWOW = false;
@@ -1012,7 +1016,7 @@
                }
                fix7BitPanning = leftPanning && !extendedPanning && maxPanning 
>= ENABLE_MOD_PANNING_THRESHOLD;
        }
-       file.Seek(1084);
+       file.Seek(modMagicResult.patternDataOffset);
 
        const CHANNELINDEX readChannels = (isFLT8 ? 4 : m_nChannels); // 4 
channels per pattern in FLT8 format.
        if(isFLT8) numPatterns++; // as one logical pattern consists of two 
real patterns in FLT8 format, the highest pattern number has to be increased by 
one.
@@ -1178,7 +1182,7 @@
        // Reading samples
        if(loadFlags & loadSampleData)
        {
-               file.Seek(1084 + (readChannels * 64 * 4) * numPatterns);
+               file.Seek(modMagicResult.patternDataOffset + (readChannels * 64 
* 4) * numPatterns);
                for(SAMPLEINDEX smp = 1; smp <= 31; smp++)
                {
                        ModSample &sample = Samples[smp];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Load_mtm.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Load_mtm.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_mtm.cpp       
2019-11-02 10:13:50.000000000 +0100
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_mtm.cpp       
2021-12-04 18:47:30.000000000 +0100
@@ -174,7 +174,8 @@
        {
                if(!(loadFlags & loadPatternData) || !Patterns.Insert(pat, 
rowsPerPat))
                {
-                       break;
+                       file.Skip(64);
+                       continue;
                }
 
                for(CHANNELINDEX chn = 0; chn < 32; chn++)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Load_s3m.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Load_s3m.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_s3m.cpp       
2021-06-13 22:41:51.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_s3m.cpp       
2021-12-04 18:47:30.000000000 +0100
@@ -561,7 +561,7 @@
                        {
                                const auto [note, instr] = 
file.ReadArray<uint8, 2>();
                                if(note < 0xF0)
-                                       m.note = (note & 0x0F) + 12 * (note >> 
4) + 12 + NOTE_MIN;
+                                       m.note = 
static_cast<ModCommand::NOTE>(Clamp((note & 0x0F) + 12 * (note >> 4) + 12 + 
NOTE_MIN, NOTE_MIN, NOTE_MAX));
                                else if(note == s3mNoteOff)
                                        m.note = NOTE_NOTECUT;
                                else if(note == s3mNoteNone)
@@ -608,6 +608,10 @@
                                                else if(m.param > 0x08)
                                                        zxxCountRight++;
                                        }
+                               } else if(m.command == CMD_OFFSET && m.param == 
0 && fileHeader.cwtv <= S3MFileHeader::trkST3_01)
+                               {
+                                       // Offset command didn't have effect 
memory in ST3.01; fixed in ST3.03
+                                       m.command = CMD_DUMMY;
                                }
                        }
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Load_stm.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Load_stm.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_stm.cpp       
2020-07-16 22:48:57.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_stm.cpp       
2021-12-04 18:47:30.000000000 +0100
@@ -151,6 +151,8 @@
        m_modFormat.madeWithTracker = mpt::format(U_("Scream Tracker 
%1.%2"))(fileHeader.verMajor, mpt::ufmt::dec0<2>(fileHeader.verMinor));
        m_modFormat.charset = mpt::Charset::CP437;
 
+       m_playBehaviour.set(kST3SampleSwap);
+
        m_nSamples = 31;
        m_nChannels = 4;
        m_nMinPeriod = 64;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Load_xm.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Load_xm.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Load_xm.cpp        
2021-09-15 17:55:06.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Load_xm.cpp        
2021-11-19 23:15:06.000000000 +0100
@@ -647,9 +647,11 @@
                        // Fix arpeggios in kragle_-_happy_day.xm
                        m_playBehaviour.reset(kFT2Arpeggio);
                        isMadTracker = true;
-               } else if(!memcmp(fileHeader.trackerName, "Skale Tracker\0", 
14))
+               } else if(!memcmp(fileHeader.trackerName, "Skale Tracker\0", 
14) || !memcmp(fileHeader.trackerName, "Sk@le Tracker\0", 14))
                {
                        m_playBehaviour.reset(kFT2ST3OffsetOutOfRange);
+                       // Fix arpeggios in KAPTENFL.XM
+                       m_playBehaviour.reset(kFT2Arpeggio);
                } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11))
                {
                        madeWith = verDigiTrakker;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/ModChannel.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/ModChannel.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/ModChannel.cpp     
2021-05-13 14:37:50.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/ModChannel.cpp     
2021-11-17 22:26:48.000000000 +0100
@@ -161,7 +161,7 @@
        if(sndFile.m_playBehaviour[kITRealNoteMapping] && note >= NOTE_MIN && 
note <= NOTE_MAX)
                note = pModInstrument->NoteMap[note - NOTE_MIN];
 
-       nPeriod = mpt::saturate_round<uint32>((nC5Speed << FREQ_FRACBITS) * 
vibratoFactor * pModInstrument->pTuning->GetRatio(note - NOTE_MIDDLEC + 
arpeggioSteps, nFineTune + m_PortamentoFineSteps));
+       nPeriod = mpt::saturate_round<uint32>(nC5Speed * vibratoFactor * 
pModInstrument->pTuning->GetRatio(note - NOTE_MIDDLEC + arpeggioSteps, 
nFineTune + m_PortamentoFineSteps) * (1 << FREQ_FRACBITS));
 }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libopenmpt-0.5.13+release.autotools/soundlib/OPL.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/OPL.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/OPL.cpp    2020-05-16 
16:50:30.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/OPL.cpp    2021-11-14 
22:28:37.000000000 +0100
@@ -157,7 +157,10 @@
        NoteOff(c);
        Volume(c, 0, false);  // Note that a volume of 0 is not complete 
silence; the release portion of the sound will still be heard at -48dB
        if(unassign)
+       {
+               m_OPLtoChan[oplCh] = CHANNELINDEX_INVALID;
                m_ChanToOPL[c] |= OPL_CHANNEL_CUT;
+       }
 }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/S3MTools.h 
new/libopenmpt-0.5.14+release.autotools/soundlib/S3MTools.h
--- old/libopenmpt-0.5.13+release.autotools/soundlib/S3MTools.h 2021-05-13 
15:40:40.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/S3MTools.h 2021-12-04 
18:47:30.000000000 +0100
@@ -45,6 +45,7 @@
 
                trkST3_00         = 0x1300,
                trkST3_20         = 0x1320,
+               trkST3_01         = 0x1301,
                trkIT2_07         = 0x3207,
                trkIT2_14         = 0x3214,
                trkBeRoTrackerOld = 0x4100,  // Used from 2004 to 2012
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/SampleFormatSFZ.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/SampleFormatSFZ.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/SampleFormatSFZ.cpp        
2021-09-21 18:20:19.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/SampleFormatSFZ.cpp        
2021-12-04 18:30:26.000000000 +0100
@@ -257,7 +257,7 @@
                if(hold > 0)
                {
                        if(env.empty())
-                               env.push_back({0, 100.0});
+                               env.push_back({0.0, 100.0});
                        env.push_back({hold, env.back().second});
                }
                if(env.empty())
@@ -815,6 +815,7 @@
                        {
                                filename = file.GetFileName().GetPath() + 
filename;
                        }
+                       filename = filename.Simplify();
                        SetSamplePath(smp, filename);
                        InputFile f(filename, 
SettingCacheCompleteFileBeforeLoading());
                        FileReader smpFile = GetFileReader(f);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Snd_flt.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Snd_flt.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Snd_flt.cpp        
2020-05-25 22:26:42.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Snd_flt.cpp        
2021-11-24 22:07:30.000000000 +0100
@@ -1,5 +1,5 @@
 /*
- * snd_flt.cpp
+ * Snd_flt.cpp
  * -----------
  * Purpose: Calculation of resonant filter coefficients.
  * Notes  : Extended filter range was introduced in MPT 1.12 and went up to 
8652 Hz.
@@ -81,11 +81,10 @@
        // Filtering is only ever done in IT if either cutoff is not full or if 
resonance is set.
        if(m_playBehaviour[kITFilterBehaviour] && resonance == 0 && 
computedCutoff >= 254)
        {
-               if(chn.rowCommand.IsNote() && !chn.rowCommand.IsPortamento() && 
!chn.nMasterChn
-                  && chn.position.IsZero() && !chn.dwFlags[CHN_WRAPPED_LOOP])
+               if(chn.rowCommand.IsNote() && !chn.rowCommand.IsPortamento() && 
!chn.nMasterChn && chn.isFirstTick)
                {
                        // Z7F next to a note disables the filter, however in 
other cases this should not happen.
-                       // Test cases: filter-reset.it, filter-reset-carry.it, 
filter-nna.it
+                       // Test cases: filter-reset.it, filter-reset-carry.it, 
filter-reset-envelope.it, filter-nna.it
                        chn.dwFlags.reset(CHN_FILTER);
                }
                return -1;
@@ -118,17 +117,17 @@
        float fb1 = -e / (1.0f + d + e);
 
 #if defined(MPT_INTMIXER)
-#define FILTER_CONVERT(x) mpt::saturate_round<mixsample_t>((x) * (1 << 
MIXING_FILTER_PRECISION))
+#define MPT_FILTER_CONVERT(x) mpt::saturate_round<mixsample_t>((x) * (1 << 
MIXING_FILTER_PRECISION))
 #else
-#define FILTER_CONVERT(x) (x)
+#define MPT_FILTER_CONVERT(x) (x)
 #endif
 
        switch(chn.nFilterMode)
        {
        case FilterMode::HighPass:
-               chn.nFilter_A0 = FILTER_CONVERT(1.0f - fg);
-               chn.nFilter_B0 = FILTER_CONVERT(fb0);
-               chn.nFilter_B1 = FILTER_CONVERT(fb1);
+               chn.nFilter_A0 = MPT_FILTER_CONVERT(1.0f - fg);
+               chn.nFilter_B0 = MPT_FILTER_CONVERT(fb0);
+               chn.nFilter_B1 = MPT_FILTER_CONVERT(fb1);
 #ifdef MPT_INTMIXER
                chn.nFilter_HP = -1;
 #else
@@ -137,9 +136,9 @@
                break;
 
        default:
-               chn.nFilter_A0 = FILTER_CONVERT(fg);
-               chn.nFilter_B0 = FILTER_CONVERT(fb0);
-               chn.nFilter_B1 = FILTER_CONVERT(fb1);
+               chn.nFilter_A0 = MPT_FILTER_CONVERT(fg);
+               chn.nFilter_B0 = MPT_FILTER_CONVERT(fb0);
+               chn.nFilter_B1 = MPT_FILTER_CONVERT(fb1);
 #ifdef MPT_INTMIXER
                if(chn.nFilter_A0 == 0)
                        chn.nFilter_A0 = 1;     // Prevent silence at low 
filter cutoff and very high sampling rate
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Sndfile.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/Sndfile.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Sndfile.cpp        
2021-09-03 23:49:48.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Sndfile.cpp        
2021-12-04 18:58:46.000000000 +0100
@@ -505,6 +505,7 @@
                        {
                                filename = 
filename.RelativePathToAbsolute(GetpModDoc()->GetPathNameMpt().GetPath());
                        }
+                       filename = filename.Simplify();
                        if(!LoadExternalSample(nSmp, filename))
                        {
 #ifndef MODPLUG_TRACKER
@@ -1368,30 +1369,27 @@
                                if(p->IsNote())
                                {
                                        ModCommand::INSTR instr = p->instr;
-                                       if(!p->instr) instr = lastIns[c];
-                                       if (instr)
+                                       if(!p->instr)
+                                               instr = lastIns[c];
+                                       INSTRUMENTINDEX minInstr = 1, maxInstr 
= GetNumInstruments();
+                                       if(instr > 0)
                                        {
-                                               if(IsInRange(instr, 
(INSTRUMENTINDEX)0, MAX_INSTRUMENTS))
+                                               if(instr <= GetNumInstruments())
                                                {
-                                                       ModInstrument *pIns = 
Instruments[p->instr];
-                                                       if (pIns)
-                                                       {
-                                                               SAMPLEINDEX n = 
pIns->Keyboard[p->note - NOTE_MIN];
-                                                               if (n <= 
GetNumSamples()) sampleUsed[n] = true;
-                                                       }
+                                                       minInstr = maxInstr = 
instr;
                                                }
                                                lastIns[c] = instr;
                                        } else
                                        {
                                                // No idea which instrument 
this note belongs to, so mark it used in any instruments.
-                                               for (INSTRUMENTINDEX k = 
GetNumInstruments(); k >= 1; k--)
+                                       }
+                                       for(INSTRUMENTINDEX i = minInstr; i <= 
maxInstr; i++)
+                                       {
+                                               if(const auto *pIns = 
Instruments[i]; pIns != nullptr)
                                                {
-                                                       ModInstrument *pIns = 
Instruments[k];
-                                                       if (pIns)
-                                                       {
-                                                               SAMPLEINDEX n = 
pIns->Keyboard[p->note - NOTE_MIN];
-                                                               if (n <= 
GetNumSamples()) sampleUsed[n] = true;
-                                                       }
+                                                       SAMPLEINDEX n = 
pIns->Keyboard[p->note - NOTE_MIN];
+                                                       if(n <= GetNumSamples())
+                                                               sampleUsed[n] = 
true;
                                                }
                                        }
                                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/Sndfile.h 
new/libopenmpt-0.5.14+release.autotools/soundlib/Sndfile.h
--- old/libopenmpt-0.5.13+release.autotools/soundlib/Sndfile.h  2021-06-05 
00:28:37.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/Sndfile.h  2021-12-04 
18:30:26.000000000 +0100
@@ -597,7 +597,7 @@
        std::vector<mpt::PathString> m_samplePaths;
 
 public:
-       void SetSamplePath(SAMPLEINDEX smp, const mpt::PathString &filename) { 
if(m_samplePaths.size() < smp) m_samplePaths.resize(smp); m_samplePaths[smp - 
1] = filename.Simplify(); }
+       void SetSamplePath(SAMPLEINDEX smp, mpt::PathString filename) { 
if(m_samplePaths.size() < smp) m_samplePaths.resize(smp); m_samplePaths[smp - 
1] = std::move(filename); }
        void ResetSamplePath(SAMPLEINDEX smp) { if(m_samplePaths.size() >= smp) 
m_samplePaths[smp - 1] = mpt::PathString(); 
Samples[smp].uFlags.reset(SMP_KEEPONDISK | SMP_MODIFIED);}
        mpt::PathString GetSamplePath(SAMPLEINDEX smp) const { 
if(m_samplePaths.size() >= smp) return m_samplePaths[smp - 1]; else return 
mpt::PathString(); }
        bool SampleHasPath(SAMPLEINDEX smp) const { if(m_samplePaths.size() >= 
smp) return !m_samplePaths[smp - 1].empty(); else return false; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/plugins/LFOPlugin.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/plugins/LFOPlugin.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/plugins/LFOPlugin.cpp      
2021-09-03 23:48:47.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/plugins/LFOPlugin.cpp      
2021-12-04 18:55:00.000000000 +0100
@@ -349,9 +349,12 @@
                && !memcmp(data.magic, "LFO ", 4)
                && data.version == 0)
        {
-               m_amplitude = 
Clamp<float>(IEEE754binary32LE().SetInt32(data.amplitude), 0.0f, 1.0f);
-               m_offset = 
Clamp<float>(IEEE754binary32LE().SetInt32(data.offset), 0.0f, 1.0f);
-               m_frequency = 
Clamp<float>(IEEE754binary32LE().SetInt32(data.frequency), 0.0f, 1.0f);
+               const float amplitude = 
IEEE754binary32LE().SetInt32(data.amplitude);
+               m_amplitude = std::isfinite(amplitude) ? std::clamp(amplitude, 
0.0f, 1.0f) : 0.5f;
+               const float offset = IEEE754binary32LE().SetInt32(data.offset);
+               m_offset = std::isfinite(offset) ? std::clamp(offset, 0.0f, 
1.0f) : 0.5f;
+               const float frequency = 
IEEE754binary32LE().SetInt32(data.frequency);
+               m_frequency = std::isfinite(frequency) ? std::clamp(frequency, 
0.0f, 1.0f) : 0.290241f;
                if(data.waveForm < kNumWaveforms)
                        m_waveForm = 
static_cast<LFOWaveform>(data.waveForm.get());
                m_outputParam = data.outputParam;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libopenmpt-0.5.13+release.autotools/soundlib/plugins/PlugInterface.cpp 
new/libopenmpt-0.5.14+release.autotools/soundlib/plugins/PlugInterface.cpp
--- old/libopenmpt-0.5.13+release.autotools/soundlib/plugins/PlugInterface.cpp  
2021-05-01 18:29:52.000000000 +0200
+++ new/libopenmpt-0.5.14+release.autotools/soundlib/plugins/PlugInterface.cpp  
2021-12-04 18:55:00.000000000 +0100
@@ -516,7 +516,8 @@
                                BeginSetProgram();
                                for(uint32 i = 0; i < numParams; i++)
                                {
-                                       SetParameter(i, memFile.ReadFloatLE());
+                                       const auto value = 
memFile.ReadFloatLE();
+                                       SetParameter(i, std::isfinite(value) ? 
value : 0.0f);
                                }
                                EndSetProgram();
                        }

Reply via email to