From 66338e2c83f84aa0f73a823ff6d349ea003171d0 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Sat, 4 Feb 2023 22:13:01 -0800 Subject: [PATCH] Updated libOpenMPT to version 0.6.8 Signed-off-by: Christopher Snowhill --- Frameworks/OpenMPT/OpenMPT/LICENSE | 2 +- .../OpenMPT/build/android_ndk/Android.mk | 3 +- Frameworks/OpenMPT/OpenMPT/build/dist.mk | 6 +- .../OpenMPT/build/make/config-mingw-w64.mk | 10 +- .../OpenMPT/build/make/warnings-gcc.mk | 1 + .../OpenMPT/build/svn_version/svn_version.h | 8 +- .../OpenMPT/OpenMPT/common/mptString.cpp | 14 +- Frameworks/OpenMPT/OpenMPT/common/version.cpp | 8 +- .../OpenMPT/OpenMPT/common/versionNumber.h | 2 +- .../contrib/libmodplug-0.8.8.5/LICENSE | 2 +- .../contrib/libmodplug-0.8.9.0/LICENSE | 2 +- .../OpenMPT/libopenmpt/dox/changelog.md | 28 ++++ .../OpenMPT/OpenMPT/libopenmpt/in_openmpt.cpp | 2 +- .../OpenMPT/OpenMPT/libopenmpt/libopenmpt.hpp | 2 +- .../OpenMPT/libopenmpt/libopenmpt_version.h | 2 +- .../OpenMPT/libopenmpt/libopenmpt_version.mk | 4 +- .../OpenMPT/libopenmpt/libopenmpt_version.rc | 2 +- .../OpenMPT/libopenmpt/xmp-openmpt.cpp | 6 +- .../OpenMPT/OpenMPT/openmpt123/openmpt123.cpp | 61 +++++---- .../OpenMPT/OpenMPT/openmpt123/openmpt123.hpp | 7 +- .../OpenMPT/OpenMPT/soundlib/ContainerXPK.cpp | 2 + .../OpenMPT/OpenMPT/soundlib/Dlsbank.cpp | 4 +- Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.h | 2 +- .../OpenMPT/OpenMPT/soundlib/Fastmix.cpp | 13 +- .../OpenMPT/soundlib/ITCompression.cpp | 2 + .../OpenMPT/OpenMPT/soundlib/Load_ams.cpp | 26 ++-- .../OpenMPT/OpenMPT/soundlib/Load_dsym.cpp | 6 +- .../OpenMPT/OpenMPT/soundlib/Load_mo3.cpp | 6 +- .../OpenMPT/OpenMPT/soundlib/Load_mod.cpp | 3 +- .../OpenMPT/OpenMPT/soundlib/Load_s3m.cpp | 4 + .../OpenMPT/OpenMPT/soundlib/ModSample.cpp | 6 +- .../OpenMPT/OpenMPT/soundlib/S3MTools.h | 1 + .../OpenMPT/soundlib/SampleFormats.cpp | 16 ++- .../OpenMPT/OpenMPT/soundlib/SampleIO.cpp | 2 +- .../OpenMPT/OpenMPT/soundlib/Snd_defs.h | 3 + .../OpenMPT/OpenMPT/soundlib/Snd_flt.cpp | 35 ++++- .../OpenMPT/OpenMPT/soundlib/Snd_fx.cpp | 126 +++++++++--------- .../OpenMPT/OpenMPT/soundlib/Sndfile.cpp | 1 + Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.h | 10 +- .../OpenMPT/OpenMPT/soundlib/Sndmix.cpp | 48 ++++++- .../OpenMPT/soundlib/UpgradeModule.cpp | 1 + .../OpenMPT/OpenMPT/soundlib/modcommand.cpp | 4 +- .../OpenMPT/soundlib/plugins/SymMODEcho.cpp | 2 +- .../soundlib/plugins/dmo/Distortion.cpp | 2 +- .../OpenMPT/src/mpt/LICENSE.BSD-3-Clause.txt | 2 +- .../OpenMPT/src/mpt/base/algorithm.hpp | 2 +- .../OpenMPT/OpenMPT/src/mpt/base/alloc.hpp | 6 + .../OpenMPT/OpenMPT/src/mpt/base/bit.hpp | 6 +- .../OpenMPT/src/mpt/base/detect_compiler.hpp | 4 +- .../src/mpt/base/tests/tests_base_bit.hpp | 30 ++--- .../src/mpt/binary/tests/tests_binary.hpp | 1 + .../src/mpt/format/default_formatter.hpp | 2 - .../mpt/format/tests/tests_format_simple.hpp | 1 + .../OpenMPT/OpenMPT/src/mpt/io/base.hpp | 1 + .../OpenMPT/src/mpt/io/io_stdstream.hpp | 1 + .../OpenMPT/src/mpt/io/tests/tests_io.hpp | 7 +- .../OpenMPT/src/mpt/io_read/filecursor.hpp | 5 +- .../OpenMPT/src/mpt/io_read/filedata.hpp | 4 +- .../OpenMPT/src/mpt/io_read/filedata_base.hpp | 4 +- .../mpt/io_read/filedata_base_seekable.hpp | 2 + .../mpt/io_read/filedata_base_unseekable.hpp | 4 +- .../src/mpt/io_read/filedata_memory.hpp | 4 +- .../OpenMPT/src/mpt/io_write/buffer.hpp | 1 + .../src/mpt/osinfo/windows_version.hpp | 16 ++- .../OpenMPT/OpenMPT/src/mpt/parse/parse.hpp | 8 +- .../src/mpt/parse/tests/tests_parse.hpp | 7 + .../OpenMPT/OpenMPT/src/mpt/string/buffer.hpp | 1 + .../OpenMPT/src/mpt/string/utility.hpp | 1 + .../tests/tests_string_transcode.hpp | 3 + .../OpenMPT/OpenMPT/src/mpt/uuid/uuid.hpp | 2 +- .../src/openmpt/soundbase/DitherModPlug.hpp | 4 +- .../src/openmpt/soundbase/DitherSimple.hpp | 4 +- Frameworks/OpenMPT/OpenMPT/test/test.cpp | 125 ++++++++--------- 73 files changed, 475 insertions(+), 280 deletions(-) diff --git a/Frameworks/OpenMPT/OpenMPT/LICENSE b/Frameworks/OpenMPT/OpenMPT/LICENSE index 7c06acaeb..d831c485b 100644 --- a/Frameworks/OpenMPT/OpenMPT/LICENSE +++ b/Frameworks/OpenMPT/OpenMPT/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2004-2022, OpenMPT Project Developers and Contributors +Copyright (c) 2004-2023, OpenMPT Project Developers and Contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. diff --git a/Frameworks/OpenMPT/OpenMPT/build/android_ndk/Android.mk b/Frameworks/OpenMPT/OpenMPT/build/android_ndk/Android.mk index 48291c875..d427b624c 100644 --- a/Frameworks/OpenMPT/OpenMPT/build/android_ndk/Android.mk +++ b/Frameworks/OpenMPT/OpenMPT/build/android_ndk/Android.mk @@ -215,8 +215,7 @@ LOCAL_SRC_FILES += \ sounddsp/DSP.cpp \ sounddsp/EQ.cpp \ sounddsp/Reverb.cpp \ - test/TestToolsLib.cpp \ - test/test.cpp + include $(BUILD_SHARED_LIBRARY) diff --git a/Frameworks/OpenMPT/OpenMPT/build/dist.mk b/Frameworks/OpenMPT/OpenMPT/build/dist.mk index daf08768f..096919d4a 100644 --- a/Frameworks/OpenMPT/OpenMPT/build/dist.mk +++ b/Frameworks/OpenMPT/OpenMPT/build/dist.mk @@ -1,4 +1,4 @@ -MPT_SVNVERSION=17954 -MPT_SVNURL=https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.6 -MPT_SVNDATE=2022-09-25T14:18:19.447172Z +MPT_SVNVERSION=18680 +MPT_SVNURL=https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.8 +MPT_SVNDATE=2023-01-29T12:13:49.877060Z diff --git a/Frameworks/OpenMPT/OpenMPT/build/make/config-mingw-w64.mk b/Frameworks/OpenMPT/OpenMPT/build/make/config-mingw-w64.mk index 866ef8624..fd655435a 100644 --- a/Frameworks/OpenMPT/OpenMPT/build/make/config-mingw-w64.mk +++ b/Frameworks/OpenMPT/OpenMPT/build/make/config-mingw-w64.mk @@ -80,15 +80,15 @@ CPPFLAGS += -D_WIN32_WINNT=0x0501 else ifeq ($(WINDOWS_VERSION),winxp64) CPPFLAGS += -D_WIN32_WINNT=0x0502 else ifeq ($(WINDOWS_VERSION),winvista) -CPPFLAGS += -DNTDDI_VERSION=0x06000000 +CPPFLAGS += -DNTDDI_VERSION=0x06000000 -D_WIN32_WINNT=0x0600 else ifeq ($(WINDOWS_VERSION),win7) -CPPFLAGS += -DNTDDI_VERSION=0x06010000 +CPPFLAGS += -DNTDDI_VERSION=0x06010000 -D_WIN32_WINNT=0x0601 else ifeq ($(WINDOWS_VERSION),win8) -CPPFLAGS += -DNTDDI_VERSION=0x06020000 +CPPFLAGS += -DNTDDI_VERSION=0x06020000 -D_WIN32_WINNT=0x0602 else ifeq ($(WINDOWS_VERSION),win8.1) -CPPFLAGS += -DNTDDI_VERSION=0x06030000 +CPPFLAGS += -DNTDDI_VERSION=0x06030000 -D_WIN32_WINNT=0x0603 else ifeq ($(WINDOWS_VERSION),win10) -CPPFLAGS += -DNTDDI_VERSION=0x0A000000 +CPPFLAGS += -DNTDDI_VERSION=0x0A000000 -D_WIN32_WINNT=0x0A00 else $(error unknown WINDOWS_VERSION) endif diff --git a/Frameworks/OpenMPT/OpenMPT/build/make/warnings-gcc.mk b/Frameworks/OpenMPT/OpenMPT/build/make/warnings-gcc.mk index 2f686e6ec..99d755c25 100644 --- a/Frameworks/OpenMPT/OpenMPT/build/make/warnings-gcc.mk +++ b/Frameworks/OpenMPT/OpenMPT/build/make/warnings-gcc.mk @@ -21,6 +21,7 @@ CFLAGS_SILENT += -Wno-float-conversion CFLAGS_SILENT += -Wno-implicit-fallthrough CFLAGS_SILENT += -Wno-old-style-declaration CFLAGS_SILENT += -Wno-sign-compare +CFLAGS_SILENT += -Wno-stringop-overflow CFLAGS_SILENT += -Wno-type-limits CFLAGS_SILENT += -Wno-unused-but-set-variable CFLAGS_SILENT += -Wno-unused-function diff --git a/Frameworks/OpenMPT/OpenMPT/build/svn_version/svn_version.h b/Frameworks/OpenMPT/OpenMPT/build/svn_version/svn_version.h index 10e537b55..576a1950f 100644 --- a/Frameworks/OpenMPT/OpenMPT/build/svn_version/svn_version.h +++ b/Frameworks/OpenMPT/OpenMPT/build/svn_version/svn_version.h @@ -1,10 +1,10 @@ #pragma once -#define OPENMPT_VERSION_SVNVERSION "17954" -#define OPENMPT_VERSION_REVISION 17954 +#define OPENMPT_VERSION_SVNVERSION "18680" +#define OPENMPT_VERSION_REVISION 18680 #define OPENMPT_VERSION_DIRTY 0 #define OPENMPT_VERSION_MIXEDREVISIONS 0 -#define OPENMPT_VERSION_URL "https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.6" -#define OPENMPT_VERSION_DATE "2022-09-25T14:18:19.447172Z" +#define OPENMPT_VERSION_URL "https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.8" +#define OPENMPT_VERSION_DATE "2023-01-29T12:13:49.877060Z" #define OPENMPT_VERSION_IS_PACKAGE 1 diff --git a/Frameworks/OpenMPT/OpenMPT/common/mptString.cpp b/Frameworks/OpenMPT/OpenMPT/common/mptString.cpp index 4da6ab97a..c64beef53 100644 --- a/Frameworks/OpenMPT/OpenMPT/common/mptString.cpp +++ b/Frameworks/OpenMPT/OpenMPT/common/mptString.cpp @@ -516,14 +516,20 @@ CString ToCString(const std::wstring &str) #ifdef UNICODE return str.c_str(); #else + // cppcheck false-positive + // cppcheck-suppress returnDanglingLifetime return ToCharset(Charset::Locale, str).c_str(); #endif } CString ToCString(Charset from, const std::string &str) { #ifdef UNICODE + // cppcheck false-positive + // cppcheck-suppress returnDanglingLifetime return ToWide(from, str).c_str(); #else + // cppcheck false-positive + // cppcheck-suppress returnDanglingLifetime return ToCharset(Charset::Locale, from, str).c_str(); #endif } @@ -547,6 +553,8 @@ std::string ToCharset(Charset to, const CString &str) CString ToCString(const mpt::lstring &str) { #ifdef UNICODE + // cppcheck false-positive + // cppcheck-suppress returnDanglingLifetime return ToWide(str).c_str(); #else return str.c_str(); @@ -635,8 +643,12 @@ mpt::winstring ToWin(const mpt::ustring &str) CString ToCString(const mpt::ustring &str) { #ifdef UNICODE + // cppcheck false-positive + // cppcheck-suppress returnDanglingLifetime return String::DecodeImpl(mpt::Charset::UTF8, str).c_str(); #else // !UNICODE + // cppcheck false-positive + // cppcheck-suppress returnDanglingLifetime return String::ConvertImpl(mpt::Charset::Locale, mpt::Charset::UTF8, str).c_str(); #endif // UNICODE } @@ -810,7 +822,7 @@ mpt::ustring ToUpperCase(const mpt::ustring &s) #endif // UNICODE #else // !MPT_WITH_MFC std::wstring ws = mpt::ToWide(s); - std::transform(ws.begin(), ws.end(), ws.begin(), &std::towlower); + std::transform(ws.begin(), ws.end(), ws.begin(), &std::towupper); return mpt::ToUnicode(ws); #endif // MPT_WITH_MFC } diff --git a/Frameworks/OpenMPT/OpenMPT/common/version.cpp b/Frameworks/OpenMPT/OpenMPT/common/version.cpp index e33b90aad..e808e4336 100644 --- a/Frameworks/OpenMPT/OpenMPT/common/version.cpp +++ b/Frameworks/OpenMPT/OpenMPT/common/version.cpp @@ -592,12 +592,12 @@ mpt::ustring GetFullCreditsString() "libopenmpt (based on OpenMPT / Open ModPlug Tracker)\n" #endif "\n" - "Copyright \xC2\xA9 2004-2022 OpenMPT Project Developers and Contributors\n" + "Copyright \xC2\xA9 2004-2023 OpenMPT Project Developers and Contributors\n" "Copyright \xC2\xA9 1997-2003 Olivier Lapicque\n" "\n" "Developers:\n" - "Johannes Schultz (2008-2022)\n" - "J\xC3\xB6rn Heusipp (2012-2022)\n" + "Johannes Schultz (2008-2023)\n" + "J\xC3\xB6rn Heusipp (2012-2023)\n" "Ahti Lepp\xC3\xA4nen (2005-2011)\n" "Robin Fernandes (2004-2007)\n" "Sergiy Pylypenko (2007)\n" @@ -792,7 +792,7 @@ mpt::ustring GetFullCreditsString() mpt::ustring GetLicenseString() { return MPT_UTF8( - "Copyright (c) 2004-2022, OpenMPT Project Developers and Contributors" "\n" + "Copyright (c) 2004-2023, OpenMPT Project Developers and Contributors" "\n" "Copyright (c) 1997-2003, Olivier Lapicque" "\n" "All rights reserved." "\n" "" "\n" diff --git a/Frameworks/OpenMPT/OpenMPT/common/versionNumber.h b/Frameworks/OpenMPT/OpenMPT/common/versionNumber.h index ff9c08286..de55b06e8 100644 --- a/Frameworks/OpenMPT/OpenMPT/common/versionNumber.h +++ b/Frameworks/OpenMPT/OpenMPT/common/versionNumber.h @@ -17,7 +17,7 @@ OPENMPT_NAMESPACE_BEGIN // 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 07 +#define VER_MINOR 10 #define VER_MINORMINOR 00 OPENMPT_NAMESPACE_END diff --git a/Frameworks/OpenMPT/OpenMPT/contrib/libmodplug-0.8.8.5/LICENSE b/Frameworks/OpenMPT/OpenMPT/contrib/libmodplug-0.8.8.5/LICENSE index 7c06acaeb..d831c485b 100644 --- a/Frameworks/OpenMPT/OpenMPT/contrib/libmodplug-0.8.8.5/LICENSE +++ b/Frameworks/OpenMPT/OpenMPT/contrib/libmodplug-0.8.8.5/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2004-2022, OpenMPT Project Developers and Contributors +Copyright (c) 2004-2023, OpenMPT Project Developers and Contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. diff --git a/Frameworks/OpenMPT/OpenMPT/contrib/libmodplug-0.8.9.0/LICENSE b/Frameworks/OpenMPT/OpenMPT/contrib/libmodplug-0.8.9.0/LICENSE index 7c06acaeb..d831c485b 100644 --- a/Frameworks/OpenMPT/OpenMPT/contrib/libmodplug-0.8.9.0/LICENSE +++ b/Frameworks/OpenMPT/OpenMPT/contrib/libmodplug-0.8.9.0/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2004-2022, OpenMPT Project Developers and Contributors +Copyright (c) 2004-2023, OpenMPT Project Developers and Contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. diff --git a/Frameworks/OpenMPT/OpenMPT/libopenmpt/dox/changelog.md b/Frameworks/OpenMPT/OpenMPT/libopenmpt/dox/changelog.md index 4973dda6a..da0045bbb 100644 --- a/Frameworks/OpenMPT/OpenMPT/libopenmpt/dox/changelog.md +++ b/Frameworks/OpenMPT/OpenMPT/libopenmpt/dox/changelog.md @@ -5,6 +5,34 @@ Changelog {#changelog} For fully detailed change log, please see the source repository directly. This is just a high-level summary. +### libopenmpt 0.6.8 (2023-01-29) + + * [**Bug**] DSYM: Loading DSYM files got broken in 0.6.7. + + * When seeking around in a module, the tempo was sometimes incorrectly limited + to 255 BPM. + * Initial instrument cutoff was broken for OPL instruments in + libopenmnpt 0.6.7. + + * mpg123: Update to v1.31.2 (2023-01-14). + +### libopenmpt 0.6.7 (2023-01-08) + + * [**Bug**] openmpt123: openmpt123 crashed on Windows 9x when showing any + console output. + + * IT: In sample mode, portamento to a different sample turns off the filter if + cutoff / resonance was previously 127 / 0. + * S3M Detect files saved with Graoumf Tracker instead of claiming they were + made with OpenMPT 4.47. + * S3M: Pattern loop state was not propagated anymore since libopenmpt 0.6.0, + leading to wrong song length calculation and SB0 + SBx being located on + different channels not working properly anymore. + + * mpg123: Update to v1.31.1 (2022-11-01). + * FLAC: Update to v1.4.2 (2022-10-22). + * pugixml: Update to v1.13 (2022-11-02). + ### libopenmpt 0.6.6 (2022-09-25) * [**Sec**] Possible crash when playing manipulated IT / MPTM files with a T00 diff --git a/Frameworks/OpenMPT/OpenMPT/libopenmpt/in_openmpt.cpp b/Frameworks/OpenMPT/OpenMPT/libopenmpt/in_openmpt.cpp index b40159552..736c1c7e5 100644 --- a/Frameworks/OpenMPT/OpenMPT/libopenmpt/in_openmpt.cpp +++ b/Frameworks/OpenMPT/OpenMPT/libopenmpt/in_openmpt.cpp @@ -262,7 +262,7 @@ static void config( HWND hwndParent ) { static void about( HWND hwndParent ) { std::ostringstream about; about << SHORT_TITLE << " version " << openmpt::string::get( "library_version" ) << " " << "(built " << openmpt::string::get( "build" ) << ")" << std::endl; - about << " Copyright (c) 2013-2022 OpenMPT Project Developers and Contributors (https://lib.openmpt.org/)" << std::endl; + about << " Copyright (c) 2013-2023 OpenMPT Project Developers and Contributors (https://lib.openmpt.org/)" << std::endl; about << " OpenMPT version " << openmpt::string::get( "core_version" ) << std::endl; about << std::endl; about << openmpt::string::get( "contact" ) << std::endl; diff --git a/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt.hpp b/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt.hpp index 0bfda29a1..922807168 100644 --- a/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt.hpp +++ b/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt.hpp @@ -1132,7 +1132,7 @@ public: \param value The value that should be set. \throws openmpt::exception Throws an exception derived from openmpt::exception in case the value is not sensible (e.g. negative tempo factor) or under the circumstances outlined in openmpt::module::get_ctls. \sa openmpt::module::get_ctls - \deprecated Please use openmpt::module::ctl_set_bool(), openmpt::module::ctl_set_int(), openmpt::module::ctl_set_floatingpoint(), or openmpt::module::ctl_set_string(). + \deprecated Please use openmpt::module::ctl_set_boolean(), openmpt::module::ctl_set_integer(), openmpt::module::ctl_set_floatingpoint(), or openmpt::module::ctl_set_text(). */ LIBOPENMPT_ATTR_DEPRECATED void ctl_set( const std::string & ctl, const std::string & value ); //! Set ctl boolean value diff --git a/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.h b/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.h index 383df5913..726bb311c 100644 --- a/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.h +++ b/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.h @@ -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 6 +#define OPENMPT_API_VERSION_PATCH 8 /*! \brief libopenmpt pre-release tag */ #define OPENMPT_API_VERSION_PREREL "" /*! \brief libopenmpt pre-release flag */ diff --git a/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.mk b/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.mk index ab021b538..870f86c09 100644 --- a/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.mk +++ b/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.mk @@ -1,8 +1,8 @@ LIBOPENMPT_VERSION_MAJOR=0 LIBOPENMPT_VERSION_MINOR=6 -LIBOPENMPT_VERSION_PATCH=6 +LIBOPENMPT_VERSION_PATCH=8 LIBOPENMPT_VERSION_PREREL= LIBOPENMPT_LTVER_CURRENT=3 -LIBOPENMPT_LTVER_REVISION=6 +LIBOPENMPT_LTVER_REVISION=8 LIBOPENMPT_LTVER_AGE=3 diff --git a/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.rc b/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.rc index cf3d3b6e4..ddd7a5239 100644 --- a/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.rc +++ b/Frameworks/OpenMPT/OpenMPT/libopenmpt/libopenmpt_version.rc @@ -192,7 +192,7 @@ BEGIN VALUE "FileDescription", VER_FILEDESC_STR VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", VER_FILENAME_STR - VALUE "LegalCopyright", "Copyright © 2004-2022 OpenMPT Project Developers and Contributors, Copyright © 1997-2003 Olivier Lapicque" + VALUE "LegalCopyright", "Copyright © 2004-2023 OpenMPT Project Developers and Contributors, Copyright © 1997-2003 Olivier Lapicque" VALUE "OriginalFilename", VER_FILENAME_STR VALUE "ProductName", "libopenmpt" VALUE "ProductVersion", VER_FILEVERSION_STR diff --git a/Frameworks/OpenMPT/OpenMPT/libopenmpt/xmp-openmpt.cpp b/Frameworks/OpenMPT/OpenMPT/libopenmpt/xmp-openmpt.cpp index 4221fe447..c6d6fc293 100644 --- a/Frameworks/OpenMPT/OpenMPT/libopenmpt/xmp-openmpt.cpp +++ b/Frameworks/OpenMPT/OpenMPT/libopenmpt/xmp-openmpt.cpp @@ -519,7 +519,7 @@ static void clear_current_timeinfo() { static void WINAPI openmpt_About( HWND win ) { std::ostringstream about; about << SHORT_TITLE << " version " << openmpt::string::get( "library_version" ) << " " << "(built " << openmpt::string::get( "build" ) << ")" << std::endl; - about << " Copyright (c) 2013-2022 OpenMPT Project Developers and Contributors (https://lib.openmpt.org/)" << std::endl; + about << " Copyright (c) 2013-2023 OpenMPT Project Developers and Contributors (https://lib.openmpt.org/)" << std::endl; about << " OpenMPT version " << openmpt::string::get( "core_version" ) << std::endl; about << std::endl; about << openmpt::string::get( "contact" ) << std::endl; @@ -563,8 +563,8 @@ private: xmplay_streambuf & operator = ( const xmplay_streambuf & ); private: XMPFILE & file; - static const std::size_t put_back = 4096; - static const std::size_t buf_size = 65536; + static inline constexpr std::size_t put_back = 4096; + static inline constexpr std::size_t buf_size = 65536; std::vector buffer; }; // class xmplay_streambuf diff --git a/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123.cpp b/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123.cpp index 065225f61..7abae4798 100644 --- a/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123.cpp +++ b/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123.cpp @@ -8,7 +8,7 @@ */ static const char * const license = -"Copyright (c) 2004-2022, OpenMPT Project Developers and Contributors" "\n" +"Copyright (c) 2004-2023, OpenMPT Project Developers and Contributors" "\n" "Copyright (c) 1997-2003, Olivier Lapicque" "\n" "All rights reserved." "\n" "" "\n" @@ -464,7 +464,7 @@ static std::string seconds_to_string( double time ) { 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-2022 OpenMPT Project Developers and Contributors " << std::endl; + log << "Copyright (c) 2013-2023 OpenMPT Project Developers and Contributors " << std::endl; if ( !verbose ) { log << std::endl; return; @@ -541,7 +541,7 @@ static void show_info( std::ostream & log, bool verbose ) { static void show_man_version( textout & log ) { log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << std::endl; log << std::endl; - log << "Copyright (c) 2013-2022 OpenMPT Project Developers and Contributors " << std::endl; + log << "Copyright (c) 2013-2023 OpenMPT Project Developers and Contributors " << std::endl; } static void show_short_version( textout & log ) { @@ -587,6 +587,34 @@ static std::string get_device_string( const std::string & device ) { return device; } +static void show_help_keyboard( textout & log, bool man_version = false ) { + if ( !man_version ) { + show_info( log, false ); + } + log << "Keyboard hotkeys (use 'openmpt123 --ui'):" << std::endl; + log << std::endl; + log << " [q] quit" << std::endl; + log << " [ ] pause / unpause" << std::endl; + log << " [N] skip 10 files backward" << std::endl; + log << " [n] prev file" << std::endl; + log << " [m] next file" << std::endl; + log << " [M] skip 10 files forward" << std::endl; + log << " [h] seek 10 seconds backward" << std::endl; + log << " [j] seek 1 seconds backward" << std::endl; + log << " [k] seek 1 seconds forward" << std::endl; + log << " [l] seek 10 seconds forward" << std::endl; + log << " [u]|[i] +/- tempo" << std::endl; + log << " [o]|[p] +/- pitch" << std::endl; + log << " [3]|[4] +/- gain" << std::endl; + log << " [5]|[6] +/- stereo separation" << std::endl; + log << " [7]|[8] +/- filter taps" << std::endl; + log << " [9]|[0] +/- volume ramping" << std::endl; + log << std::endl; + if ( !man_version ) { + log.writeout(); + } +} + static void show_help( textout & log, bool with_info = true, bool longhelp = false, bool man_version = false, const std::string & message = std::string() ) { if ( with_info ) { show_info( log, false ); @@ -600,6 +628,7 @@ static void show_help( textout & log, bool with_info = true, bool longhelp = fal } if ( man_version ) { log << "Options:" << std::endl; + log << std::endl; } log << " -h, --help Show help" << std::endl; log << " --help-keyboard Show keyboard hotkeys in ui mode" << std::endl; @@ -685,6 +714,8 @@ static void show_help( textout & log, bool with_info = true, bool longhelp = fal log << extension; } log << std::endl; + } else { + show_help_keyboard( log, true ); } } @@ -697,30 +728,6 @@ static void show_help( textout & log, bool with_info = true, bool longhelp = fal log.writeout(); } -static void show_help_keyboard( textout & log ) { - show_info( log, false ); - log << "Keyboard hotkeys (use 'openmpt123 --ui'):" << std::endl; - log << std::endl; - log << " [q] quit" << std::endl; - log << " [ ] pause / unpause" << std::endl; - log << " [N] skip 10 files backward" << std::endl; - log << " [n] prev file" << std::endl; - log << " [m] next file" << std::endl; - log << " [M] skip 10 files forward" << std::endl; - log << " [h] seek 10 seconds backward" << std::endl; - log << " [j] seek 1 seconds backward" << std::endl; - log << " [k] seek 1 seconds forward" << std::endl; - log << " [l] seek 10 seconds forward" << std::endl; - log << " [u]|[i] +/- tempo" << std::endl; - log << " [o]|[p] +/- pitch" << std::endl; - log << " [3]|[4] +/- gain" << std::endl; - log << " [5]|[6] +/- stereo separation" << std::endl; - log << " [7]|[8] +/- filter taps" << std::endl; - log << " [9]|[0] +/- volume ramping" << std::endl; - log << std::endl; - log.writeout(); -} - template < typename Tmod > static void apply_mod_settings( commandlineflags & flags, Tmod & mod ) { diff --git a/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123.hpp b/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123.hpp index 878359aa3..3e80ca1ec 100644 --- a/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123.hpp +++ b/Frameworks/OpenMPT/OpenMPT/openmpt123/openmpt123.hpp @@ -120,7 +120,7 @@ private: s << text; #else s << mpt::transcode( mpt::logical_encoding::locale, mpt::common_encoding::utf8, text ); - #endif + #endif s.flush(); } } @@ -167,12 +167,13 @@ private: std::string text = pop(); if ( text.length() > 0 ) { if ( console ) { + DWORD chars_written = 0; #if defined(UNICODE) std::wstring wtext = mpt::transcode( mpt::common_encoding::utf8, text ); - WriteConsole( handle, wtext.data(), static_cast( wtext.size() ), NULL, NULL ); + WriteConsole( handle, wtext.data(), static_cast( wtext.size() ), &chars_written, NULL ); #else std::string ltext = mpt::transcode( mpt::logical_encoding::locale, mpt::common_encoding::utf8, text ); - WriteConsole( handle, ltext.data(), static_cast( ltext.size() ), NULL, NULL ); + WriteConsole( handle, ltext.data(), static_cast( ltext.size() ), &chars_written, NULL ); #endif } else { #if defined(UNICODE) diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/ContainerXPK.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/ContainerXPK.cpp index 87b894089..0b9fcfae0 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/ContainerXPK.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/ContainerXPK.cpp @@ -98,6 +98,8 @@ static uint8 XPK_ReadTable(int32 index) }; if(index < 0) throw XPK_error(); if(static_cast(index) >= std::size(xpk_table)) throw XPK_error(); + // cppcheck false-positive + // cppcheck-suppress arrayIndexOutOfBoundsCond return xpk_table[index]; } diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.cpp index e5d7e52da..680784e5a 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.cpp @@ -2010,9 +2010,9 @@ bool CDLSBank::ExtractInstrument(CSoundFile &sndFile, INSTRUMENTINDEX nInstr, ui } else { SmpLength len = std::min(dwLen / 2u, sampleCopy.nLength); - const int16 *src = reinterpret_cast(pWaveForm.data()); + const std::byte *src = mpt::byte_cast(pWaveForm.data()); int16 *dst = sampleCopy.sample16() + offsetNew; - CopySample, SC::DecodeIdentity>>(dst, len, 2, src, pWaveForm.size(), 1); + CopySample, SC::DecodeInt16<0, littleEndian16>>>(dst, len, 2, src, pWaveForm.size(), 1); } sample.FreeSample(); sample = sampleCopy; diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.h b/Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.h index d9c3fde27..d1189d165 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.h +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Dlsbank.h @@ -129,7 +129,7 @@ public: uint32 GetNumInstruments() const { return static_cast(m_Instruments.size()); } uint32 GetNumSamples() const { return static_cast(m_WaveForms.size()); } const DLSINSTRUMENT *GetInstrument(uint32 iIns) const { return iIns < m_Instruments.size() ? &m_Instruments[iIns] : nullptr; } - const DLSINSTRUMENT *FindInstrument(bool isDrum, uint32 bank = 0xFF, uint32 program = 0xFF, uint32 key = 0xFF, uint32 *pInsNo = nullptr) const; + [[nodiscard]] const DLSINSTRUMENT *FindInstrument(bool isDrum, uint32 bank = 0xFF, uint32 program = 0xFF, uint32 key = 0xFF, uint32 *pInsNo = nullptr) const; bool FindAndExtract(CSoundFile &sndFile, const INSTRUMENTINDEX ins, const bool isDrum) const; uint32 GetRegionFromKey(uint32 nIns, uint32 nKey) const; bool ExtractWaveForm(uint32 nIns, uint32 nRgn, std::vector &waveData, uint32 &length) const; diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Fastmix.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Fastmix.cpp index 8ae5a0640..8ce8a1b8a 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Fastmix.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Fastmix.cpp @@ -288,7 +288,7 @@ struct MixLoopState #ifdef MPT_BUILD_DEBUG { SmpLength posDest = (nPos + nInc * (nSmpCount - 1)).GetUInt(); - if (posDest < 0 || posDest > chn.nLength) + MPT_MAYBE_CONSTANT_IF(posDest < 0 || posDest > chn.nLength) { // We computed an invalid delta! MPT_ASSERT_NOTREACHED(); @@ -487,6 +487,17 @@ void CSoundFile::CreateStereoMix(int count) { // ProTracker compatibility: Instrument changes without a note do not happen instantly, but rather when the sample loop has finished playing. // Test case: PTInstrSwap.mod, PTSwapNoLoop.mod +#ifdef MODPLUG_TRACKER + if(m_SamplePlayLengths != nullptr) + { + // Even if the sample was playing at zero volume, we need to retain its full length for correct sample swap timing + size_t smp = std::distance(static_cast(static_cast::type>(Samples)), chn.pModSample); + if(smp < m_SamplePlayLengths->size()) + { + (*m_SamplePlayLengths)[smp] = std::max((*m_SamplePlayLengths)[smp], std::min(chn.nLength, chn.position.GetUInt())); + } + } +#endif const ModSample &smp = Samples[chn.nNewIns]; chn.pModSample = &smp; chn.pCurrentSample = smp.samplev(); diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/ITCompression.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/ITCompression.cpp index 1d45f0ada..d83731b90 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/ITCompression.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/ITCompression.cpp @@ -187,6 +187,8 @@ void ITCompression::CompressBlock(const typename Properties::sample_t *data, Smp int8 ITCompression::GetWidthChangeSize(int8 w, bool is16) { MPT_ASSERT(w > 0 && static_cast(w) <= std::size(ITWidthChangeSize)); + // cppcheck false-positive + // cppcheck-suppress negativeIndex int8 wcs = ITWidthChangeSize[w - 1]; if(w <= 6 && is16) wcs++; diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_ams.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_ams.cpp index f000cdf18..fef51dc4f 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_ams.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_ams.cpp @@ -1034,27 +1034,27 @@ bool CSoundFile::ReadAMS2(FileReader &file, ModLoadingFlags loadFlags) ///////////////////////////////////////////////////////////////////// // AMS Sample unpacking -void AMSUnpack(const int8 * const source, size_t sourceSize, void * const dest, const size_t destSize, char packCharacter) +void AMSUnpack(mpt::const_byte_span source, mpt::byte_span dest, int8 packCharacter) { - std::vector tempBuf(destSize, 0); - size_t depackSize = destSize; + std::vector tempBuf(dest.size(), 0); + std::size_t depackSize = dest.size(); // Unpack Loop { - const int8 *in = source; + const std::byte *in = source.data(); int8 *out = tempBuf.data(); - size_t i = sourceSize, j = destSize; + size_t i = source.size(), j = dest.size(); while(i != 0 && j != 0) { - int8 ch = *(in++); + int8 ch = mpt::byte_cast(*(in++)); if(--i != 0 && ch == packCharacter) { - uint8 repCount = *(in++); + uint8 repCount = mpt::byte_cast(*(in++)); repCount = static_cast(std::min(static_cast(repCount), j)); if(--i != 0 && repCount) { - ch = *(in++); + ch = mpt::byte_cast(*(in++)); i--; while(repCount-- != 0) { @@ -1081,7 +1081,7 @@ void AMSUnpack(const int8 * const source, size_t sourceSize, void * const dest, int8 *out = tempBuf.data(); uint16 bitcount = 0x80; size_t k = 0; - uint8 *dst = static_cast(dest); + uint8 *dst = mpt::byte_cast(dest.data()); for(size_t i = 0; i < depackSize; i++) { uint8 al = *out++; @@ -1092,7 +1092,7 @@ void AMSUnpack(const int8 * const source, size_t sourceSize, void * const dest, bl = ((bl | (bl << 8)) >> ((dh + 8 - count) & 7)) & 0xFF; bitcount = ((bitcount | (bitcount << 8)) >> 1) & 0xFF; dst[k++] |= bl; - if(k >= destSize) + if(k >= dest.size()) { k = 0; dh++; @@ -1105,16 +1105,16 @@ void AMSUnpack(const int8 * const source, size_t sourceSize, void * const dest, // Delta Unpack { int8 old = 0; - int8 *out = static_cast(dest); + uint8 *out = mpt::byte_cast(dest.data()); for(size_t i = depackSize; i != 0; i--) { - int pos = *reinterpret_cast(out); + int pos = static_cast(*out); if(pos != 128 && (pos & 0x80) != 0) { pos = -(pos & 0x7F); } old -= static_cast(pos); - *(out++) = old; + *(out++) = static_cast(old); } } } diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_dsym.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_dsym.cpp index d883def96..5223df7df 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_dsym.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_dsym.cpp @@ -258,14 +258,16 @@ bool CSoundFile::ReadDSym(FileReader &file, ModLoadingFlags loadFlags) const auto allowedCommands = file.ReadArray(); - std::vector sequenceData; + std::vector sequence; if(fileHeader.numOrders) { + std::vector sequenceData; const uint32 sequenceSize = fileHeader.numOrders * fileHeader.numChannels * 2u; if(!ReadDSymChunk(file, sequenceData, sequenceSize)) return false; + FileReader sequenceChunk = FileReader(mpt::as_span(sequenceData)); + sequenceChunk.ReadVector(sequence, sequenceData.size() / 2u); } - const auto sequence = mpt::as_span(reinterpret_cast(sequenceData.data()), sequenceData.size() / 2u); std::vector trackData; trackData.reserve(fileHeader.numTracks * 256u); diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_mo3.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_mo3.cpp index 574adb0db..3b6c7407e 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_mo3.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_mo3.cpp @@ -1317,15 +1317,15 @@ bool CSoundFile::ReadMO3(FileReader &file, ModLoadingFlags loadFlags) musicChunk.ReadNullString(name); m_szNames[smp] = name; if(version >= 5) - { musicChunk.ReadNullString(name); - sample.filename = name; - } + else + name.clear(); MO3Sample smpHeader; if(!musicChunk.ReadStruct(smpHeader)) break; smpHeader.ConvertToMPT(sample, m_nType, frequencyIsHertz); + sample.filename = name; int16 sharedOggHeader = 0; if(version >= 5 && (smpHeader.flags & MO3Sample::smpCompressionMask) == MO3Sample::smpSharedOgg) diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_mod.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_mod.cpp index 6c36408af..39e6af966 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_mod.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_mod.cpp @@ -1535,7 +1535,8 @@ bool CSoundFile::ReadM15(FileReader &file, ModLoadingFlags loadFlags) } // Let's see if the file is too small (including some overhead for broken files like sll7.mod or ghostbus.mod) - if(file.BytesLeft() + 65536 < numPatterns * 64u * 4u * 4u + totalSampleLen) + std::size_t requiredRemainingDataSize = numPatterns * 64u * 4u * 4u + totalSampleLen; + if(!file.CanRead(requiredRemainingDataSize - std::min(requiredRemainingDataSize, 65536u))) return false; if(loadFlags == onlyVerifyHeader) diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_s3m.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_s3m.cpp index dea5ecb37..7186bad83 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Load_s3m.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Load_s3m.cpp @@ -325,12 +325,16 @@ bool CSoundFile::ReadS3M(FileReader &file, ModLoadingFlags loadFlags) nonCompatTracker = true; break; case S3MFileHeader::trkOpenMPT: + if(fileHeader.cwtv != S3MFileHeader::trkGraoumfTracker) { uint32 mptVersion = (fileHeader.cwtv & S3MFileHeader::versionMask) << 16; if(mptVersion >= 0x01'29'00'00) mptVersion |= fileHeader.reserved2; m_dwLastSavedWithVersion = Version(mptVersion); madeWithTracker = U_("OpenMPT ") + mpt::ufmt::val(m_dwLastSavedWithVersion); + } else + { + madeWithTracker = U_("Graoumf Tracker"); } break; case S3MFileHeader::trkBeRoTracker: diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/ModSample.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/ModSample.cpp index 9e9597cac..4630d0f9b 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/ModSample.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/ModSample.cpp @@ -31,12 +31,12 @@ void ModSample::Convert(MODTYPE fromType, MODTYPE toType) nFineTune = 0; // TransposeToFrequency assumes NTSC middle-C frequency like FT2, but we play MODs with PAL middle-C! if(fromType == MOD_TYPE_MOD) - nC5Speed = Util::muldivr_unsigned(nC5Speed, 8272, 8363); + nC5Speed = Util::muldivr_unsigned(nC5Speed, 8287, 8363); } else if((toType & (MOD_TYPE_MOD | MOD_TYPE_XM)) && (!(fromType & (MOD_TYPE_MOD | MOD_TYPE_XM)))) { // FrequencyToTranspose assumes NTSC middle-C frequency like FT2, but we play MODs with PAL middle-C! if(toType == MOD_TYPE_MOD) - nC5Speed = Util::muldivr_unsigned(nC5Speed, 8363, 8272); + nC5Speed = Util::muldivr_unsigned(nC5Speed, 8363, 8287); FrequencyToTranspose(); } @@ -162,7 +162,7 @@ uint32 ModSample::GetSampleRate(const MODTYPE type) const rate = nC5Speed; // TransposeToFrequency assumes NTSC middle-C frequency like FT2, but we play MODs with PAL middle-C! if(type == MOD_TYPE_MOD) - rate = Util::muldivr_unsigned(rate, 8272, 8363); + rate = Util::muldivr_unsigned(rate, 8287, 8363); return (rate > 0) ? rate : 8363; } diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/S3MTools.h b/Frameworks/OpenMPT/OpenMPT/soundlib/S3MTools.h index 9517dfbe4..2e89e075c 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/S3MTools.h +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/S3MTools.h @@ -50,6 +50,7 @@ struct S3MFileHeader trkIT2_07 = 0x3207, trkIT2_14 = 0x3214, trkBeRoTrackerOld = 0x4100, // Used from 2004 to 2012 + trkGraoumfTracker = 0x5447, trkCamoto = 0xCA00, }; diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/SampleFormats.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/SampleFormats.cpp index bf19d849e..df5d14785 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/SampleFormats.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/SampleFormats.cpp @@ -1140,6 +1140,18 @@ bool CSoundFile::ReadS3ISample(SAMPLEINDEX nSample, FileReader &file) return false; } + if(sampleHeader.sampleType >= S3MSampleHeader::typeAdMel) + { + if(SupportsOPL()) + { + InitOPL(); + } else + { + AddToLog(LogInformation, U_("OPL instruments are not supported by this format.")); + return true; + } + } + DestroySampleThreadsafe(nSample); ModSample &sample = Samples[nSample]; @@ -1148,10 +1160,6 @@ bool CSoundFile::ReadS3ISample(SAMPLEINDEX nSample, FileReader &file) if(sampleHeader.sampleType < S3MSampleHeader::typeAdMel) sampleHeader.GetSampleFormat(false).ReadSample(sample, file); - else if(SupportsOPL()) - InitOPL(); - else - AddToLog(LogInformation, U_("OPL instruments are not supported by this format.")); sample.Convert(MOD_TYPE_S3M, GetType()); sample.PrecomputeLoops(*this, false); diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/SampleIO.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/SampleIO.cpp index 60e1403bc..5423d159c 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/SampleIO.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/SampleIO.cpp @@ -179,7 +179,7 @@ size_t SampleIO::ReadSample(ModSample &sample, FileReader &file) const LimitMax(sourceSize, mpt::saturate_cast(packedDataView.size())); bytesRead += sourceSize; - AMSUnpack(reinterpret_cast(packedDataView.data()), packedDataView.size(), sample.samplev(), sample.GetSampleSizeInBytes(), packCharacter); + AMSUnpack(packedDataView.span(), mpt::as_span(sample.sampleb(), sample.GetSampleSizeInBytes()), packCharacter); if(sample.uFlags[CHN_16BIT] && !mpt::endian_is_little()) { auto p = sample.sample16(); diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_defs.h b/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_defs.h index 7cc00f305..784125baf 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_defs.h +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_defs.h @@ -544,6 +544,9 @@ enum PlayBehaviour kApplyOffsetWithoutNote, // Offset commands even work when there's no note next to them (e.g. DMF, MDL, PLM formats) kITPitchPanSeparation, // Pitch/Pan Separation can be overridden by panning commands (this also fixes a bug where any "special" notes affect PPS) kImprecisePingPongLoops, // Use old (less precise) ping-pong overshoot calculation + kPluginIgnoreTonePortamento, // Use old tone portamento behaviour for plugins (XM: no plugin pitch slides with commands E1x/E2x/X1x/X2x) + kST3TonePortaWithAdlibNote, // Adlib note next to tone portamento is delayed until next row + kITResetFilterOnPortaSmpChange, // Filter is reset on portamento if sample is swapped // Add new play behaviours here. diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_flt.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_flt.cpp index e5ea5b6e1..c3799a3c2 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_flt.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_flt.cpp @@ -59,6 +59,37 @@ uint32 CSoundFile::CutOffToFrequency(uint32 nCutOff, int envModifier) const } +// Update channels with instrument filter settings updated through tracker UI +void CSoundFile::UpdateInstrumentFilter(const ModInstrument *ins, bool updateMode, bool updateCutoff, bool updateResonance) +{ + for(auto &chn : m_PlayState.Chn) + { + if(chn.pModInstrument != ins) + continue; + + bool change = false; + if(updateMode && ins->filterMode != FilterMode::Unchanged && chn.nFilterMode != ins->filterMode) + { + chn.nFilterMode = ins->filterMode; + change = true; + } + if(updateCutoff) + { + chn.nCutOff = ins->IsCutoffEnabled() ? ins->GetCutoff() : 0x7F; + change |= (chn.nCutOff < 0x7F || chn.dwFlags[CHN_FILTER]); + } + if(updateResonance) + { + chn.nResonance = ins->IsResonanceEnabled() ? ins->GetResonance() : 0; + change |= (chn.nResonance > 0 || chn.dwFlags[CHN_FILTER]); + } + // If filter envelope is active, the filter will be updated in the next player tick anyway. + if(change && (!ins->PitchEnv.dwFlags[ENV_FILTER] || !IsEnvelopeProcessed(chn, ENV_PITCH))) + SetupChannelFilter(chn, false); + } +} + + // Simple 2-poles resonant filter. Returns computed cutoff in range [0, 254] or -1 if filter is not applied. int CSoundFile::SetupChannelFilter(ModChannel &chn, bool bReset, int envModifier) const { @@ -82,10 +113,10 @@ int CSoundFile::SetupChannelFilter(ModChannel &chn, bool bReset, int envModifier // 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.triggerNote) + if(chn.triggerNote) { // 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-reset-envelope.it, filter-nna.it, FilterResetPatDelay.it + // Test cases: filter-reset.it, filter-reset-carry.it, filter-reset-envelope.it, filter-nna.it, FilterResetPatDelay.it, FilterPortaSmpChange.it, FilterPortaSmpChange-InsMode.it chn.dwFlags.reset(CHN_FILTER); } return -1; diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_fx.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_fx.cpp index 0b311f654..5c4311f0b 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_fx.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Snd_fx.cpp @@ -612,8 +612,17 @@ std::vector CSoundFile::GetLength(enmGetLengthResetMode adjustMod if (tempo.GetInt()) chn.nOldTempo = static_cast(tempo.GetInt()); else tempo.Set(chn.nOldTempo); } - if (tempo.GetInt() >= 0x20) playState.m_nMusicTempo = tempo; - else + const auto &specs = GetModSpecifications(); + if(tempo.GetInt() >= 0x20) + { +#if MPT_MSVC_BEFORE(2019, 0) + // Work-around for VS2017 /std:c++17 /permissive- + // which fails to find operator < for templated user types inside std::min. + playState.m_nMusicTempo.SetRaw(std::min(tempo.GetRaw(), specs.GetTempoMax().GetRaw())); +#else + playState.m_nMusicTempo = std::min(tempo, specs.GetTempoMax()); +#endif + } else { // Tempo Slide TEMPO tempoDiff((tempo.GetInt() & 0x0F) * nonRowTicks, 0); @@ -627,14 +636,14 @@ std::vector CSoundFile::GetLength(enmGetLengthResetMode adjustMod else playState.m_nMusicTempo.Set(0); } - } - TEMPO tempoMin = GetModSpecifications().GetTempoMin(), tempoMax = GetModSpecifications().GetTempoMax(); - if(m_playBehaviour[kTempoClamp]) // clamp tempo correctly in compatible mode - { - tempoMax.Set(255); + TEMPO tempoMin = specs.GetTempoMin(), tempoMax = specs.GetTempoMax(); + if(m_playBehaviour[kTempoClamp]) // clamp tempo correctly in compatible mode + { + tempoMax.Set(255); + } + Limit(playState.m_nMusicTempo, tempoMin, tempoMax); } - Limit(playState.m_nMusicTempo, tempoMin, tempoMax); } break; @@ -651,7 +660,7 @@ std::vector CSoundFile::GetLength(enmGetLengthResetMode adjustMod break; case 0xB0: // Pattern Loop - PatternLoop(playState, chn, param & 0x0F); + PatternLoop(playState, nChn, param & 0x0F); break; case 0xF0: // Active macro @@ -664,7 +673,7 @@ std::vector CSoundFile::GetLength(enmGetLengthResetMode adjustMod switch(param & 0xF0) { case 0x60: // Pattern Loop - PatternLoop(playState, chn, param & 0x0F); + PatternLoop(playState, nChn, param & 0x0F); break; case 0xF0: // Active macro @@ -1107,7 +1116,7 @@ std::vector CSoundFile::GetLength(enmGetLengthResetMode adjustMod case CMD_FINETUNE: case CMD_FINETUNE_SMOOTH: memory.RenderChannel(nChn, oldTickDuration); // Re-sync what we've got so far - SetFinetune(nChn, playState, false); // TODO should render each tick individually for CMD_FINETUNE_SMOOTH for higher sync accuracy + chn.microTuning = CalculateFinetuneTarget(playState.m_nPattern, playState.m_nRow, nChn); // TODO should render each tick individually for CMD_FINETUNE_SMOOTH for higher sync accuracy break; } chn.isFirstTick = true; @@ -1349,6 +1358,10 @@ void CSoundFile::InstrumentChange(ModChannel &chn, uint32 instr, bool bPorta, bo // but still uses the sample info from the old one (bug?) returnAfterVolumeAdjust = true; } + // IT compatbility: Reset filter if portamento results in sample change + // Test case: FilterPortaSmpChange.it, FilterPortaSmpChange-InsMode.it + if(m_playBehaviour[kITResetFilterOnPortaSmpChange] && !m_nInstruments) + chn.triggerNote = true; } // IT compatibility: A lone instrument number should only reset sample properties to those of the corresponding sample in instrument mode. // C#5 01 ... <-- sample 1 @@ -1951,6 +1964,7 @@ void CSoundFile::NoteChange(ModChannel &chn, int note, bool bPorta, bool bResetE // Enable Ramping if(!bPorta) { + chn.triggerNote = true; chn.nLeftVU = chn.nRightVU = 0xFF; chn.dwFlags.reset(CHN_FILTER); chn.dwFlags.set(CHN_FASTVOLRAMP); @@ -1972,35 +1986,6 @@ void CSoundFile::NoteChange(ModChannel &chn, int note, bool bPorta, bool bResetE chn.nAutoVibPos = 0; } chn.rightVol = chn.leftVol = 0; - bool useFilter = !m_SongFlags[SONG_MPTFILTERMODE]; - // Setup Initial Filter for this note - 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) - { - int cutoff = SetupChannelFilter(chn, true); - if(cutoff >= 0 && chn.dwFlags[CHN_ADLIB] && m_opl && channelHint != CHANNELINDEX_INVALID) - m_opl->Volume(channelHint, chn.nCutOff / 2u, true); - } if(chn.dwFlags[CHN_ADLIB] && m_opl && channelHint != CHANNELINDEX_INVALID) { @@ -2565,7 +2550,7 @@ bool CSoundFile::ProcessEffects() { chn.isFirstTick = tickCount == nStartTick; } - chn.triggerNote = triggerNote; + chn.triggerNote = false; // FT2 compatibility: Note + portamento + note delay = no portamento // Test case: PortaDelay.xm @@ -3359,13 +3344,7 @@ bool CSoundFile::ProcessEffects() case CMD_FINETUNE: case CMD_FINETUNE_SMOOTH: if(m_SongFlags[SONG_FIRSTTICK] || cmd == CMD_FINETUNE_SMOOTH) - { - SetFinetune(nChn, m_PlayState, cmd == CMD_FINETUNE_SMOOTH); -#ifndef NO_PLUGINS - if(IMixPlugin *plugin = GetChannelInstrumentPlugin(m_PlayState.Chn[nChn]); plugin != nullptr) - plugin->MidiPitchBendRaw(chn.GetMIDIPitchBend(), nChn); -#endif // NO_PLUGINS - } + SetFinetune(m_PlayState.m_nPattern, m_PlayState.m_nRow, nChn, m_PlayState, cmd == CMD_FINETUNE_SMOOTH); break; // Set Channel Global Volume @@ -3943,10 +3922,24 @@ void CSoundFile::ExtraFinePortamentoDown(ModChannel &chn, ModCommand::PARAM para } -void CSoundFile::SetFinetune(CHANNELINDEX channel, PlayState &playState, bool isSmooth) const +// Process finetune command from pattern editor +void CSoundFile::ProcessFinetune(PATTERNINDEX pattern, ROWINDEX row, CHANNELINDEX channel, bool isSmooth) +{ + SetFinetune(pattern, row, channel, m_PlayState, isSmooth); + // Also apply to notes played via CModDoc::PlayNote + for(CHANNELINDEX chn = GetNumChannels(); chn < MAX_CHANNELS; chn++) + { + auto &modChn = m_PlayState.Chn[chn]; + if(modChn.nMasterChn == channel + 1 && modChn.isPreviewNote && !modChn.dwFlags[CHN_KEYOFF]) + modChn.microTuning = m_PlayState.Chn[channel].microTuning; + } +} + + +void CSoundFile::SetFinetune(PATTERNINDEX pattern, ROWINDEX row, CHANNELINDEX channel, PlayState &playState, bool isSmooth) const { ModChannel &chn = playState.Chn[channel]; - int16 newTuning = mpt::saturate_cast(static_cast(CalculateXParam(playState.m_nPattern, playState.m_nRow, channel, nullptr)) - 0x8000); + int16 newTuning = CalculateFinetuneTarget(pattern, row, channel); if(isSmooth) { @@ -3958,6 +3951,17 @@ void CSoundFile::SetFinetune(CHANNELINDEX channel, PlayState &playState, bool is } } chn.microTuning = newTuning; + +#ifndef NO_PLUGINS + if(IMixPlugin *plugin = GetChannelInstrumentPlugin(chn); plugin != nullptr) + plugin->MidiPitchBendRaw(chn.GetMIDIPitchBend(), channel); +#endif // NO_PLUGINS +} + + +int16 CSoundFile::CalculateFinetuneTarget(PATTERNINDEX pattern, ROWINDEX row, CHANNELINDEX channel) const +{ + return mpt::saturate_cast(static_cast(CalculateXParam(pattern, row, channel, nullptr)) - 0x8000); } @@ -4494,7 +4498,7 @@ void CSoundFile::ExtendedMODCommands(CHANNELINDEX nChn, ModCommand::PARAM param) // E6x: Pattern Loop case 0x60: if(m_SongFlags[SONG_FIRSTTICK]) - PatternLoop(m_PlayState, chn, param & 0x0F); + PatternLoop(m_PlayState, nChn, param & 0x0F); break; // E7x: Set Tremolo WaveForm case 0x70: chn.nTremoloType = param & 0x07; break; @@ -4679,7 +4683,7 @@ void CSoundFile::ExtendedS3MCommands(CHANNELINDEX nChn, ModCommand::PARAM param) // SBx: Pattern Loop case 0xB0: if(m_SongFlags[SONG_FIRSTTICK]) - PatternLoop(m_PlayState, chn, param & 0x0F); + PatternLoop(m_PlayState, nChn, param & 0x0F); break; // SCx: Note Cut case 0xC0: @@ -5831,11 +5835,14 @@ void CSoundFile::SetTempo(TEMPO param, bool setFromUI) } -void CSoundFile::PatternLoop(PlayState &state, ModChannel &chn, ModCommand::PARAM param) const +void CSoundFile::PatternLoop(PlayState &state, CHANNELINDEX nChn, ModCommand::PARAM param) const { - if(m_playBehaviour[kST3NoMutedChannels] && chn.dwFlags[CHN_MUTE | CHN_SYNCMUTE]) + if(m_playBehaviour[kST3NoMutedChannels] && state.Chn[nChn].dwFlags[CHN_MUTE | CHN_SYNCMUTE]) return; // not even effects are processed on muted S3M channels + // ST3 doesn't have per-channel pattern loop memory. + ModChannel &chn = state.Chn[(GetType() == MOD_TYPE_S3M) ? 0 : nChn]; + if(!param) { // Loop Start @@ -5890,17 +5897,6 @@ void CSoundFile::PatternLoop(PlayState &state, ModChannel &chn, ModCommand::PARA if(m_playBehaviour[kITPatternLoopWithJumps]) state.m_posJump = ORDERINDEX_INVALID; } - - if(GetType() == MOD_TYPE_S3M) - { - // ST3 doesn't have per-channel pattern loop memory, so spam all changes to other channels as well. - for(CHANNELINDEX i = 0; i < GetNumChannels(); i++) - { - state.Chn[i].nPatternLoop = chn.nPatternLoop; - state.Chn[i].nPatternLoopCount = chn.nPatternLoopCount; - } - } - } diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.cpp index e3c87cd71..366237e82 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.cpp @@ -1074,6 +1074,7 @@ PlayBehaviourSet CSoundFile::GetSupportedPlaybackBehaviour(MODTYPE type) playBehaviour.set(kITDoNotOverrideChannelPan); playBehaviour.set(kITDCTBehaviour); playBehaviour.set(kITPitchPanSeparation); + playBehaviour.set(kITResetFilterOnPortaSmpChange); if(type == MOD_TYPE_MPT) { playBehaviour.set(kOPLFlexibleNoteOff); diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.h b/Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.h index f40acc425..aeb2f9933 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.h +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Sndfile.h @@ -77,7 +77,7 @@ bool ReadInstrumentHeaderField(ModInstrument * input, uint32 fcode, uint16 fsize // Sample decompression routines in format-specific source files -void AMSUnpack(const int8 * const source, size_t sourceSize, void * const dest, const size_t destSize, char packCharacter); +void AMSUnpack(mpt::const_byte_span source, mpt::byte_span dest, int8 packCharacter); uintptr_t DMFUnpack(FileReader &file, uint8 *psample, uint32 maxlen); @@ -998,6 +998,7 @@ public: bool IsRenderingToDisc() const { return m_bIsRendering; } void PrecomputeSampleLoops(bool updateChannels = false); + void UpdateInstrumentFilter(const ModInstrument *ins, bool updateMode, bool updateCutoff, bool updateResonance); public: // Mixer Config @@ -1031,6 +1032,8 @@ public: void ProcessRamping(ModChannel &chn) const; + void ProcessFinetune(PATTERNINDEX pattern, ROWINDEX row, CHANNELINDEX channel, bool isSmooth); + protected: // Global variable initializer for loader functions void SetType(MODTYPE type); @@ -1084,7 +1087,8 @@ protected: void PortamentoMPT(ModChannel &chn, int); void PortamentoFineMPT(ModChannel &chn, int); void PortamentoExtraFineMPT(ModChannel &chn, int); - void SetFinetune(CHANNELINDEX channel, PlayState &playState, bool isSmooth) const; + void SetFinetune(PATTERNINDEX pattern, ROWINDEX row, CHANNELINDEX channel, PlayState &playState, bool isSmooth) const; + int16 CalculateFinetuneTarget(PATTERNINDEX pattern, ROWINDEX row, CHANNELINDEX channel) const; void NoteSlide(ModChannel &chn, uint32 param, bool slideUp, bool retrig) const; std::pair GetVolCmdTonePorta(const ModCommand &m, uint32 startTick) const; void TonePortamento(ModChannel &chn, uint16 param) const; @@ -1105,7 +1109,7 @@ protected: void DigiBoosterSampleReverse(ModChannel &chn, ModCommand::PARAM param) const; void HandleDigiSamplePlayDirection(PlayState &state, CHANNELINDEX chn) const; void NoteCut(CHANNELINDEX nChn, uint32 nTick, bool cutSample); - void PatternLoop(PlayState &state, ModChannel &chn, ModCommand::PARAM param) const; + void PatternLoop(PlayState &state, CHANNELINDEX nChn, ModCommand::PARAM param) const; bool HandleNextRow(PlayState &state, const ModSequence &order, bool honorPatternLoop) const; void ExtendedMODCommands(CHANNELINDEX nChn, ModCommand::PARAM param); void ExtendedS3MCommands(CHANNELINDEX nChn, ModCommand::PARAM param); diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/Sndmix.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/Sndmix.cpp index f66586e42..85cc0b22d 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/Sndmix.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/Sndmix.cpp @@ -2250,20 +2250,55 @@ bool CSoundFile::ReadNote() chn.nRealPan = 128; } + // 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; + } + } + // Now that all relevant envelopes etc. have been processed, we can parse the MIDI macro data. ProcessMacroOnChannel(nChn); // After MIDI macros have been processed, we can also process the pitch / filter envelope and other pitch-related things. if(samplePlaying) { - int cutoff = ProcessPitchFilterEnvelope(chn, period); - if(cutoff >= 0 && chn.dwFlags[CHN_ADLIB] && m_opl) - { - // Cutoff doubles as modulator intensity for FM instruments - m_opl->Volume(nChn, static_cast(cutoff / 4), true); - } + int envCutoff = ProcessPitchFilterEnvelope(chn, period); + if(envCutoff >= 0) + cutoff = envCutoff / 4; } + // Cutoff doubles as modulator intensity for FM instruments + if(cutoff >= 0 && chn.dwFlags[CHN_ADLIB] && m_opl) + m_opl->Volume(nChn, static_cast(cutoff), true); + if(chn.rowCommand.volcmd == VOLCMD_VIBRATODEPTH && (chn.rowCommand.command == CMD_VIBRATO || chn.rowCommand.command == CMD_VIBRATOVOL || chn.rowCommand.command == CMD_FINEVIBRATO)) { @@ -2509,6 +2544,7 @@ bool CSoundFile::ReadNote() } chn.dwOldFlags = chn.dwFlags; + chn.triggerNote = false; // For SONG_PAUSED mode } // If there are more channels being mixed than allowed, order them by volume and discard the most quiet ones diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/UpgradeModule.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/UpgradeModule.cpp index 4a548f95e..c17efe2cc 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/UpgradeModule.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/UpgradeModule.cpp @@ -577,6 +577,7 @@ void CSoundFile::UpgradeModule() { kITPatternLoopWithJumps, MPT_V("1.29.00.32") }, { kITDCTBehaviour, MPT_V("1.29.00.57") }, { kITPitchPanSeparation, MPT_V("1.30.00.53") }, + { kITResetFilterOnPortaSmpChange, MPT_V("1.30.08.02") }, }; for(const auto &b : behaviours) diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/modcommand.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/modcommand.cpp index 5f5f98b22..f0171784f 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/modcommand.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/modcommand.cpp @@ -79,7 +79,7 @@ void ModCommand::ExtendedMODtoS3MEffect() case 0x20: command = CMD_PORTAMENTODOWN; param |= 0xF0; break; case 0x30: param = (param & 0x0F) | 0x10; break; case 0x40: param = (param & 0x03) | 0x30; break; - case 0x50: param = (param & 0x0F) | 0x20; break; + case 0x50: param = (param ^ 0x58) | 0x20; break; case 0x60: param = (param & 0x0F) | 0xB0; break; case 0x70: param = (param & 0x03) | 0x40; break; case 0x90: command = CMD_RETRIG; param = (param & 0x0F); break; @@ -102,7 +102,7 @@ void ModCommand::ExtendedS3MtoMODEffect() switch(param & 0xF0) { case 0x10: param = (param & 0x0F) | 0x30; break; - case 0x20: param = (param & 0x0F) | 0x50; break; + case 0x20: param = (param ^ 0x28) | 0x50; break; case 0x30: param = (param & 0x0F) | 0x40; break; case 0x40: param = (param & 0x0F) | 0x70; break; case 0x50: command = CMD_XFINEPORTAUPDOWN; break; // map to unused X5x diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/plugins/SymMODEcho.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/plugins/SymMODEcho.cpp index 8c2c92801..4f94155f4 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/plugins/SymMODEcho.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/plugins/SymMODEcho.cpp @@ -38,7 +38,7 @@ void SymMODEcho::Process(float* pOutL, float* pOutR, uint32 numFrames) float *outL = m_mixBuffer.GetOutputBuffer(0), *outR = m_mixBuffer.GetOutputBuffer(1); const uint32 delayTime = m_SndFile.m_PlayState.m_nSamplesPerTick * m_chunk.param[kEchoDelay]; - // SymMODs don't have a variable tempo so the tick duration should never change... but if someone loads a module into an MPTM file we have to account for this. + // SymMODs don't have a variable tempo so the tick duration should never change... but if someone loads an instance into an MPTM file we have to account for this. if(m_delayLine.size() < delayTime * 2) m_delayLine.resize(delayTime * 2); diff --git a/Frameworks/OpenMPT/OpenMPT/soundlib/plugins/dmo/Distortion.cpp b/Frameworks/OpenMPT/OpenMPT/soundlib/plugins/dmo/Distortion.cpp index cce385081..26f405026 100644 --- a/Frameworks/OpenMPT/OpenMPT/soundlib/plugins/dmo/Distortion.cpp +++ b/Frameworks/OpenMPT/OpenMPT/soundlib/plugins/dmo/Distortion.cpp @@ -186,7 +186,7 @@ void Distortion::RecalculateDistortionParams() // Distortion float edge = 2.0f + m_param[kDistEdge] * 29.0f; m_edge = static_cast(edge); // 2...31 shifted bits - m_shift = mpt::bit_width(m_edge); + m_shift = static_cast(mpt::bit_width(m_edge)); static constexpr float LogNorm[32] = { diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/LICENSE.BSD-3-Clause.txt b/Frameworks/OpenMPT/OpenMPT/src/mpt/LICENSE.BSD-3-Clause.txt index 1adcc102b..0e7623eaa 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/LICENSE.BSD-3-Clause.txt +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/LICENSE.BSD-3-Clause.txt @@ -1,4 +1,4 @@ -Copyright (c) 2004-2022, OpenMPT Project Developers and Contributors +Copyright (c) 2004-2023, OpenMPT Project Developers and Contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/algorithm.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/algorithm.hpp index 8bb7a786b..5b1d2cff6 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/algorithm.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/algorithm.hpp @@ -6,8 +6,8 @@ #include "mpt/base/detect_compiler.hpp" +#include "mpt/base/macros.hpp" #include "mpt/base/namespace.hpp" - #include "mpt/base/saturate_cast.hpp" #include diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/alloc.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/alloc.hpp index 075dd035b..436ded8a9 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/alloc.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/alloc.hpp @@ -168,6 +168,12 @@ public: T & operator*() { return *m_value; } + const T * operator->() const { + return m_value.get(); + } + T * operator->() { + return m_value.get(); + } }; diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/bit.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/bit.hpp index 3bfa98ebd..fad90af4d 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/bit.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/bit.hpp @@ -263,10 +263,10 @@ constexpr T bit_floor(T x) noexcept { } template -constexpr T bit_width(T x) noexcept { +constexpr int bit_width(T x) noexcept { static_assert(std::numeric_limits::is_integer); static_assert(std::is_unsigned::value); - T result = 0; + int result = 0; while (x > 0) { x >>= 1; result += 1; @@ -371,7 +371,7 @@ constexpr T rotr(T x, int s) noexcept { template constexpr int lower_bound_entropy_bits(T x_) { typename std::make_unsigned::type x = static_cast::type>(x_); - return mpt::bit_width(x) == static_cast::type>(mpt::popcount(x)) ? mpt::bit_width(x) : mpt::bit_width(x) - 1; + return (static_cast(mpt::bit_width(x)) == static_cast::type>(mpt::popcount(x))) ? mpt::bit_width(x) : mpt::bit_width(x) - 1; } diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/detect_compiler.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/detect_compiler.hpp index 936286705..54e253da4 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/detect_compiler.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/detect_compiler.hpp @@ -50,7 +50,9 @@ #elif defined(_MSC_VER) #define MPT_COMPILER_MSVC 1 -#if (_MSC_VER >= 1933) +#if (_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) #elif (_MSC_VER >= 1932) #define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2022, 2) diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/tests/tests_base_bit.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/tests/tests_base_bit.hpp index 7aed082c8..3dcf232d9 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/base/tests/tests_base_bit.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/base/tests/tests_base_bit.hpp @@ -108,21 +108,21 @@ MPT_TEST_GROUP_INLINE("mpt/base/bit") MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xfffffffeu)), 0x80000000u); MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xffffffffu)), 0x80000000u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(0u), 0u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(1u), 1u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(2u), 2u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(3u), 2u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(4u), 3u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(5u), 3u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(6u), 3u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(7u), 3u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(8u), 4u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(9u), 4u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x7fffffffu)), 31u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000000u)), 32u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000001u)), 32u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xfffffffeu)), 32u); - MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xffffffffu)), 32u); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(0u), 0); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(1u), 1); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(2u), 2); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(3u), 2); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(4u), 3); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(5u), 3); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(6u), 3); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(7u), 3); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(8u), 4); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(9u), 4); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x7fffffffu)), 31); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000000u)), 32); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000001u)), 32); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xfffffffeu)), 32); + MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xffffffffu)), 32); MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0); MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000001)), 0); diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/binary/tests/tests_binary.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/binary/tests/tests_binary.hpp index daf9c9790..a19e1b1e9 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/binary/tests/tests_binary.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/binary/tests/tests_binary.hpp @@ -5,6 +5,7 @@ +#include "mpt/base/alloc.hpp" #include "mpt/base/detect_compiler.hpp" #include "mpt/base/memory.hpp" #include "mpt/base/namespace.hpp" diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/format/default_formatter.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/format/default_formatter.hpp index 27946a5a0..09308bc2c 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/format/default_formatter.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/format/default_formatter.hpp @@ -10,8 +10,6 @@ #include "mpt/format/default_integer.hpp" #include "mpt/format/default_string.hpp" -#include - namespace mpt { diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/format/tests/tests_format_simple.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/format/tests/tests_format_simple.hpp index 8956d0d6a..2902a220c 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/format/tests/tests_format_simple.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/format/tests/tests_format_simple.hpp @@ -14,6 +14,7 @@ #include "mpt/test/test_macros.hpp" #include +#include diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io/base.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io/base.hpp index 1ef286fdd..ade1b5060 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io/base.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io/base.hpp @@ -6,6 +6,7 @@ #include "mpt/base/integer.hpp" +#include "mpt/base/memory.hpp" #include "mpt/base/namespace.hpp" #include diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io/io_stdstream.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io/io_stdstream.hpp index 23f6602fe..e15582e03 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io/io_stdstream.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io/io_stdstream.hpp @@ -8,6 +8,7 @@ #include "mpt/base/macros.hpp" #include "mpt/base/memory.hpp" #include "mpt/base/namespace.hpp" +#include "mpt/base/saturate_cast.hpp" #include "mpt/base/utility.hpp" #include "mpt/io/base.hpp" diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io/tests/tests_io.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io/tests/tests_io.hpp index 38e2a6955..3a529c5c0 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io/tests/tests_io.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io/tests/tests_io.hpp @@ -5,6 +5,7 @@ +#include "mpt/base/alloc.hpp" #include "mpt/base/integer.hpp" #include "mpt/base/namespace.hpp" #include "mpt/base/utility.hpp" @@ -354,7 +355,7 @@ MPT_TEST_GROUP_INLINE("mpt/io") // Run-time in case some weird compiler gets confused by our templates // and only writes the first array element. std::ostringstream f; - uint16be data[2]; + mpt::uint16be data[2]; mpt::reset(data); data[0] = 0x1234; data[1] = 0x5678; @@ -363,7 +364,7 @@ MPT_TEST_GROUP_INLINE("mpt/io") } { std::ostringstream f; - std::vector data; + std::vector data; data.resize(3); data[0] = 0x1234; data[1] = 0x5678; @@ -373,7 +374,7 @@ MPT_TEST_GROUP_INLINE("mpt/io") } { std::ostringstream f; - int16be data[3]; + mpt::int16be data[3]; mpt::reset(data); data[0] = 0x1234; data[1] = 0x5678; diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filecursor.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filecursor.hpp index d2d6c62b4..5c0f862ed 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filecursor.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filecursor.hpp @@ -130,7 +130,7 @@ public: streamPos = position; return true; } - if (position <= DataContainer().GetLength()) { + if (DataContainer().CanRead(0, position)) { streamPos = position; return true; } else { @@ -212,8 +212,7 @@ public: protected: FileCursor CreateChunk(pos_type position, pos_type length) const { pos_type readableLength = DataContainer().GetReadableLength(position, length); - if (readableLength == 0) - { + if (readableLength == 0) { return FileCursor(); } return FileCursor(CreateChunkImpl(SharedDataContainer(), position, std::min(length, DataContainer().GetLength() - position))); diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata.hpp index afaf8db90..25c2bb640 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata.hpp @@ -43,7 +43,7 @@ public: virtual pos_type GetLength() const = 0; virtual mpt::byte_span Read(pos_type pos, mpt::byte_span dst) const = 0; - virtual bool CanRead(pos_type pos, std::size_t length) const { + virtual bool CanRead(pos_type pos, pos_type length) const { pos_type dataLength = GetLength(); if ((pos == dataLength) && (length == 0)) { return true; @@ -54,7 +54,7 @@ public: return length <= dataLength - pos; } - virtual std::size_t GetReadableLength(pos_type pos, std::size_t length) const { + virtual pos_type GetReadableLength(pos_type pos, pos_type length) const { pos_type dataLength = GetLength(); if (pos >= dataLength) { return 0; diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base.hpp index fba96a8f4..a75dd694c 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base.hpp @@ -88,7 +88,7 @@ public: } return data->Read(dataOffset + pos, dst.first(std::min(dst.size(), dataLength - pos))); } - bool CanRead(pos_type pos, std::size_t length) const override { + bool CanRead(pos_type pos, pos_type length) const override { if ((pos == dataLength) && (length == 0)) { return true; } @@ -97,7 +97,7 @@ public: } return (length <= dataLength - pos); } - pos_type GetReadableLength(pos_type pos, std::size_t length) const override { + pos_type GetReadableLength(pos_type pos, pos_type length) const override { if (pos >= dataLength) { return 0; } diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base_seekable.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base_seekable.hpp index b2324c7db..0669e3ea7 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base_seekable.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base_seekable.hpp @@ -5,8 +5,10 @@ +#include "mpt/base/alloc.hpp" #include "mpt/base/memory.hpp" #include "mpt/base/namespace.hpp" +#include "mpt/base/span.hpp" #include "mpt/io_read/filedata.hpp" #include diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base_unseekable.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base_unseekable.hpp index 78d9ca451..b425c2c8e 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base_unseekable.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_base_unseekable.hpp @@ -136,7 +136,7 @@ public: return dst.subspan(0, cache_avail); } - bool CanRead(pos_type pos, std::size_t length) const override { + bool CanRead(pos_type pos, pos_type length) const override { CacheStreamUpTo(pos, length); if ((pos == IFileData::pos_type(cachesize)) && (length == 0)) { return true; @@ -147,7 +147,7 @@ public: return length <= IFileData::pos_type(cachesize) - pos; } - std::size_t GetReadableLength(pos_type pos, std::size_t length) const override { + pos_type GetReadableLength(pos_type pos, pos_type length) const override { CacheStreamUpTo(pos, length); if (pos >= cachesize) { return 0; diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_memory.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_memory.hpp index 004104c34..cde007650 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_memory.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_read/filedata_memory.hpp @@ -69,7 +69,7 @@ public: return dst.first(avail); } - bool CanRead(pos_type pos, std::size_t length) const override { + bool CanRead(pos_type pos, pos_type length) const override { if ((pos == streamLength) && (length == 0)) { return true; } @@ -79,7 +79,7 @@ public: return (length <= streamLength - pos); } - std::size_t GetReadableLength(pos_type pos, std::size_t length) const override { + pos_type GetReadableLength(pos_type pos, pos_type length) const override { if (pos >= streamLength) { return 0; } diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_write/buffer.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_write/buffer.hpp index 646ce0fce..9984cf336 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/io_write/buffer.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/io_write/buffer.hpp @@ -8,6 +8,7 @@ #include "mpt/base/memory.hpp" #include "mpt/base/namespace.hpp" #include "mpt/base/integer.hpp" +#include "mpt/base/span.hpp" #include "mpt/io/base.hpp" #include diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/osinfo/windows_version.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/osinfo/windows_version.hpp index 33c046eb4..291c62678 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/osinfo/windows_version.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/osinfo/windows_version.hpp @@ -111,6 +111,12 @@ public: return Version(); } + static constexpr Version AnyWindows() noexcept { + Version result = Version(); + result.m_SystemIsWindows = true; + return result; + } + constexpr Version(mpt::osinfo::windows::Version::System system, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build, mpt::osinfo::windows::Version::TypeId type) noexcept : m_SystemIsWindows(true) , m_System(system) @@ -125,13 +131,17 @@ public: static mpt::osinfo::windows::Version FromSDK() noexcept { // Initialize to used SDK version #if defined(NTDDI_VERSION) -#if NTDDI_VERSION >= 0x0A00000B // NTDDI_WIN10_CO Win11 +#if NTDDI_VERSION >= 0x0A00000C // NTDDI_WIN10_NI Win11 22H2 + return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 22621, 0); +#elif NTDDI_VERSION >= 0x0A00000B // NTDDI_WIN10_CO Win11 21H2 return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 22000, 0); +//#elif // 22H2 +// return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 19045, 0); #elif NTDDI_VERSION >= 0x0A00000A // NTDDI_WIN10_FE 21H2 return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 19044, 0); -//#elif // NTDDI_WIN10_FE 21H1 +//#elif // 21H1 // return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 19043, 0); -//#elif // NTDDI_WIN10_FE 20H2 +//#elif // 20H2 // return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 19042, 0); #elif NTDDI_VERSION >= 0x0A000009 // NTDDI_WIN10_MN 2004/20H1 return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 19041, 0); diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/parse/parse.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/parse/parse.hpp index 30dc22a07..fe27191a2 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/parse/parse.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/parse/parse.hpp @@ -51,7 +51,13 @@ inline T ConvertStringTo(const Tstring & str) { std::basic_istringstream stream(mpt::parse_as_internal_string_type(mpt::as_string(str))); stream.imbue(std::locale::classic()); T value; - if constexpr (std::is_same::value) { + if constexpr (std::is_same::value) { + int tmp; + if (!(stream >> tmp)) { + return T{}; + } + value = tmp ? true : false; + } else if constexpr (std::is_same::value) { signed int tmp; if (!(stream >> tmp)) { return T{}; diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/parse/tests/tests_parse.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/parse/tests/tests_parse.hpp index 6ee44e15c..5f4eea292 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/parse/tests/tests_parse.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/parse/tests/tests_parse.hpp @@ -35,6 +35,13 @@ MPT_TEST_GROUP_INLINE("mpt/parse") #pragma clang diagnostic pop #endif { + MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("1"), true); + MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("0"), false); + MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("2"), true); + MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("-0"), false); + MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("-1"), true); + + MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("586"), 586u); MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("586"), 586u); MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("2147483647"), (uint32)std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo("4294967295"), std::numeric_limits::max()); diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/string/buffer.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/string/buffer.hpp index 1f032bae3..b87d8405c 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/string/buffer.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/string/buffer.hpp @@ -7,6 +7,7 @@ #include "mpt/base/detect.hpp" #include "mpt/base/namespace.hpp" +#include "mpt/base/saturate_cast.hpp" #include "mpt/detect/mfc.hpp" #include "mpt/string/types.hpp" diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/string/utility.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/string/utility.hpp index e2238a09f..116388cc6 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/string/utility.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/string/utility.hpp @@ -8,6 +8,7 @@ #include "mpt/base/detect.hpp" #include "mpt/base/namespace.hpp" #include "mpt/detect/mfc.hpp" +#include "mpt/string/types.hpp" #include #include diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/string_transcode/tests/tests_string_transcode.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/string_transcode/tests/tests_string_transcode.hpp index 311f833ba..ba4398751 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/string_transcode/tests/tests_string_transcode.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/string_transcode/tests/tests_string_transcode.hpp @@ -7,11 +7,14 @@ #include "mpt/base/detect.hpp" #include "mpt/base/namespace.hpp" +#include "mpt/string/types.hpp" #include "mpt/string_transcode/macros.hpp" #include "mpt/string_transcode/transcode.hpp" #include "mpt/test/test.hpp" #include "mpt/test/test_macros.hpp" +#include + namespace mpt { diff --git a/Frameworks/OpenMPT/OpenMPT/src/mpt/uuid/uuid.hpp b/Frameworks/OpenMPT/OpenMPT/src/mpt/uuid/uuid.hpp index 3e56c06df..06f17a814 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/mpt/uuid/uuid.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/mpt/uuid/uuid.hpp @@ -260,7 +260,7 @@ public: } return mpt::UUID::UUIDFromWin32(uuid); #else - return RFC4122Random(rng); + return mpt::UUID::RFC4122Random(rng); #endif } // Create a UUID that contains local, traceable information. diff --git a/Frameworks/OpenMPT/OpenMPT/src/openmpt/soundbase/DitherModPlug.hpp b/Frameworks/OpenMPT/OpenMPT/src/openmpt/soundbase/DitherModPlug.hpp index fcca4f459..76e212921 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/openmpt/soundbase/DitherModPlug.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/openmpt/soundbase/DitherModPlug.hpp @@ -35,11 +35,11 @@ public: { if constexpr(targetbits == 0) { - MPT_UNREFERENCED_PARAMETER(rng); + MPT_UNUSED(rng); return sample; } else if constexpr(targetbits + MixSampleIntTraits::mix_headroom_bits + 1 >= 32) { - MPT_UNREFERENCED_PARAMETER(rng); + MPT_UNUSED(rng); return sample; } else { diff --git a/Frameworks/OpenMPT/OpenMPT/src/openmpt/soundbase/DitherSimple.hpp b/Frameworks/OpenMPT/OpenMPT/src/openmpt/soundbase/DitherSimple.hpp index 5a60ef520..832f01514 100644 --- a/Frameworks/OpenMPT/OpenMPT/src/openmpt/soundbase/DitherSimple.hpp +++ b/Frameworks/OpenMPT/OpenMPT/src/openmpt/soundbase/DitherSimple.hpp @@ -38,7 +38,7 @@ public: { if constexpr(targetbits == 0) { - MPT_UNREFERENCED_PARAMETER(prng); + MPT_UNUSED(prng); return sample; } else { @@ -46,7 +46,7 @@ public: constexpr int rshift = (32 - targetbits) - MixSampleIntTraits::mix_headroom_bits; if constexpr(rshift <= 1) { - MPT_UNREFERENCED_PARAMETER(prng); + MPT_UNUSED(prng); // nothing to dither return sample; } else diff --git a/Frameworks/OpenMPT/OpenMPT/test/test.cpp b/Frameworks/OpenMPT/OpenMPT/test/test.cpp index 5f226885a..37b8d5286 100644 --- a/Frameworks/OpenMPT/OpenMPT/test/test.cpp +++ b/Frameworks/OpenMPT/OpenMPT/test/test.cpp @@ -653,6 +653,12 @@ static MPT_NOINLINE void TestStringFormatting() VERIFY_EQUAL(mpt::cfmt::center(4, CString(_T("a"))), CString(_T(" a "))); #endif // MPT_WITH_MFC + VERIFY_EQUAL(ConvertStrTo("1"), true); + VERIFY_EQUAL(ConvertStrTo("0"), false); + VERIFY_EQUAL(ConvertStrTo("2"), true); + VERIFY_EQUAL(ConvertStrTo("-0"), false); + VERIFY_EQUAL(ConvertStrTo("-1"), true); + VERIFY_EQUAL(ConvertStrTo("586"), 586u); VERIFY_EQUAL(ConvertStrTo("2147483647"), (uint32)int32_max); VERIFY_EQUAL(ConvertStrTo("4294967295"), uint32_max); @@ -3534,35 +3540,29 @@ static MPT_NOINLINE void TestStringIO() static MPT_NOINLINE void TestSampleConversion() { - std::vector sourceBufContainer(65536 * 4); - std::vector targetBufContainer(65536 * 6); - - uint8 *sourceBuf = &(sourceBufContainer[0]); - void *targetBuf = &(targetBufContainer[0]); - // Signed 8-Bit Integer PCM // Unsigned 8-Bit Integer PCM // Delta 8-Bit Integer PCM { - uint8 *source8 = sourceBuf; - for(size_t i = 0; i < 256; i++) + std::vector source8(256); + for(std::size_t i = 0; i < 256; i++) { - source8[i] = static_cast(i); + source8[i] = mpt::byte_cast(static_cast(i)); } - int8 *signed8 = static_cast(targetBuf); - uint8 *unsigned8 = static_cast(targetBuf) + 256; - int8 *delta8 = static_cast(targetBuf) + 512; + std::vector signed8(256); + std::vector unsigned8(256); + std::vector delta8(256); int8 delta = 0; - CopySample(signed8, 256, 1, mpt::byte_cast(source8), 256, 1); - CopySample(reinterpret_cast(unsigned8), 256, 1, mpt::byte_cast(source8), 256, 1); - CopySample(delta8, 256, 1, mpt::byte_cast(source8), 256, 1); + CopySample(signed8.data(), 256, 1, source8.data(), 256, 1); + CopySample(unsigned8.data(), 256, 1, source8.data(), 256, 1); + CopySample(delta8.data(), 256, 1, source8.data(), 256, 1); - for(size_t i = 0; i < 256; i++) + for(std::size_t i = 0; i < 256; i++) { delta += static_cast(i); VERIFY_EQUAL_QUIET_NONCONT(signed8[i], static_cast(i)); - VERIFY_EQUAL_QUIET_NONCONT(unsigned8[i], static_cast(i + 0x80u)); + VERIFY_EQUAL_QUIET_NONCONT(unsigned8[i], static_cast(static_cast(i) - 0x80)); VERIFY_EQUAL_QUIET_NONCONT(delta8[i], static_cast(delta)); } } @@ -3573,47 +3573,47 @@ static MPT_NOINLINE void TestSampleConversion() { // Little Endian - uint8 *source16 = sourceBuf; - for(size_t i = 0; i < 65536; i++) + std::vector source16(65536 * 2); + for(std::size_t i = 0; i < 65536; i++) { - source16[i * 2 + 0] = static_cast(i & 0xFF); - source16[i * 2 + 1] = static_cast(i >> 8); + source16[i * 2 + 0] = mpt::byte_cast(static_cast(i & 0xFF)); + source16[i * 2 + 1] = mpt::byte_cast(static_cast(i >> 8)); } - int16 *signed16 = static_cast(targetBuf); - uint16 *unsigned16 = static_cast(targetBuf) + 65536; - int16 *delta16 = static_cast(targetBuf) + 65536 * 2; + std::vector signed16(65536); + std::vector unsigned16(65536); + std::vector delta16(65536); int16 delta = 0; - CopySample >(signed16, 65536, 1, mpt::byte_cast(source16), 65536 * 2, 1); - CopySample >(reinterpret_cast(unsigned16), 65536, 1, mpt::byte_cast(source16), 65536 * 2, 1); - CopySample >(delta16, 65536, 1, mpt::byte_cast(source16), 65536 * 2, 1); + CopySample >(signed16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + CopySample >(unsigned16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + CopySample >(delta16.data(), 65536, 1, source16.data(), 65536 * 2, 1); - for(size_t i = 0; i < 65536; i++) + for(std::size_t i = 0; i < 65536; i++) { delta += static_cast(i); VERIFY_EQUAL_QUIET_NONCONT(signed16[i], static_cast(i)); - VERIFY_EQUAL_QUIET_NONCONT(unsigned16[i], static_cast(i + 0x8000u)); + VERIFY_EQUAL_QUIET_NONCONT(unsigned16[i], static_cast(static_cast(i) - 0x8000)); VERIFY_EQUAL_QUIET_NONCONT(delta16[i], static_cast(delta)); } // Big Endian - for(size_t i = 0; i < 65536; i++) + for(std::size_t i = 0; i < 65536; i++) { - source16[i * 2 + 0] = static_cast(i >> 8); - source16[i * 2 + 1] = static_cast(i & 0xFF); + source16[i * 2 + 0] = mpt::byte_cast(static_cast(i >> 8)); + source16[i * 2 + 1] = mpt::byte_cast(static_cast(i & 0xFF)); } - CopySample >(signed16, 65536, 1, mpt::byte_cast(source16), 65536 * 2, 1); - CopySample >(reinterpret_cast(unsigned16), 65536, 1, mpt::byte_cast(source16), 65536 * 2, 1); - CopySample >(delta16, 65536, 1, mpt::byte_cast(source16), 65536 * 2, 1); + CopySample >(signed16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + CopySample >(unsigned16.data(), 65536, 1, source16.data(), 65536 * 2, 1); + CopySample >(delta16.data(), 65536, 1, source16.data(), 65536 * 2, 1); delta = 0; for(size_t i = 0; i < 65536; i++) { delta += static_cast(i); VERIFY_EQUAL_QUIET_NONCONT(signed16[i], static_cast(i)); - VERIFY_EQUAL_QUIET_NONCONT(unsigned16[i], static_cast(i + 0x8000u)); + VERIFY_EQUAL_QUIET_NONCONT(unsigned16[i], static_cast(static_cast(i) - 0x8000)); VERIFY_EQUAL_QUIET_NONCONT(delta16[i], static_cast(delta)); } @@ -3621,24 +3621,25 @@ static MPT_NOINLINE void TestSampleConversion() // Signed 24-Bit Integer PCM { - uint8 *source24 = sourceBuf; - for(size_t i = 0; i < 65536; i++) + std::vector source24(65536 * 3); + for(std::size_t i = 0; i < 65536; i++) { - source24[i * 3 + 0] = 0; - source24[i * 3 + 1] = static_cast(i & 0xFF); - source24[i * 3 + 2] = static_cast(i >> 8); + source24[i * 3 + 0] = mpt::byte_cast(static_cast(0)); + source24[i * 3 + 1] = mpt::byte_cast(static_cast(i & 0xFF)); + source24[i * 3 + 2] = mpt::byte_cast(static_cast(i >> 8)); } - int16 *truncated16 = static_cast(targetBuf); + std::vector truncated16(65536); + std::vector sampleBuf(65536); ModSample sample; sample.Initialize(); sample.nLength = 65536; sample.uFlags.set(CHN_16BIT); - sample.pData.pSample = (static_cast(targetBuf) + 65536); - CopyAndNormalizeSample, SC::DecodeInt24<0, littleEndian24> > >(sample, mpt::byte_cast(source24), 3*65536); - CopySample, SC::DecodeInt24<0, littleEndian24> > >(truncated16, 65536, 1, mpt::byte_cast(source24), 65536 * 3, 1); + sample.pData.pSample = sampleBuf.data(); + CopyAndNormalizeSample, SC::DecodeInt24<0, littleEndian24> > >(sample, source24.data(), 3*65536); + CopySample, SC::DecodeInt24<0, littleEndian24> > >(truncated16.data(), 65536, 1, source24.data(), 65536 * 3, 1); - for(size_t i = 0; i < 65536; i++) + for(std::size_t i = 0; i < 65536; i++) { VERIFY_EQUAL_QUIET_NONCONT(sample.sample16()[i], static_cast(i)); VERIFY_EQUAL_QUIET_NONCONT(truncated16[i], static_cast(i)); @@ -3647,26 +3648,27 @@ static MPT_NOINLINE void TestSampleConversion() // Float 32-Bit { - uint8 *source32 = sourceBuf; - for(size_t i = 0; i < 65536; i++) + std::vector source32(65536 * 4); + for(std::size_t i = 0; i < 65536; i++) { IEEE754binary32BE floatbits = IEEE754binary32BE((static_cast(i) / 65536.0f) - 0.5f); - source32[i * 4 + 0] = mpt::byte_cast(floatbits.GetByte(0)); - source32[i * 4 + 1] = mpt::byte_cast(floatbits.GetByte(1)); - source32[i * 4 + 2] = mpt::byte_cast(floatbits.GetByte(2)); - source32[i * 4 + 3] = mpt::byte_cast(floatbits.GetByte(3)); + source32[i * 4 + 0] = mpt::byte_cast(floatbits.GetByte(0)); + source32[i * 4 + 1] = mpt::byte_cast(floatbits.GetByte(1)); + source32[i * 4 + 2] = mpt::byte_cast(floatbits.GetByte(2)); + source32[i * 4 + 3] = mpt::byte_cast(floatbits.GetByte(3)); } - int16 *truncated16 = static_cast(targetBuf); + std::vector truncated16(65536); + std::vector sampleBuf(65536); ModSample sample; sample.Initialize(); sample.nLength = 65536; sample.uFlags.set(CHN_16BIT); - sample.pData.pSample = static_cast(targetBuf) + 65536; - CopyAndNormalizeSample, SC::DecodeFloat32 > >(sample, mpt::byte_cast(source32), 4*65536); - CopySample, SC::DecodeFloat32 > >(truncated16, 65536, 1, mpt::byte_cast(source32), 65536 * 4, 1); + sample.pData.pSample = sampleBuf.data(); + CopyAndNormalizeSample, SC::DecodeFloat32 > >(sample, source32.data(), 4*65536); + CopySample, SC::DecodeFloat32 > >(truncated16.data(), 65536, 1, source32.data(), 65536 * 4, 1); - for(size_t i = 0; i < 65536; i++) + for(std::size_t i = 0; i < 65536; i++) { VERIFY_EQUAL_QUIET_NONCONT(sample.sample16()[i], static_cast(i - 0x8000u)); VERIFY_EQUAL_QUIET_NONCONT(std::abs(truncated16[i] - static_cast((i - 0x8000u) / 2)) <= 1, true); @@ -3740,10 +3742,11 @@ static MPT_NOINLINE void TestSampleConversion() // Range checks { - int8 oneSample = 1; - char *signed8 = reinterpret_cast(targetBuf); - memset(signed8, 0, 4); - CopySample(reinterpret_cast(targetBuf), 4, 1, reinterpret_cast(&oneSample), sizeof(oneSample), 1); + std::byte oneSample = mpt::byte_cast(static_cast(1)); + int8 targetBuf4[4]; + int8 *signed8 = targetBuf4; + std::memset(signed8, 0, 4); + CopySample(targetBuf4, 4, 1, &oneSample, sizeof(oneSample), 1); VERIFY_EQUAL_NONCONT(signed8[0], 1); VERIFY_EQUAL_NONCONT(signed8[1], 0); VERIFY_EQUAL_NONCONT(signed8[2], 0);