Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libopenmpt for openSUSE:Factory checked in at 2023-03-30 22:50:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libopenmpt (Old) and /work/SRC/openSUSE:Factory/.libopenmpt.new.31432 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libopenmpt" Thu Mar 30 22:50:40 2023 rev:41 rq:1075084 version:0.6.9 Changes: -------- --- /work/SRC/openSUSE:Factory/libopenmpt/libopenmpt.changes 2023-02-07 18:47:44.686699452 +0100 +++ /work/SRC/openSUSE:Factory/.libopenmpt.new.31432/libopenmpt.changes 2023-03-30 22:50:41.516390138 +0200 @@ -1,0 +2,15 @@ +Wed Mar 29 02:43:44 UTC 2023 - Mia Herkt <[email protected]> + +- Update to 0.6.9 + * [Bug] An exception could be thrown during rendering when trying + to access the release node of an empty envelope. + * The fix for the OPL cutoff bug introduced in libopenmpt 0.6.7 + was incomplete. + * ULT: Offset commands exceeding 65535 samples were sometimes not + imported correctly even if there was room for them. + * After seeking with seek.sync_samples=1, the filter settings of + playing notes were not updated since libopenmpt 0.6.7. + * Loading of and seeking inside (malformed) modules with + thousands of short sub-songs has been sped up. + +------------------------------------------------------------------- Old: ---- libopenmpt-0.6.8+release.autotools.tar.gz New: ---- libopenmpt-0.6.9+release.autotools.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libopenmpt.spec ++++++ --- /var/tmp/diff_new_pack.bUdO0m/_old 2023-03-30 22:50:42.800397009 +0200 +++ /var/tmp/diff_new_pack.bUdO0m/_new 2023-03-30 22:50:42.804397030 +0200 @@ -21,7 +21,7 @@ %define libopenmpt_modplug_version 0.8.9.0 Name: libopenmpt -Version: 0.6.8 +Version: 0.6.9 Release: 0 Summary: C++ and C library to decode tracker music files License: BSD-3-Clause ++++++ libopenmpt-0.6.8+release.autotools.tar.gz -> libopenmpt-0.6.9+release.autotools.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/common/versionNumber.h new/libopenmpt-0.6.9+release.autotools/common/versionNumber.h --- old/libopenmpt-0.6.8+release.autotools/common/versionNumber.h 2023-01-29 12:59:32.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/common/versionNumber.h 2023-03-05 13:24:48.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 30 -#define VER_MINOR 10 +#define VER_MINOR 11 #define VER_MINORMINOR 00 OPENMPT_NAMESPACE_END diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/configure new/libopenmpt-0.6.9+release.autotools/configure --- old/libopenmpt-0.6.8+release.autotools/configure 2023-01-29 13:25:43.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/configure 2023-03-05 13:49:28.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.6.8+release.autotools. +# Generated by GNU Autoconf 2.69 for libopenmpt 0.6.9+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.6.8+release.autotools' -PACKAGE_STRING='libopenmpt 0.6.8+release.autotools' +PACKAGE_VERSION='0.6.9+release.autotools' +PACKAGE_STRING='libopenmpt 0.6.9+release.autotools' PACKAGE_BUGREPORT='https://bugs.openmpt.org/' PACKAGE_URL='https://lib.openmpt.org/' @@ -1475,7 +1475,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.6.8+release.autotools to adapt to many kinds of systems. +\`configure' configures libopenmpt 0.6.9+release.autotools to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1546,7 +1546,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libopenmpt 0.6.8+release.autotools:";; + short | recursive ) echo "Configuration of libopenmpt 0.6.9+release.autotools:";; esac cat <<\_ACEOF @@ -1732,7 +1732,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libopenmpt configure 0.6.8+release.autotools +libopenmpt configure 0.6.9+release.autotools generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2222,7 +2222,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.6.8+release.autotools, which was +It was created by libopenmpt $as_me 0.6.9+release.autotools, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3086,7 +3086,7 @@ # Define the identity of the package. PACKAGE='libopenmpt' - VERSION='0.6.8+release.autotools' + VERSION='0.6.9+release.autotools' cat >>confdefs.h <<_ACEOF @@ -17253,13 +17253,13 @@ -$as_echo "#define MPT_SVNURL \"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.8\"" >>confdefs.h +$as_echo "#define MPT_SVNURL \"https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.9\"" >>confdefs.h -$as_echo "#define MPT_SVNVERSION \"18680\"" >>confdefs.h +$as_echo "#define MPT_SVNVERSION \"18817\"" >>confdefs.h -$as_echo "#define MPT_SVNDATE \"2023-01-29T12:13:49.877060Z\"" >>confdefs.h +$as_echo "#define MPT_SVNDATE \"2023-03-05T12:41:15.297347Z\"" >>confdefs.h $as_echo "#define MPT_PACKAGE true" >>confdefs.h @@ -22545,7 +22545,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.6.8+release.autotools, which was +This file was extended by libopenmpt $as_me 0.6.9+release.autotools, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -22603,7 +22603,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.6.8+release.autotools +libopenmpt config.status 0.6.9+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.6.8+release.autotools/configure.ac new/libopenmpt-0.6.9+release.autotools/configure.ac --- old/libopenmpt-0.6.8+release.autotools/configure.ac 2023-01-29 13:25:29.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/configure.ac 2023-03-05 13:49:07.000000000 +0100 @@ -1,4 +1,4 @@ -AC_INIT([libopenmpt], [0.6.8+release.autotools], [https://bugs.openmpt.org/], [libopenmpt], [https://lib.openmpt.org/]) +AC_INIT([libopenmpt], [0.6.9+release.autotools], [https://bugs.openmpt.org/], [libopenmpt], [https://lib.openmpt.org/]) AC_PREREQ([2.68]) AC_CONFIG_MACRO_DIR([m4]) @@ -26,9 +26,9 @@ AC_SUBST([LIBOPENMPT_LTVER_REVISION]) AC_SUBST([LIBOPENMPT_LTVER_AGE]) -AC_DEFINE([MPT_SVNURL], ["https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.8"], [svn version]) -AC_DEFINE([MPT_SVNVERSION], ["18680"], [svn version]) -AC_DEFINE([MPT_SVNDATE], ["2023-01-29T12:13:49.877060Z"], [svn date]) +AC_DEFINE([MPT_SVNURL], ["https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.9"], [svn version]) +AC_DEFINE([MPT_SVNVERSION], ["18817"], [svn version]) +AC_DEFINE([MPT_SVNDATE], ["2023-03-05T12:41:15.297347Z"], [svn date]) AC_DEFINE([MPT_PACKAGE], [true], [is package]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/libopenmpt/dox/changelog.md new/libopenmpt-0.6.9+release.autotools/libopenmpt/dox/changelog.md --- old/libopenmpt-0.6.8+release.autotools/libopenmpt/dox/changelog.md 2023-01-29 13:13:46.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/libopenmpt/dox/changelog.md 2023-03-05 13:41:12.000000000 +0100 @@ -5,6 +5,20 @@ For fully detailed change log, please see the source repository directly. This is just a high-level summary. +### libopenmpt 0.6.9 (2023-03-05) + + * [**Bug**] An exception could be thrown during rendering when trying to + access the release node of an empty envelope. + + * The fix for the OPL cutoff bug introduced in libopenmpt 0.6.7 was + incomplete. + * ULT: Offset commands exceeding 65535 samples were sometimes not imported + correctly even if there was room for them. + * After seeking with seek.sync_samples=1, the filter settings of playing notes + were not updated since libopenmpt 0.6.7. + * Loading of and seeking inside (malformed) modules with thousands of short + sub-songs has been sped up. + ### libopenmpt 0.6.8 (2023-01-29) * [**Bug**] DSYM: Loading DSYM files got broken in 0.6.7. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/libopenmpt/libopenmpt_version.h new/libopenmpt-0.6.9+release.autotools/libopenmpt/libopenmpt_version.h --- old/libopenmpt-0.6.8+release.autotools/libopenmpt/libopenmpt_version.h 2023-01-29 13:13:46.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/libopenmpt/libopenmpt_version.h 2023-03-05 13:41:12.000000000 +0100 @@ -21,7 +21,7 @@ /*! \brief libopenmpt minor version number */ #define OPENMPT_API_VERSION_MINOR 6 /*! \brief libopenmpt patch version number */ -#define OPENMPT_API_VERSION_PATCH 8 +#define OPENMPT_API_VERSION_PATCH 9 /*! \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.6.8+release.autotools/libopenmpt/libopenmpt_version.mk new/libopenmpt-0.6.9+release.autotools/libopenmpt/libopenmpt_version.mk --- old/libopenmpt-0.6.8+release.autotools/libopenmpt/libopenmpt_version.mk 2023-01-29 13:13:46.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/libopenmpt/libopenmpt_version.mk 2023-03-05 13:41:12.000000000 +0100 @@ -1,8 +1,8 @@ LIBOPENMPT_VERSION_MAJOR=0 LIBOPENMPT_VERSION_MINOR=6 -LIBOPENMPT_VERSION_PATCH=8 +LIBOPENMPT_VERSION_PATCH=9 LIBOPENMPT_VERSION_PREREL= LIBOPENMPT_LTVER_CURRENT=3 -LIBOPENMPT_LTVER_REVISION=8 +LIBOPENMPT_LTVER_REVISION=9 LIBOPENMPT_LTVER_AGE=3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/man/openmpt123.1 new/libopenmpt-0.6.9+release.autotools/man/openmpt123.1 --- old/libopenmpt-0.6.8+release.autotools/man/openmpt123.1 2023-01-29 13:25:28.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/man/openmpt123.1 2023-03-05 13:49:06.000000000 +0100 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1. -.TH OPENMPT123 "1" "January 2023" "openmpt123 v0.6.8" "User Commands" +.TH OPENMPT123 "1" "March 2023" "openmpt123 v0.6.9" "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.6.8+release.autotools/soundlib/Load_symmod.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/Load_symmod.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/Load_symmod.cpp 2022-02-14 09:52:01.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Load_symmod.cpp 2023-03-03 19:32:39.000000000 +0100 @@ -1135,7 +1135,7 @@ chunk = FileReader(mpt::as_span(unpackedSample)); } - if(!ReadIFFSample(sample, chunk) + if(!ReadIFFSample(sample, chunk, false) && !ReadWAVSample(sample, chunk) && !ReadAIFFSample(sample, chunk) && !ReadRawSymSample(Samples[sample], chunk)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Load_uax.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/Load_uax.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/Load_uax.cpp 2021-03-17 23:07:37.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Load_uax.cpp 2023-03-01 20:27:31.000000000 +0100 @@ -72,7 +72,7 @@ { InitializeChannels(); SetType(MOD_TYPE_MPT); - m_ContainerType = MOD_CONTAINERTYPE_UAX; + m_ContainerType = ModContainerType::UAX; m_nChannels = 4; Patterns.Insert(0, 64); Order().assign(1, 0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Load_ult.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/Load_ult.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/Load_ult.cpp 2021-10-30 15:38:01.000000000 +0200 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Load_ult.cpp 2023-02-25 15:51:57.000000000 +0100 @@ -239,7 +239,7 @@ { uint32 offset = param1 * 4; param1 = mpt::saturate_cast<uint8>(offset); - if(offset > 0xFF && ModCommand::GetEffectWeight(cmd2) < ModCommand::GetEffectType(CMD_OFFSET)) + if(offset > 0xFF && ModCommand::GetEffectWeight(cmd2) < ModCommand::GetEffectWeight(CMD_OFFSET)) { m.command = CMD_OFFSET; m.param = static_cast<ModCommand::PARAM>(offset); @@ -251,7 +251,7 @@ { uint32 offset = param2 * 4; param2 = mpt::saturate_cast<uint8>(offset); - if(offset > 0xFF && ModCommand::GetEffectWeight(cmd1) < ModCommand::GetEffectType(CMD_OFFSET)) + if(offset > 0xFF && ModCommand::GetEffectWeight(cmd1) < ModCommand::GetEffectWeight(CMD_OFFSET)) { m.command = CMD_OFFSET; m.param = static_cast<ModCommand::PARAM>(offset); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Load_wav.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/Load_wav.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/Load_wav.cpp 2021-05-24 22:48:24.000000000 +0200 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Load_wav.cpp 2023-03-01 20:27:31.000000000 +0100 @@ -80,7 +80,7 @@ } InitializeGlobals(MOD_TYPE_MPT); - m_ContainerType = MOD_CONTAINERTYPE_WAV; + m_ContainerType = ModContainerType::WAV; m_nChannels = std::max(wavFile.GetNumChannels(), uint16(2)); Patterns.ResizeArray(2); if(!Patterns.Insert(0, 64) || !Patterns.Insert(1, 64)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/MIDIMacros.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/MIDIMacros.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/MIDIMacros.cpp 2022-03-06 20:54:06.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/MIDIMacros.cpp 2023-03-02 19:09:40.000000000 +0100 @@ -341,7 +341,11 @@ // Fix old-format (not conforming to IT's MIDI macro definitions) MIDI config strings. void MIDIMacroConfig::UpgradeMacros() { - for(auto ¯o : *this) + for(auto ¯o : SFx) + { + macro.UpgradeLegacyMacro(); + } + for(auto ¯o : Zxx) { macro.UpgradeLegacyMacro(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/ModInstrument.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/ModInstrument.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/ModInstrument.cpp 2022-05-09 20:29:48.000000000 +0200 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/ModInstrument.cpp 2023-03-02 18:55:38.000000000 +0100 @@ -70,6 +70,9 @@ // returns value in range [0, rangeOut]. int32 InstrumentEnvelope::GetValueFromPosition(int position, int32 rangeOut, int32 rangeIn) const { + if(empty()) + return 0; + uint32 pt = size() - 1u; const int32 ENV_PRECISION = 1 << 16; @@ -126,13 +129,20 @@ it->tick = std::max(it->tick, (it - 1)->tick); LimitMax(it->value, maxValue); } + LimitMax(nLoopEnd, static_cast<decltype(nLoopEnd)>(size() - 1)); + LimitMax(nLoopStart, nLoopEnd); + LimitMax(nSustainEnd, static_cast<decltype(nSustainEnd)>(size() - 1)); + LimitMax(nSustainStart, nSustainEnd); + if(nReleaseNode != ENV_RELEASE_NODE_UNSET) + LimitMax(nReleaseNode, static_cast<decltype(nReleaseNode)>(size() - 1)); + } else + { + nLoopStart = 0; + nLoopEnd = 0; + nSustainStart = 0; + nSustainEnd = 0; + nReleaseNode = ENV_RELEASE_NODE_UNSET; } - LimitMax(nLoopEnd, static_cast<decltype(nLoopEnd)>(size() - 1)); - LimitMax(nLoopStart, nLoopEnd); - LimitMax(nSustainEnd, static_cast<decltype(nSustainEnd)>(size() - 1)); - LimitMax(nSustainStart, nSustainEnd); - if(nReleaseNode != ENV_RELEASE_NODE_UNSET) - LimitMax(nReleaseNode, static_cast<decltype(nReleaseNode)>(size() - 1)); } @@ -312,7 +322,7 @@ { if(Keyboard[i] == 0) continue; - if(!NoteMap[i] || NoteMap[i] == (i + 1)) + if(NoteMap[i] == NOTE_NONE) continue; const int8 relativeNote = static_cast<int8>(NoteMap[i] - (i + NOTE_MIN)); @@ -320,6 +330,16 @@ return {}; transposeMap[Keyboard[i]] = relativeNote; } + // Remove all samples that wouldn't be transposed. + // They were previously inserted into the map to catch the case where a specific sample's + // map would start with a transpose value of 0 but end with a different value. + for(auto it = transposeMap.begin(); it != transposeMap.end();) + { + if(it->second == 0) + it = transposeMap.erase(it); + else + it++; + } return transposeMap; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/RowVisitor.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/RowVisitor.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/RowVisitor.cpp 2021-01-24 19:04:57.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/RowVisitor.cpp 2023-03-04 01:05:25.000000000 +0100 @@ -221,36 +221,45 @@ { const auto &order = Order(); const ORDERINDEX endOrder = order.GetLengthTailTrimmed(); - for(ord = 0; ord < endOrder; ord++) + for(ORDERINDEX o = 0; o < endOrder; o++) { - if(!order.IsValidPat(ord)) + if(!order.IsValidPat(o)) continue; - if(ord >= m_visitedRows.size()) + if(o >= m_visitedRows.size()) { // Not yet initialized => unvisited + ord = o; row = 0; return true; } - const auto &visitedRows = m_visitedRows[ord]; - const auto firstUnplayedRow = std::find(visitedRows.begin(), visitedRows.end(), onlyUnplayedPatterns); - if(onlyUnplayedPatterns && firstUnplayedRow == visitedRows.end()) + const auto &visitedRows = m_visitedRows[o]; + ROWINDEX firstUnplayedRow = 0; + for(; firstUnplayedRow < visitedRows.size(); firstUnplayedRow++) + { + if(visitedRows[firstUnplayedRow] == onlyUnplayedPatterns) + break; + } + if(onlyUnplayedPatterns && firstUnplayedRow == visitedRows.size()) { // No row of this pattern has been played yet. + ord = o; row = 0; return true; } else if(!onlyUnplayedPatterns) { // Return the first unplayed row in this pattern - if(firstUnplayedRow != visitedRows.end()) + if(firstUnplayedRow < visitedRows.size()) { - row = static_cast<ROWINDEX>(std::distance(visitedRows.begin(), firstUnplayedRow)); + ord = o; + row = firstUnplayedRow; return true; } - if(visitedRows.size() < m_sndFile.Patterns[order[ord]].GetNumRows()) + if(visitedRows.size() < m_sndFile.Patterns[order[o]].GetNumRows()) { // History is not fully initialized + ord = o; row = static_cast<ROWINDEX>(visitedRows.size()); return true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/SampleFormats.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/SampleFormats.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/SampleFormats.cpp 2022-11-25 23:48:33.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/SampleFormats.cpp 2023-03-03 22:16:07.000000000 +0100 @@ -2542,7 +2542,7 @@ MPT_BINARY_STRUCT(IFFSampleHeader, 20) -bool CSoundFile::ReadIFFSample(SAMPLEINDEX nSample, FileReader &file) +bool CSoundFile::ReadIFFSample(SAMPLEINDEX nSample, FileReader &file, bool allowLittleEndian) { file.Rewind(); @@ -2612,14 +2612,24 @@ const uint8 numChannels = chanChunk.ReadUint32BE() == 6 ? 2 : 1; const uint8 bytesPerFrame = bytesPerSample * numChannels; - // While this is an Amiga format, the 16SV version appears to be only used on PC, and only with little-endian sample data. if(bytesPerSample == 2) - sampleIO = SampleIO(SampleIO::_16bit, SampleIO::mono, SampleIO::littleEndian, SampleIO::signedPCM); + sampleIO |= SampleIO::_16bit; if(numChannels == 2) sampleIO |= SampleIO::stereoSplit; loopStart = sampleHeader.oneShotHiSamples / bytesPerFrame; - loopLength = sampleHeader.repeatHiSamples / bytesPerFrame; + // Loops are a complicated mess in IFF samples. + // Some samples (e.g. those from the Ensoniq Mirage for Amiga collection available at https://archive.org/details/mirage4amiga) + // have a repeatHiSamples portion that includes garbage. However, these samples also have an appropriate samplesPerHiCycle value set + // which indicates the length of one cycle of the repeating waveform. If we just take that one cycle into account, the samples loop cleanly. + // However, some other, non-musical 8SVX samples use bogus samplesPerHiCycle values. The following conditions help us spot this sort of samples: + // - If samplesPerHiCycle is 32 or lower, we simply ignore it. + // - According to the documentation, repeatHiSamples is intended to be a multiple of samplesPerHiCycle if the latter is set (otherwise we wouldn't get a clean loop). + // So if this is not the case, we ignore samplesPerHiCycle and only use repeatHiSamples. + if(sampleHeader.samplesPerHiCycle > 32 && sampleHeader.samplesPerHiCycle < sampleHeader.repeatHiSamples && (sampleHeader.repeatHiSamples % sampleHeader.samplesPerHiCycle) == 0) + loopLength = sampleHeader.samplesPerHiCycle / bytesPerFrame; + else + loopLength = sampleHeader.repeatHiSamples / bytesPerFrame; sampleRate = sampleHeader.samplesPerSec; volume = sampleHeader.volume; numSamples = mpt::saturate_cast<SmpLength>(sampleData.GetLength() / bytesPerFrame); @@ -2635,7 +2645,7 @@ sample.uFlags.set(CHN_LOOP); sample.nC5Speed = sampleRate; - if(!sample.nC5Speed) + if(sample.nC5Speed <= 1) sample.nC5Speed = 22050; sample.nVolume = static_cast<uint16>(volume / 256); @@ -2651,6 +2661,59 @@ m_szNames[nSample] = ""; sampleIO.ReadSample(sample, sampleData); + + if(allowLittleEndian && !memcmp(fileHeader.magic, "16SV", 4)) + { + // Fasttracker 2 (and also Awave Studio up to version 11.7) writes little-endian 16-bit data. Great... + // It is relatively safe to assume (see raw sample import dialog) that "proper" sample data usually has some smoothness to it, + // i.e. its first derivative mostly consists of small-ish values. + // When interpreting the sample data with incorrect endianness, however, the first derivative is usually a lot more jumpy. + // So we compare the two derivatives when interpreting the data as little-endian and big-endian, + // and choose the waveform that has less jumps in it. + // Sample data is normalized for those comparisons, otherwise 8-bit data converted to 16-bit will almost always be more optimal + // when byte-swapped (as the upper byte is always 0). + const uint8 numChannels = sample.GetNumChannels(); + auto sample16 = mpt::as_span(sample.sample16(), sample.nLength * numChannels); + int32 minNative = int16_max, maxNative = int16_min, minSwapped = int16_max, maxSwapped = int16_min; + for(const auto vNative : sample16) + { + const int16 vSwapped = mpt::SwapBytesImpl(vNative); + if(vNative < minNative) + minNative = vNative; + if(vNative > maxNative) + maxNative = vNative; + if(vSwapped < minSwapped) + minSwapped = vSwapped; + if(vSwapped > maxSwapped) + maxSwapped = vSwapped; + } + + const int32 minMaxNative = std::max({int32(1), -minNative, maxNative}); + const int32 minMaxSwapped = std::max({int32(1), -minSwapped, maxSwapped}); + const double factorNative = 1.0 / minMaxNative, factorSwapped = 1.0 / minMaxSwapped; + double errorNative = 0.0, errorSwapped = 0.0; + for(uint8 chn = 0; chn < numChannels; chn++) + { + const int16 *vNative = sample.sample16() + chn; + int32 prev = 0; + for(SmpLength i = sample.nLength; i != 0; i--, vNative += numChannels) + { + const double diffNative = (*vNative - prev) * factorNative; + errorNative += diffNative * diffNative; + const double diffSwapped = (mpt::SwapBytesImpl(*vNative) - mpt::SwapBytesImpl(static_cast<int16>(prev))) * factorSwapped; + errorSwapped += diffSwapped * diffSwapped; + prev = *vNative; + } + } + if(errorNative > errorSwapped) + { + for(auto &v : sample16) + { + v = mpt::SwapBytesImpl(v); + } + } + } + sample.PrecomputeLoops(*this, false); return true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Snd_defs.h new/libopenmpt-0.6.9+release.autotools/soundlib/Snd_defs.h --- old/libopenmpt-0.6.8+release.autotools/soundlib/Snd_defs.h 2023-01-07 15:48:47.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Snd_defs.h 2023-03-01 20:27:31.000000000 +0100 @@ -105,15 +105,16 @@ DECLARE_FLAGSET(MODTYPE) -enum MODCONTAINERTYPE +enum class ModContainerType { - MOD_CONTAINERTYPE_NONE = 0x0, - MOD_CONTAINERTYPE_UMX = 0x3, - MOD_CONTAINERTYPE_XPK = 0x4, - MOD_CONTAINERTYPE_PP20 = 0x5, - MOD_CONTAINERTYPE_MMCMP= 0x6, - MOD_CONTAINERTYPE_WAV = 0x7, // WAV as module - MOD_CONTAINERTYPE_UAX = 0x8, // Unreal sample set as module + None, + UMX, + XPK, + PP20, + MMCMP, + WAV, // WAV as module + UAX, // Unreal sample set as module + Generic, // Generic CUnarchiver container }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Snd_fx.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/Snd_fx.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/Snd_fx.cpp 2023-01-12 09:15:47.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Snd_fx.cpp 2023-02-19 00:53:36.000000000 +0100 @@ -955,6 +955,7 @@ chn.nNewNote = chn.nLastNote; if(chn.nNewIns != 0) InstrumentChange(chn, chn.nNewIns, porta); NoteChange(chn, m.note, porta); + HandleNoteChangeFilter(chn); HandleDigiSamplePlayDirection(playState, nChn); memory.chnSettings[nChn].incChanged = true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Sndfile.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/Sndfile.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/Sndfile.cpp 2023-01-07 15:48:47.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Sndfile.cpp 2023-03-01 20:27:31.000000000 +0100 @@ -160,7 +160,7 @@ Instruments[i] = nullptr; } - m_ContainerType = MOD_CONTAINERTYPE_NONE; + m_ContainerType = ModContainerType::None; m_nChannels = 0; m_nInstruments = 0; m_nSamples = 0; @@ -405,6 +405,7 @@ { m_songMessage.assign(mpt::ToCharset(mpt::Charset::Locale, unarchiver.GetComment())); } + m_ContainerType = ModContainerType::Generic; return true; } } @@ -420,17 +421,17 @@ if(file.IsValid()) { std::vector<ContainerItem> containerItems; - MODCONTAINERTYPE packedContainerType = MOD_CONTAINERTYPE_NONE; + ModContainerType packedContainerType = ModContainerType::None; if(!(loadFlags & skipContainer)) { ContainerLoadingFlags containerLoadFlags = (loadFlags == onlyVerifyHeader) ? ContainerOnlyVerifyHeader : ContainerUnwrapData; #if !defined(MPT_WITH_ANCIENT) - if(packedContainerType == MOD_CONTAINERTYPE_NONE && UnpackXPK(containerItems, file, containerLoadFlags)) packedContainerType = MOD_CONTAINERTYPE_XPK; - if(packedContainerType == MOD_CONTAINERTYPE_NONE && UnpackPP20(containerItems, file, containerLoadFlags)) packedContainerType = MOD_CONTAINERTYPE_PP20; - if(packedContainerType == MOD_CONTAINERTYPE_NONE && UnpackMMCMP(containerItems, file, containerLoadFlags)) packedContainerType = MOD_CONTAINERTYPE_MMCMP; + if(packedContainerType == ModContainerType::None && UnpackXPK(containerItems, file, containerLoadFlags)) packedContainerType = ModContainerType::XPK; + if(packedContainerType == ModContainerType::None && UnpackPP20(containerItems, file, containerLoadFlags)) packedContainerType = ModContainerType::PP20; + if(packedContainerType == ModContainerType::None && UnpackMMCMP(containerItems, file, containerLoadFlags)) packedContainerType = ModContainerType::MMCMP; #endif // !MPT_WITH_ANCIENT - if(packedContainerType == MOD_CONTAINERTYPE_NONE && UnpackUMX(containerItems, file, containerLoadFlags)) packedContainerType = MOD_CONTAINERTYPE_UMX; - if(packedContainerType != MOD_CONTAINERTYPE_NONE) + if(packedContainerType == ModContainerType::None && UnpackUMX(containerItems, file, containerLoadFlags)) packedContainerType = ModContainerType::UMX; + if(packedContainerType != ModContainerType::None) { if(loadFlags == onlyVerifyHeader) { @@ -462,14 +463,14 @@ if(!loaderSuccess) { m_nType = MOD_TYPE_NONE; - m_ContainerType = MOD_CONTAINERTYPE_NONE; + m_ContainerType = ModContainerType::None; } if(loadFlags == onlyVerifyHeader) { return loaderSuccess; } - if(packedContainerType != MOD_CONTAINERTYPE_NONE && m_ContainerType == MOD_CONTAINERTYPE_NONE) + if(packedContainerType != ModContainerType::None && m_ContainerType == ModContainerType::None) { m_ContainerType = packedContainerType; } @@ -737,7 +738,7 @@ #endif // NO_PLUGINS m_nType = MOD_TYPE_NONE; - m_ContainerType = MOD_CONTAINERTYPE_NONE; + m_ContainerType = ModContainerType::None; m_nChannels = m_nSamples = m_nInstruments = 0; return true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Sndfile.h new/libopenmpt-0.6.9+release.autotools/soundlib/Sndfile.h --- old/libopenmpt-0.6.8+release.autotools/soundlib/Sndfile.h 2023-01-04 22:27:07.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Sndfile.h 2023-03-03 19:32:39.000000000 +0100 @@ -457,7 +457,7 @@ #endif // MODPLUG_TRACKER Enum<MODTYPE> m_nType; private: - MODCONTAINERTYPE m_ContainerType = MOD_CONTAINERTYPE_NONE; + ModContainerType m_ContainerType = ModContainerType::None; public: CHANNELINDEX m_nChannels = 0; SAMPLEINDEX m_nSamples = 0; @@ -735,7 +735,7 @@ bool Destroy(); Enum<MODTYPE> GetType() const noexcept { return m_nType; } - MODCONTAINERTYPE GetContainerType() const noexcept { return m_ContainerType; } + ModContainerType GetContainerType() const noexcept { return m_ContainerType; } // rough heuristic, could be improved mpt::Charset GetCharsetFile() const // 8bit string encoding of strings in the on-disk file @@ -927,8 +927,8 @@ static std::vector<const char *> GetSupportedExtensions(bool otherFormats); static bool IsExtensionSupported(std::string_view ext); // UTF8, casing of ext is ignored - static mpt::ustring ModContainerTypeToString(MODCONTAINERTYPE containertype); - static mpt::ustring ModContainerTypeToTracker(MODCONTAINERTYPE containertype); + static mpt::ustring ModContainerTypeToString(ModContainerType containertype); + static mpt::ustring ModContainerTypeToTracker(ModContainerType containertype); // Repair non-standard stuff in modules saved with previous ModPlug versions void UpgradeModule(); @@ -1127,6 +1127,7 @@ void SendMIDINote(CHANNELINDEX chn, uint16 note, uint16 volume); int SetupChannelFilter(ModChannel &chn, bool bReset, int envModifier = 256) const; + int HandleNoteChangeFilter(ModChannel &chn) const; // Low-Level effect processing void DoFreqSlide(ModChannel &chn, int32 &period, int32 amount, bool isTonePorta = false) const; @@ -1189,7 +1190,7 @@ bool ReadXISample(SAMPLEINDEX nSample, FileReader &file); bool ReadITSSample(SAMPLEINDEX nSample, FileReader &file, bool rewind = true); bool ReadITISample(SAMPLEINDEX nSample, FileReader &file); - bool ReadIFFSample(SAMPLEINDEX sample, FileReader &file); + bool ReadIFFSample(SAMPLEINDEX sample, FileReader &file, bool allowLittleEndian = true); bool ReadBRRSample(SAMPLEINDEX sample, FileReader &file); bool ReadFLACSample(SAMPLEINDEX sample, FileReader &file); bool ReadOpusSample(SAMPLEINDEX sample, FileReader &file); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Sndmix.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/Sndmix.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/Sndmix.cpp 2023-01-28 17:08:59.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Sndmix.cpp 2023-03-01 19:49:32.000000000 +0100 @@ -1985,6 +1985,44 @@ } +int CSoundFile::HandleNoteChangeFilter(ModChannel &chn) const +{ + int cutoff = -1; + if(!chn.triggerNote) + return cutoff; + + bool useFilter = !m_SongFlags[SONG_MPTFILTERMODE]; + if(const ModInstrument *pIns = chn.pModInstrument; pIns != nullptr) + { + if(pIns->IsResonanceEnabled()) + { + chn.nResonance = pIns->GetResonance(); + useFilter = true; + } + if(pIns->IsCutoffEnabled()) + { + chn.nCutOff = pIns->GetCutoff(); + useFilter = true; + } + if(useFilter && (pIns->filterMode != FilterMode::Unchanged)) + { + chn.nFilterMode = pIns->filterMode; + } + } else + { + chn.nVolSwing = chn.nPanSwing = 0; + chn.nCutSwing = chn.nResSwing = 0; + } + if((chn.nCutOff < 0x7F || m_playBehaviour[kITFilterBehaviour]) && useFilter) + { + cutoff = SetupChannelFilter(chn, true); + if(cutoff >= 0) + cutoff = chn.nCutOff / 2u; + } + return cutoff; +} + + // Returns channel increment and frequency with FREQ_FRACBITS fractional bits std::pair<SamplePosition, uint32> CSoundFile::GetChannelIncrement(const ModChannel &chn, uint32 period, int periodFrac) const { @@ -2251,38 +2289,8 @@ } // Setup Initial Filter for this note - int cutoff = -1; - if(chn.triggerNote) - { - bool useFilter = !m_SongFlags[SONG_MPTFILTERMODE]; - if(pIns) - { - if(pIns->IsResonanceEnabled()) - { - chn.nResonance = pIns->GetResonance(); - useFilter = true; - } - if(pIns->IsCutoffEnabled()) - { - chn.nCutOff = pIns->GetCutoff(); - useFilter = true; - } - if(useFilter && (pIns->filterMode != FilterMode::Unchanged)) - { - chn.nFilterMode = pIns->filterMode; - } - } else - { - chn.nVolSwing = chn.nPanSwing = 0; - chn.nCutSwing = chn.nResSwing = 0; - } - if((chn.nCutOff < 0x7F || m_playBehaviour[kITFilterBehaviour]) && useFilter) - { - cutoff = SetupChannelFilter(chn, true); - if(cutoff >= 0) - cutoff = chn.nCutOff / 2u; - } - } + if(int cutoff = HandleNoteChangeFilter(chn); cutoff >= 0 && chn.dwFlags[CHN_ADLIB] && m_opl) + m_opl->Volume(nChn, static_cast<uint8>(cutoff), true); // Now that all relevant envelopes etc. have been processed, we can parse the MIDI macro data. ProcessMacroOnChannel(nChn); @@ -2291,14 +2299,11 @@ if(samplePlaying) { int envCutoff = ProcessPitchFilterEnvelope(chn, period); - if(envCutoff >= 0) - cutoff = envCutoff / 4; + // Cutoff doubles as modulator intensity for FM instruments + if(envCutoff >= 0 && chn.dwFlags[CHN_ADLIB] && m_opl) + m_opl->Volume(nChn, static_cast<uint8>(envCutoff / 4), true); } - // Cutoff doubles as modulator intensity for FM instruments - if(cutoff >= 0 && chn.dwFlags[CHN_ADLIB] && m_opl) - m_opl->Volume(nChn, static_cast<uint8>(cutoff), true); - if(chn.rowCommand.volcmd == VOLCMD_VIBRATODEPTH && (chn.rowCommand.command == CMD_VIBRATO || chn.rowCommand.command == CMD_VIBRATOVOL || chn.rowCommand.command == CMD_FINEVIBRATO)) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/Tables.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/Tables.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/Tables.cpp 2021-11-23 22:44:07.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/Tables.cpp 2023-03-01 20:27:31.000000000 +0100 @@ -117,7 +117,7 @@ struct ModContainerInfo { - MODCONTAINERTYPE format; // MOD_CONTAINERTYPE_XXXX + ModContainerType format; // ModContainerType::XXX const mpt::uchar *name; // "Unreal Music" const char *extension; // "umx" }; @@ -125,13 +125,14 @@ static constexpr ModContainerInfo modContainerInfo[] = { // Container formats - { MOD_CONTAINERTYPE_UMX, UL_("Unreal Music"), "umx" }, - { MOD_CONTAINERTYPE_XPK, UL_("XPK packed"), "xpk" }, - { MOD_CONTAINERTYPE_PP20, UL_("PowerPack PP20"), "ppm" }, - { MOD_CONTAINERTYPE_MMCMP, UL_("Music Module Compressor"), "mmcmp" }, + { ModContainerType::UMX, UL_("Unreal Music"), "umx" }, + { ModContainerType::XPK, UL_("XPK packed"), "xpk" }, + { ModContainerType::PP20, UL_("PowerPack PP20"), "ppm" }, + { ModContainerType::MMCMP, UL_("Music Module Compressor"), "mmcmp" }, #ifdef MODPLUG_TRACKER - { MOD_CONTAINERTYPE_WAV, UL_("Wave"), "wav" }, - { MOD_CONTAINERTYPE_UAX, UL_("Unreal Sounds"), "uax" }, + { ModContainerType::WAV, UL_("Wave"), "wav" }, + { ModContainerType::UAX, UL_("Unreal Sounds"), "uax" }, + { ModContainerType::Generic, UL_("Generic Archive"), "???" }, #endif }; @@ -214,7 +215,7 @@ } -mpt::ustring CSoundFile::ModContainerTypeToString(MODCONTAINERTYPE containertype) +mpt::ustring CSoundFile::ModContainerTypeToString(ModContainerType containertype) { for(const auto &containerInfo : modContainerInfo) { @@ -227,7 +228,7 @@ } -mpt::ustring CSoundFile::ModContainerTypeToTracker(MODCONTAINERTYPE containertype) +mpt::ustring CSoundFile::ModContainerTypeToTracker(ModContainerType containertype) { std::set<mpt::ustring> retvals; mpt::ustring retval; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/modcommand.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/modcommand.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/modcommand.cpp 2023-01-13 21:55:59.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/modcommand.cpp 2023-02-25 13:00:27.000000000 +0100 @@ -557,7 +557,7 @@ { switch(command) { - case CMD_TONEPORTAVOL: // lacks memory -> 500 is the same as 300 + case CMD_TONEPORTAVOL: // lacks memory -> 500 is the same as 300 if(param == 0x00) command = CMD_TONEPORTAMENTO; break; @@ -574,7 +574,15 @@ command = CMD_NONE; break; - case CMD_MODCMDEX: // This would turn into "Set Active Macro", so let's better remove it + case CMD_MODCMDEX: + // No effect memory + if(param == 0x10 || param == 0x20 || param == 0xA0 || param == 0xB0) + command = CMD_NONE; + // This would turn into "Set Active Macro", so let's better remove it + if((param & 0xF0) == 0xF0) + command = CMD_NONE; + break; + case CMD_S3MCMDEX: if((param & 0xF0) == 0xF0) command = CMD_NONE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/soundlib/plugins/PlugInterface.cpp new/libopenmpt-0.6.9+release.autotools/soundlib/plugins/PlugInterface.cpp --- old/libopenmpt-0.6.8+release.autotools/soundlib/plugins/PlugInterface.cpp 2022-09-07 02:30:11.000000000 +0200 +++ new/libopenmpt-0.6.9+release.autotools/soundlib/plugins/PlugInterface.cpp 2023-02-11 14:35:35.000000000 +0100 @@ -215,7 +215,7 @@ #ifdef MODPLUG_TRACKER if(m_SndFile.GetpModDoc()) - m_SndFile.GetpModDoc()->UpdateAllViews(nullptr, PluginHint(m_nSlot + 1).Info(), nullptr); + m_SndFile.GetpModDoc()->UpdateAllViews(PluginHint(m_nSlot + 1).Info()); #endif // MODPLUG_TRACKER } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/src/mpt/base/alloc.hpp new/libopenmpt-0.6.9+release.autotools/src/mpt/base/alloc.hpp --- old/libopenmpt-0.6.8+release.autotools/src/mpt/base/alloc.hpp 2022-09-25 18:55:57.000000000 +0200 +++ new/libopenmpt-0.6.9+release.autotools/src/mpt/base/alloc.hpp 2023-02-11 19:48:52.000000000 +0100 @@ -123,7 +123,7 @@ // casts between vector<->string of byte-castable types template <typename Tdst, typename Tsrc> -inline Tdst buffer_cast(Tsrc src) { +inline Tdst buffer_cast(const Tsrc & src) { return buffer_cast_impl<Tdst, Tsrc>()(src); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libopenmpt-0.6.8+release.autotools/src/mpt/base/detect_compiler.hpp new/libopenmpt-0.6.9+release.autotools/src/mpt/base/detect_compiler.hpp --- old/libopenmpt-0.6.8+release.autotools/src/mpt/base/detect_compiler.hpp 2022-11-09 14:40:27.000000000 +0100 +++ new/libopenmpt-0.6.9+release.autotools/src/mpt/base/detect_compiler.hpp 2023-02-22 10:36:59.000000000 +0100 @@ -50,7 +50,9 @@ #elif defined(_MSC_VER) #define MPT_COMPILER_MSVC 1 -#if (_MSC_VER >= 1934) +#if (_MSC_VER >= 1935) +#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2022, 5) +#elif (_MSC_VER >= 1934) #define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2022, 4) #elif (_MSC_VER >= 1933) #define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2022, 3)
