libOpenMPT: Updated to version 0.6.2

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
CQTexperiment
Christopher Snowhill 2022-03-14 04:34:25 -07:00
parent 8abbf267e1
commit aa28b2beb1
84 changed files with 1031 additions and 497 deletions

View File

@ -0,0 +1,152 @@
# clang-format 13
Language: Cpp
Standard: c++20
AccessModifierOffset: -4 #?
AlignAfterOpenBracket: AlwaysBreak
AlignArrayOfStructures: Left
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false
AlignConsecutiveDeclarations: false
AlignConsecutiveMacros: true
AlignEscapedNewlines: DontAlign
AlignOperands: AlignAfterOperator
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Always
AllowShortCaseLabelsOnASingleLine: true
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLambdasOnASingleLine: Inline
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: true
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: true
AfterClass: true
AfterControlStatement: Always
AfterEnum: true
AfterFunction: true
AfterNamespace: true
#AfterObjCDeclaration
AfterStruct: true
AfterUnion: true
AfterExternBlock: true
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: true
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
#BreakAfterJavaFieldAnnotations
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BreakBeforeConceptDeclarations: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeComma
BreakStringLiterals: false
ColumnLimit: 0
CommentPragmas: '' #?
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4 #?
ContinuationIndentWidth: 4 #?
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
EmptyLineAfterAccessModifier: Leave
EmptyLineBeforeAccessModifier: Leave
FixNamespaceComments: true
ForEachMacros: []
IfMacros: ['MPT_MAYBE_CONSTANT_IF']
IncludeBlocks: Preserve
IncludeCategories: [] #?
IncludeIsMainRegex: '' #?
IncludeIsMainSourceRegex: '' #?
IndentAccessModifiers: false
IndentCaseBlocks: true
IndentCaseLabels: true
IndentExternBlock: NoIndent
IndentGotoLabels: false
IndentPPDirectives: None
#IndentRequiresClause: true
#BeforeHash
IndentWidth: 4
IndentWrappedFunctionNames: true
InsertTrailingCommas: None
#JavaImportGroups
#JavaScriptQuotes
#JavaScriptWrapImports
KeepEmptyLinesAtTheStartOfBlocks: true
LambdaBodyIndentation: OuterScope
MacroBlockBegin: '^MPT_TEST_GROUP_BEGIN|BEGIN_MESSAGE_MAP$' #?
MacroBlockEnd: '^MPT_TEST_GROUP_END|END_MESSAGE_MAP$' #?
MaxEmptyLinesToKeep: 5
NamespaceIndentation: None
NamespaceMacros: [] #?
#ObjCBinPackProtocolList
#ObjCBlockIndentWidth
#ObjCBreakBeforeNestedBlockParam
#ObjCSpaceAfterProperty
#ObjCSpaceBeforeProtocolList
#PenaltyBreakAssignment
#PenaltyBreakBeforeFirstCallParameter
#PenaltyBreakComment
#PenaltyBreakFirstLessLess
#PenaltyBreakString
#PenaltyBreakTemplateDeclaration
#PenaltyExcessCharacter
#PenaltyIndentedWhitespace
#PenaltyReturnTypeOnItsOwnLine
PointerAlignment: Right
PPIndentWidth: -1
#RawStringFormats
ReferenceAlignment: Pointer
ReflowComments: false
ShortNamespaceLines: 1
SortIncludes: false
#SortJavaStaticImport
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: Never
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
StatementAttributeLikeMacros: []
StatementMacros: [ 'OPENMPT_NAMESPACE_BEGIN', 'OPENMPT_NAMESPACE_END', 'MPT_MSVC_WORKAROUND_LNK4221', 'MPT_WARNING', 'MPT_TEST_GROUP_INLINE_IDENTIFIER', 'MPT_TEST_GROUP_INLINE', 'MPT_TEST_GROUP_STATIC' ] #?
TabWidth: 4
TypenameMacros: [] #?
UseCRLF: false
UseTab: ForContinuationAndIndentation
WhitespaceSensitiveMacros:
- MPT_PP_STRINGIFY

View File

@ -1,4 +1,4 @@
MPT_SVNVERSION=16764
MPT_SVNURL=https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.1
MPT_SVNDATE=2022-01-30T16:49:19.812343Z
MPT_SVNVERSION=17108
MPT_SVNURL=https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.2
MPT_SVNDATE=2022-03-13T14:50:28.374505Z

View File

@ -1,10 +1,10 @@
#pragma once
#define OPENMPT_VERSION_SVNVERSION "16764"
#define OPENMPT_VERSION_REVISION 16764
#define OPENMPT_VERSION_SVNVERSION "17108"
#define OPENMPT_VERSION_REVISION 17108
#define OPENMPT_VERSION_DIRTY 0
#define OPENMPT_VERSION_MIXEDREVISIONS 0
#define OPENMPT_VERSION_URL "https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.1"
#define OPENMPT_VERSION_DATE "2022-01-30T16:49:19.812343Z"
#define OPENMPT_VERSION_URL "https://source.openmpt.org/svn/openmpt/tags/libopenmpt-0.6.2"
#define OPENMPT_VERSION_DATE "2022-03-13T14:50:28.374505Z"
#define OPENMPT_VERSION_IS_PACKAGE 1

View File

@ -210,8 +210,6 @@
#if defined(MODPLUG_TRACKER)
#define MPT_UPDATE_LEGACY 1
// Enable built-in test suite.
#if defined(MPT_BUILD_DEBUG) || defined(MPT_BUILD_CHECKED)
#define ENABLE_TESTS

View File

@ -357,17 +357,22 @@ static Tdststring EncodeImpl(Charset charset, const mpt::widestring &src)
switch(charset)
{
#if defined(MPT_ENABLE_CHARSET_LOCALE)
case Charset::Locale: return mpt::encode<Tdststring>(mpt::logical_encoding::locale, src); break;
case Charset::Locale: return mpt::encode<Tdststring>(mpt::logical_encoding::locale, src); break;
#endif
case Charset::UTF8: return mpt::encode<Tdststring>(mpt::common_encoding::utf8, src); break;
case Charset::ASCII: return mpt::encode<Tdststring>(mpt::common_encoding::ascii, src); break;
case Charset::ISO8859_1: return mpt::encode<Tdststring>(mpt::common_encoding::iso8859_1, src); break;
case Charset::ISO8859_15: return mpt::encode<Tdststring>(mpt::common_encoding::iso8859_15, src); break;
case Charset::CP850: return mpt::encode<Tdststring>(mpt::common_encoding::cp850, src); break;
case Charset::CP437: return mpt::encode<Tdststring>(mpt::common_encoding::cp437, src); break;
case Charset::CP437AMS: return mpt::encode<Tdststring>(CharsetTableCP437AMS, src); break;
case Charset::CP437AMS2: return mpt::encode<Tdststring>(CharsetTableCP437AMS2, src); break;
case Charset::Windows1252: return mpt::encode<Tdststring>(mpt::common_encoding::windows1252, src); break;
case Charset::UTF8: return mpt::encode<Tdststring>(mpt::common_encoding::utf8, src); break;
case Charset::ASCII: return mpt::encode<Tdststring>(mpt::common_encoding::ascii, src); break;
case Charset::ISO8859_1: return mpt::encode<Tdststring>(mpt::common_encoding::iso8859_1, src); break;
case Charset::ISO8859_15: return mpt::encode<Tdststring>(mpt::common_encoding::iso8859_15, src); break;
case Charset::CP850: return mpt::encode<Tdststring>(mpt::common_encoding::cp850, src); break;
case Charset::CP437: return mpt::encode<Tdststring>(mpt::common_encoding::cp437, src); break;
case Charset::CP437AMS: return mpt::encode<Tdststring>(CharsetTableCP437AMS, src); break;
case Charset::CP437AMS2: return mpt::encode<Tdststring>(CharsetTableCP437AMS2, src); break;
case Charset::Windows1252: return mpt::encode<Tdststring>(mpt::common_encoding::windows1252, src); break;
case Charset::Amiga: return mpt::encode<Tdststring>(mpt::common_encoding::amiga, src); break;
case Charset::RISC_OS: return mpt::encode<Tdststring>(mpt::common_encoding::riscos, src); break;
case Charset::ISO8859_1_no_C1: return mpt::encode<Tdststring>(mpt::common_encoding::iso8859_1_no_c1, src); break;
case Charset::ISO8859_15_no_C1: return mpt::encode<Tdststring>(mpt::common_encoding::iso8859_15_no_c1, src); break;
case Charset::Amiga_no_C1: return mpt::encode<Tdststring>(mpt::common_encoding::amiga_no_c1, src); break;
}
return Tdststring();
}
@ -382,17 +387,22 @@ static mpt::widestring DecodeImpl(Charset charset, const Tsrcstring &src)
switch(charset)
{
#if defined(MPT_ENABLE_CHARSET_LOCALE)
case Charset::Locale: return mpt::decode<Tsrcstring>(mpt::logical_encoding::locale, src); break;
case Charset::Locale: return mpt::decode<Tsrcstring>(mpt::logical_encoding::locale, src); break;
#endif
case Charset::UTF8: return mpt::decode<Tsrcstring>(mpt::common_encoding::utf8, src); break;
case Charset::ASCII: return mpt::decode<Tsrcstring>(mpt::common_encoding::ascii, src); break;
case Charset::ISO8859_1: return mpt::decode<Tsrcstring>(mpt::common_encoding::iso8859_1, src); break;
case Charset::ISO8859_15: return mpt::decode<Tsrcstring>(mpt::common_encoding::iso8859_15, src); break;
case Charset::CP850: return mpt::decode<Tsrcstring>(mpt::common_encoding::cp850, src); break;
case Charset::CP437: return mpt::decode<Tsrcstring>(mpt::common_encoding::cp437, src); break;
case Charset::CP437AMS: return mpt::decode<Tsrcstring>(CharsetTableCP437AMS, src); break;
case Charset::CP437AMS2: return mpt::decode<Tsrcstring>(CharsetTableCP437AMS2, src); break;
case Charset::Windows1252: return mpt::decode<Tsrcstring>(mpt::common_encoding::windows1252, src); break;
case Charset::UTF8: return mpt::decode<Tsrcstring>(mpt::common_encoding::utf8, src); break;
case Charset::ASCII: return mpt::decode<Tsrcstring>(mpt::common_encoding::ascii, src); break;
case Charset::ISO8859_1: return mpt::decode<Tsrcstring>(mpt::common_encoding::iso8859_1, src); break;
case Charset::ISO8859_15: return mpt::decode<Tsrcstring>(mpt::common_encoding::iso8859_15, src); break;
case Charset::CP850: return mpt::decode<Tsrcstring>(mpt::common_encoding::cp850, src); break;
case Charset::CP437: return mpt::decode<Tsrcstring>(mpt::common_encoding::cp437, src); break;
case Charset::CP437AMS: return mpt::decode<Tsrcstring>(CharsetTableCP437AMS, src); break;
case Charset::CP437AMS2: return mpt::decode<Tsrcstring>(CharsetTableCP437AMS2, src); break;
case Charset::Windows1252: return mpt::decode<Tsrcstring>(mpt::common_encoding::windows1252, src); break;
case Charset::Amiga: return mpt::decode<Tsrcstring>(mpt::common_encoding::amiga, src); break;
case Charset::RISC_OS: return mpt::decode<Tsrcstring>(mpt::common_encoding::riscos, src); break;
case Charset::ISO8859_1_no_C1: return mpt::decode<Tsrcstring>(mpt::common_encoding::iso8859_1_no_c1, src); break;
case Charset::ISO8859_15_no_C1: return mpt::decode<Tsrcstring>(mpt::common_encoding::iso8859_15_no_c1, src); break;
case Charset::Amiga_no_C1: return mpt::decode<Tsrcstring>(mpt::common_encoding::amiga_no_c1, src); break;
}
return mpt::widestring();
}

View File

@ -66,6 +66,13 @@ enum class Charset {
Windows1252,
Amiga,
RISC_OS,
ISO8859_1_no_C1,
ISO8859_15_no_C1,
Amiga_no_C1,
#if defined(MPT_ENABLE_CHARSET_LOCALE)
Locale, // CP_ACP on windows, current C locale otherwise
#endif // MPT_ENABLE_CHARSET_LOCALE

View File

@ -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 02
#define VER_MINOR 03
#define VER_MINORMINOR 00
OPENMPT_NAMESPACE_END

View File

@ -1,65 +1,153 @@
# clang-format 10
Language: Cpp
Standard: c++17
AccessModifierOffset: -2
AlignAfterOpenBracket: true
# clang-format 13
Language: Cpp
Standard: c++20
AccessModifierOffset: -2 #?
AlignAfterOpenBracket: AlwaysBreak
AlignArrayOfStructures: Left
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false
AlignConsecutiveDeclarations: false
AlignConsecutiveMacros: true
AlignEscapedNewlinesLeft: true
AlignOperands: true
AlignTrailingComments: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false
AlignEscapedNewlines: DontAlign
AlignOperands: AlignAfterOperator
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: false
AllowShortLambdasOnASingleLine: Inline
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
BinPackArguments: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros: []
BinPackArguments: true
BinPackParameters: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeTernaryOperators: false
BreakConstructorInitializersBeforeComma: true
ColumnLimit: 0
CommentPragmas: '^ IWYU pragma:'
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: true
AfterClass: false
AfterControlStatement: MultiLine
AfterEnum: false
AfterFunction: false
AfterNamespace: false
#AfterObjCDeclaration
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: true
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: false
SplitEmptyNamespace: true
#BreakAfterJavaFieldAnnotations
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BreakBeforeConceptDeclarations: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeComma
BreakStringLiterals: false
ColumnLimit: 0
CommentPragmas: '' #?
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 2
ContinuationIndentWidth: 2
Cpp11BracedListStyle: false
ConstructorInitializerIndentWidth: 2 #?
ContinuationIndentWidth: 2 #?
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
EmptyLineAfterAccessModifier: Leave
EmptyLineBeforeAccessModifier: Leave
FixNamespaceComments: true
ForEachMacros: []
IfMacros: ['MPT_MAYBE_CONSTANT_IF']
IncludeBlocks: Preserve
IncludeCategories: [] #?
IncludeIsMainRegex: '' #?
IncludeIsMainSourceRegex: '' #?
IndentAccessModifiers: false
IndentCaseBlocks: true
IndentCaseLabels: true
IndentWidth: 2
IndentWrappedFunctionNames: false
IndentExternBlock: NoIndent
IndentGotoLabels: false
IndentPPDirectives: None
#IndentRequiresClause: true
#BeforeHash
IndentWidth: 2
IndentWrappedFunctionNames: true
InsertTrailingCommas: None
#JavaImportGroups
#JavaScriptQuotes
#JavaScriptWrapImports
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
LambdaBodyIndentation: OuterScope
MacroBlockBegin: '' #?
MacroBlockEnd: '' #?
MaxEmptyLinesToKeep: 3
NamespaceIndentation: None
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 60
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
NamespaceMacros: [] #?
#ObjCBinPackProtocolList
#ObjCBlockIndentWidth
#ObjCBreakBeforeNestedBlockParam
#ObjCSpaceAfterProperty
#ObjCSpaceBeforeProtocolList
#PenaltyBreakAssignment
#PenaltyBreakBeforeFirstCallParameter
#PenaltyBreakComment
#PenaltyBreakFirstLessLess
#PenaltyBreakString
#PenaltyBreakTemplateDeclaration
#PenaltyExcessCharacter
#PenaltyIndentedWhitespace
#PenaltyReturnTypeOnItsOwnLine
PointerAlignment: Middle
PPIndentWidth: -1
#RawStringFormats
ReferenceAlignment: Pointer
ReflowComments: false
ShortNamespaceLines: 1
SortIncludes: false
#SortJavaStaticImport
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: true
SpacesInContainerLiterals: true
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: true
SpacesInSquareBrackets: false
TabWidth: 2
UseTab: ForIndentation
StatementAttributeLikeMacros: []
StatementMacros: [ 'MPT_WARNING', 'MPT_TEST_GROUP_INLINE_IDENTIFIER', 'MPT_TEST_GROUP_INLINE', 'MPT_TEST_GROUP_STATIC' ] #?
TabWidth: 2
TypenameMacros: [] #?
UseCRLF: false
UseTab: ForContinuationAndIndentation
WhitespaceSensitiveMacros:
- MPT_PP_STRINGIFY

View File

@ -64,7 +64,8 @@ int main( int argc, char * argv[] ) {
portaudio::StreamParameters stream_parameters( portaudio::DirectionSpecificStreamParameters::null(), outputstream_parameters, samplerate, paFramesPerBufferUnspecified, paNoFlag );
portaudio::BlockingStream stream( stream_parameters );
#else
portaudio::BlockingStream stream = [&]() {
portaudio::BlockingStream stream = [&]()
{
try {
is_interleaved = false;
portaudio::DirectionSpecificStreamParameters outputstream_parameters( portaudio.defaultOutputDevice(), 2, portaudio::FLOAT32, false, portaudio.defaultOutputDevice().defaultHighOutputLatency(), 0 );

View File

@ -1,15 +1,17 @@
# clang-format 11
# clang-format 13
Language: Cpp
Standard: c++17
Standard: c++20
AccessModifierOffset: -2 #?
AlignAfterOpenBracket: AlwaysBreak
AlignArrayOfStructures: Left
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false
AlignConsecutiveDeclarations: false
AlignConsecutiveMacros: true
AlignEscapedNewlines: DontAlign
AlignOperands: DontAlign
AlignOperands: AlignAfterOperator
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
@ -24,8 +26,10 @@ AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros: []
BinPackArguments: true
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: true
AfterClass: false
@ -48,6 +52,7 @@ BraceWrapping:
#BreakAfterJavaFieldAnnotations
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BreakBeforeConceptDeclarations: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeComma
@ -61,17 +66,22 @@ ContinuationIndentWidth: 2 #?
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
EmptyLineAfterAccessModifier: Leave
EmptyLineBeforeAccessModifier: Leave
FixNamespaceComments: true
ForEachMacros: []
IfMacros: ['MPT_MAYBE_CONSTANT_IF']
IncludeBlocks: Preserve
IncludeCategories: [] #?
IncludeIsMainRegex: '' #?
IncludeIsMainSourceRegex: '' #?
IndentAccessModifiers: false
IndentCaseBlocks: true
IndentCaseLabels: true
IndentExternBlock: NoIndent
IndentGotoLabels: false
IndentPPDirectives: None
#IndentRequiresClause: true
#BeforeHash
IndentWidth: 2
IndentWrappedFunctionNames: true
@ -80,8 +90,9 @@ InsertTrailingCommas: None
#JavaScriptQuotes
#JavaScriptWrapImports
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: '^BEGIN_MESSAGE_MAP$' #?
MacroBlockEnd: '^END_MESSAGE_MAP$' #?
LambdaBodyIndentation: OuterScope
MacroBlockBegin: '' #?
MacroBlockEnd: '' #?
MaxEmptyLinesToKeep: 3
NamespaceIndentation: None
NamespaceMacros: [] #?
@ -97,16 +108,23 @@ NamespaceMacros: [] #?
#PenaltyBreakString
#PenaltyBreakTemplateDeclaration
#PenaltyExcessCharacter
#PenaltyIndentedWhitespace
#PenaltyReturnTypeOnItsOwnLine
PointerAlignment: Middle
PPIndentWidth: -1
#RawStringFormats
ReferenceAlignment: Pointer
ReflowComments: false
ShortNamespaceLines: 1
SortIncludes: false
#SortJavaStaticImport
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
@ -120,8 +138,12 @@ SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: true
SpacesInContainerLiterals: true
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: true
SpacesInSquareBrackets: false
StatementAttributeLikeMacros: []
StatementMacros: [ 'MPT_WARNING', 'MPT_TEST_GROUP_INLINE_IDENTIFIER', 'MPT_TEST_GROUP_INLINE', 'MPT_TEST_GROUP_STATIC' ] #?
TabWidth: 2
TypenameMacros: [] #?

View File

@ -123,7 +123,7 @@ Type openmpt_module_ext_interface_interactive
\param speed The new tick count in range [1, 65535].
\throws openmpt::exception Throws an exception derived from openmpt::exception if the speed is outside the specified range.
\return 1 on success, 0 on failure.
\sa openmpt_module_ext_interface_interactive.openmpt_module_get_current_speed
\sa openmpt_module_get_current_speed
'/
set_current_speed As Function(ByVal mod_ext As openmpt_module_ext Ptr, ByVal speed As Long) As Long
@ -133,7 +133,7 @@ Type openmpt_module_ext_interface_interactive
\param tempo The new tempo in range [32, 512]. The exact meaning of the value depends on the tempo mode used by the module.
\return 1 on success, 0 on failure.
\remarks The tempo may be reset by pattern commands at any time. Use set_tempo_factor to apply a tempo factor that is independent of pattern commands.
\sa openmpt_module_ext_interface_interactive.openmpt_module_get_current_tempo
\sa openmpt_module_get_current_tempo
'/
set_current_tempo As Function(ByVal mod_ext As openmpt_module_ext Ptr, ByVal tempo As Long) As Long

View File

@ -5,6 +5,25 @@ Changelog {#changelog}
For fully detailed change log, please see the source repository directly. This
is just a high-level summary.
### libopenmpt 0.6.2 (2022-03-13)
* [**Sec**] Possible out-of-bounds write in malformed IT / XM / MPTM files
using the internal LFO plugin. (r17076)
* [**Sec**] Possible out-of-bounds read when using Amiga BLEP interpolation
with extremely high-pitched notes. (r17078, r17079)
* ISO-8859-1-related charsets from Amiga OS and RISC OS are now handled more
accurately, thus avoiding some unwanted control characters.
* MO3: Pattern indices 254 / 255 were not treated as playable patterns even if
the original file was a MOD / XM.
* Correctly apply ST3-style effect memory when seeking in S3M files.
* Command S (S3M / IT style) effect memory was not applied when seeking.
* Initial channel mute status was not reported correctly in `get_channel_mute_status`
since libopenmpt 0.6.0.
* FLAC: Update to v1.3.4 (2022-02-21).
* pugixml: Update to v1.12.1 (2022-02-16).
### libopenmpt 0.6.1 (2022-01-30)
* [**Bug**] Linking libmpg123 no longer fails on OpenBSD.
@ -13,6 +32,7 @@ is just a high-level summary.
* [**Bug**] Avoid NaNs and infinite values with custom tunings and in the
I3DL2Reverb plugin.
* MIDI macros are now evaluated when seeking.
* The letter "z" is now evaluated in fixed MIDI macros (Z80...ZFF) the same
way as in Impulse Tracker.
* MOD: Loosened VBlank timing heuristics so that "frame of mind" by Dascon

View File

@ -127,12 +127,12 @@
/*! \defgroup libopenmpt_cpp libopenmpt C++ */
namespace openmpt {
/*! \addtogroup libopenmpt_cpp
@{
*/
namespace openmpt {
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable:4275)
@ -1176,10 +1176,10 @@ public:
}; // class module
} // namespace openmpt
/*!
@}
*/
} // namespace openmpt
#endif // LIBOPENMPT_HPP

View File

@ -24,6 +24,14 @@
#define LIBOPENMPT_CXX_API
#undef LIBOPENMPT_CXX_API
/*!
@}
*/
/*! \addtogroup libopenmpt_c
@{
*/
/*! \brief Defined if libopenmpt/libopenmpt_stream_callbacks_buffer.h exists. */
#define LIBOPENMPT_STREAM_CALLBACKS_BUFFER
@ -53,6 +61,14 @@
*/
#define LIBOPENMPT_STREAM_CALLBACKS_FILE
/*!
@}
*/
/*! \addtogroup libopenmpt
@{
*/
#if defined(__DOXYGEN__)
#define LIBOPENMPT_API_HELPER_EXPORT

View File

@ -26,12 +26,12 @@
/*! \defgroup libopenmpt_ext_cpp libopenmpt_ext C++ */
namespace openmpt {
/*! \addtogroup libopenmpt_ext_cpp
@{
*/
namespace openmpt {
class module_ext_impl;
class LIBOPENMPT_CXX_API module_ext : public module {
@ -77,8 +77,16 @@ public:
}; // class module_ext
/*!
@}
*/
namespace ext {
/*! \addtogroup libopenmpt_ext_cpp
@{
*/
#define LIBOPENMPT_DECLARE_EXT_CXX_INTERFACE(name) \
static const char name ## _id [] = # name ; \
class name; \
@ -385,12 +393,12 @@ class interactive2 {
#undef LIBOPENMPT_DECLARE_EXT_CXX_INTERFACE
#undef LIBOPENMPT_EXT_CXX_INTERFACE
} // namespace ext
} // namespace openmpt
/*!
@}
*/
} // namespace ext
} // namespace openmpt
#endif // LIBOPENMPT_EXT_HPP

View File

@ -212,7 +212,7 @@ namespace openmpt {
if ( channel < 0 || channel >= get_num_channels() ) {
throw openmpt::exception("invalid channel");
}
return m_sndFile->m_PlayState.Chn[channel].dwFlags[OpenMPT::CHN_MUTE];
return m_sndFile->m_PlayState.Chn[channel].dwFlags[OpenMPT::CHN_MUTE | OpenMPT::CHN_SYNCMUTE];
}
void module_ext_impl::set_instrument_mute_status( std::int32_t instrument, bool mute ) {

View File

@ -51,12 +51,20 @@
#include "soundlib/mod_specifications.h"
#include "soundlib/AudioReadTarget.h"
#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
#include <windows.h>
#endif // MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
OPENMPT_NAMESPACE_BEGIN
#if !defined(MPT_BUILD_SILENCE_LIBOPENMPT_CONFIGURATION_WARNINGS)
#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
#if defined(_WIN32_WINNT)
#if defined(NTDDI_VERSION)
#if (NTDDI_VERSION < 0x06020000)
MPT_WARNING("Warning: libopenmpt for WinRT is built with reduced functionality. Please #define NTDDI_VERSION 0x0602000.")
#endif
#elif defined(_WIN32_WINNT)
#if (_WIN32_WINNT < 0x0602)
MPT_WARNING("Warning: libopenmpt for WinRT is built with reduced functionality. Please #define _WIN32_WINNT 0x0602.")
#endif // _WIN32_WINNT

View File

@ -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 1
#define OPENMPT_API_VERSION_PATCH 2
/*! \brief libopenmpt pre-release tag */
#define OPENMPT_API_VERSION_PREREL ""
/*! \brief libopenmpt pre-release flag */

View File

@ -1,8 +1,8 @@
LIBOPENMPT_VERSION_MAJOR=0
LIBOPENMPT_VERSION_MINOR=6
LIBOPENMPT_VERSION_PATCH=1
LIBOPENMPT_VERSION_PATCH=2
LIBOPENMPT_VERSION_PREREL=
LIBOPENMPT_LTVER_CURRENT=3
LIBOPENMPT_LTVER_REVISION=1
LIBOPENMPT_LTVER_REVISION=2
LIBOPENMPT_LTVER_AGE=3

View File

@ -1,15 +1,17 @@
# clang-format 11
# clang-format 13
Language: Cpp
Standard: c++17
Standard: c++20
AccessModifierOffset: -2 #?
AlignAfterOpenBracket: AlwaysBreak
AlignArrayOfStructures: Left
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false
AlignConsecutiveDeclarations: false
AlignConsecutiveMacros: true
AlignEscapedNewlines: DontAlign
AlignOperands: DontAlign
AlignOperands: AlignAfterOperator
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
@ -24,8 +26,10 @@ AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros: []
BinPackArguments: true
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: true
AfterClass: false
@ -48,6 +52,7 @@ BraceWrapping:
#BreakAfterJavaFieldAnnotations
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BreakBeforeConceptDeclarations: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeComma
@ -61,25 +66,31 @@ ContinuationIndentWidth: 2 #?
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
EmptyLineAfterAccessModifier: Leave
EmptyLineBeforeAccessModifier: Leave
FixNamespaceComments: true
ForEachMacros: []
IfMacros: ['MPT_MAYBE_CONSTANT_IF']
IncludeBlocks: Preserve
IncludeCategories: [] #?
IncludeIsMainRegex: '' #?
IncludeIsMainSourceRegex: '' #?
IndentAccessModifiers: false
IndentCaseBlocks: true
IndentCaseLabels: true
IndentExternBlock: NoIndent
IndentGotoLabels: false
IndentPPDirectives: None
#IndentRequiresClause: true
#BeforeHash
IndentWidth: 2
InsertTrailingCommas: None
IndentWrappedFunctionNames: true
InsertTrailingCommas: None
#JavaImportGroups
#JavaScriptQuotes
#JavaScriptWrapImports
KeepEmptyLinesAtTheStartOfBlocks: true
LambdaBodyIndentation: OuterScope
MacroBlockBegin: '' #?
MacroBlockEnd: '' #?
MaxEmptyLinesToKeep: 3
@ -97,16 +108,23 @@ NamespaceMacros: [] #?
#PenaltyBreakString
#PenaltyBreakTemplateDeclaration
#PenaltyExcessCharacter
#PenaltyIndentedWhitespace
#PenaltyReturnTypeOnItsOwnLine
PointerAlignment: Middle
PPIndentWidth: -1
#RawStringFormats
ReferenceAlignment: Pointer
ReflowComments: false
ShortNamespaceLines: 1
SortIncludes: false
#SortJavaStaticImport
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
@ -120,8 +138,12 @@ SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: true
SpacesInContainerLiterals: true
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: true
SpacesInSquareBrackets: false
StatementAttributeLikeMacros: []
StatementMacros: [ 'MPT_WARNING', 'MPT_TEST_GROUP_INLINE_IDENTIFIER', 'MPT_TEST_GROUP_INLINE', 'MPT_TEST_GROUP_STATIC' ] #?
TabWidth: 2
TypenameMacros: [] #?

View File

@ -58,7 +58,7 @@ bool UnpackUMX(std::vector<ContainerItem> &containerItems, FileReader &file, Con
if(objName >= 0 && static_cast<std::size_t>(objName) < names.size())
{
item.name = mpt::ToUnicode(mpt::Charset::ISO8859_1, names[objName]);
item.name = mpt::ToUnicode(mpt::Charset::Windows1252, names[objName]);
}
item.file = fileChunk;

View File

@ -1123,7 +1123,7 @@ bool CDLSBank::ConvertSF2ToDLS(SF2LoaderInfo &sf2info)
}
// Load Instrument Bags
dlsIns.Regions.clear();
for(const auto [nInstrNdx, keyRange] : instruments)
for(const auto & [nInstrNdx, keyRange] : instruments)
{
if(nInstrNdx >= numInsts)
continue;

View File

@ -41,9 +41,7 @@ typedef IntToFloatTraits<2, 2, mixsample_t, int16, -int16_min> Int16SToFloatS;
template<class Traits>
struct LinearInterpolation
{
MPT_FORCEINLINE void Start(const ModChannel &, const CResampler &) { }
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE LinearInterpolation(const ModChannel &, const CResampler &, unsigned int) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const uint32 posLo)
{
@ -64,8 +62,7 @@ struct LinearInterpolation
template<class Traits>
struct FastSincInterpolation
{
MPT_FORCEINLINE void Start(const ModChannel &, const CResampler &) { }
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE FastSincInterpolation(const ModChannel &, const CResampler &, unsigned int) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const uint32 posLo)
{
@ -89,14 +86,12 @@ struct PolyphaseInterpolation
{
const typename Traits::output_t *sinc;
MPT_FORCEINLINE void Start(const ModChannel &chn, const CResampler &resampler)
MPT_FORCEINLINE PolyphaseInterpolation(const ModChannel &chn, const CResampler &resampler, unsigned int)
{
sinc = (((chn.increment > SamplePosition(0x130000000ll)) || (chn.increment < -SamplePosition(-0x130000000ll))) ?
(((chn.increment > SamplePosition(0x180000000ll)) || (chn.increment < SamplePosition(-0x180000000ll))) ? resampler.gDownsample2x : resampler.gDownsample13x) : resampler.gKaiserSinc);
}
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const uint32 posLo)
{
static_assert(static_cast<int>(Traits::numChannelsIn) <= static_cast<int>(Traits::numChannelsOut), "Too many input channels");
@ -123,13 +118,11 @@ struct FIRFilterInterpolation
{
const typename Traits::output_t *WFIRlut;
MPT_FORCEINLINE void Start(const ModChannel &, const CResampler &resampler)
MPT_FORCEINLINE FIRFilterInterpolation(const ModChannel &, const CResampler &resampler, unsigned int)
{
WFIRlut = resampler.m_WindowedFIR.lut;
}
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const uint32 posLo)
{
static_assert(static_cast<int>(Traits::numChannelsIn) <= static_cast<int>(Traits::numChannelsOut), "Too many input channels");
@ -159,30 +152,30 @@ struct NoRamp
{
typename Traits::output_t lVol, rVol;
MPT_FORCEINLINE void Start(const ModChannel &chn)
MPT_FORCEINLINE NoRamp(const ModChannel &chn)
{
lVol = static_cast<Traits::output_t>(chn.leftVol) * (1.0f / 4096.0f);
rVol = static_cast<Traits::output_t>(chn.rightVol) * (1.0f / 4096.0f);
}
MPT_FORCEINLINE void End(const ModChannel &) { }
};
struct Ramp
{
ModChannel &channel;
int32 lRamp, rRamp;
MPT_FORCEINLINE void Start(const ModChannel &chn)
MPT_FORCEINLINE Ramp(ModChannel &chn)
: channel{chn}
{
lRamp = chn.rampLeftVol;
rRamp = chn.rampRightVol;
}
MPT_FORCEINLINE void End(ModChannel &chn)
MPT_FORCEINLINE ~Ramp()
{
chn.rampLeftVol = lRamp; chn.leftVol = lRamp >> VOLUMERAMPPRECISION;
chn.rampRightVol = rRamp; chn.rightVol = rRamp >> VOLUMERAMPPRECISION;
channel.rampLeftVol = lRamp; channel.leftVol = lRamp >> VOLUMERAMPPRECISION;
channel.rampRightVol = rRamp; channel.rightVol = rRamp >> VOLUMERAMPPRECISION;
}
};
@ -259,8 +252,7 @@ struct MixStereoRamp : public Ramp
template<class Traits>
struct NoFilter
{
MPT_FORCEINLINE void Start(const ModChannel &) { }
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE NoFilter(const ModChannel &) { }
MPT_FORCEINLINE void operator() (const typename Traits::outbuf_t &, const ModChannel &) { }
};
@ -270,10 +262,12 @@ struct NoFilter
template<class Traits>
struct ResonantFilter
{
ModChannel &channel;
// Filter history
typename Traits::output_t fy[Traits::numChannelsIn][2];
MPT_FORCEINLINE void Start(const ModChannel &chn)
MPT_FORCEINLINE ResonantFilter(ModChannel &chn)
: channel{chn}
{
for(int i = 0; i < Traits::numChannelsIn; i++)
{
@ -282,12 +276,12 @@ struct ResonantFilter
}
}
MPT_FORCEINLINE void End(ModChannel &chn)
MPT_FORCEINLINE ~ResonantFilter(ModChannel &chn)
{
for(int i = 0; i < Traits::numChannelsIn; i++)
{
chn.nFilter_Y[i][0] = fy[i][0];
chn.nFilter_Y[i][1] = fy[i][1];
channel.nFilter_Y[i][0] = fy[i][0];
channel.nFilter_Y[i][1] = fy[i][1];
}
}

View File

@ -50,23 +50,34 @@ template<class Traits>
struct AmigaBlepInterpolation
{
SamplePosition subIncrement;
Paula::State *paula;
const Paula::BlepArray *WinSincIntegral;
int numSteps;
Paula::State &paula;
const Paula::BlepArray &WinSincIntegral;
const int numSteps;
unsigned int remainingSamples = 0;
MPT_FORCEINLINE void Start(ModChannel &chn, const CResampler &resampler)
MPT_FORCEINLINE AmigaBlepInterpolation(ModChannel &chn, const CResampler &resampler, unsigned int numSamples)
: paula{chn.paulaState}
, WinSincIntegral{resampler.blepTables.GetAmigaTable(resampler.m_Settings.emulateAmiga, chn.dwFlags[CHN_AMIGAFILTER])}
, numSteps{chn.paulaState.numSteps}
{
paula = &chn.paulaState;
numSteps = paula->numSteps;
WinSincIntegral = &resampler.blepTables.GetAmigaTable(resampler.m_Settings.emulateAmiga, chn.dwFlags[CHN_AMIGAFILTER]);
if(numSteps)
{
subIncrement = chn.increment / numSteps;
// May we read past the start or end of sample if we do partial sample increments?
// If that's the case, don't apply any sub increments on the source sample if we reached the last output sample
// Note that this should only happen with notes well outside the Amiga note range, e.g. in software-mixed formats like MED
const int32 targetPos = (chn.position + chn.increment * numSamples).GetInt();
if(static_cast<SmpLength>(targetPos) > chn.nLength)
remainingSamples = numSamples;
}
}
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const MPT_RESTRICT inBuffer, const uint32 posLo)
{
if(--remainingSamples == 0)
subIncrement = {};
SamplePosition pos(0, posLo);
// First, process steps of full length (one Amiga clock interval)
for(int step = numSteps; step > 0; step--)
@ -75,26 +86,26 @@ struct AmigaBlepInterpolation
int32 posInt = pos.GetInt() * Traits::numChannelsIn;
for(int32 i = 0; i < Traits::numChannelsIn; i++)
inSample += Traits::Convert(inBuffer[posInt + i]);
paula->InputSample(static_cast<int16>(inSample / (4 * Traits::numChannelsIn)));
paula->Clock(Paula::MINIMUM_INTERVAL);
paula.InputSample(static_cast<int16>(inSample / (4 * Traits::numChannelsIn)));
paula.Clock(Paula::MINIMUM_INTERVAL);
pos += subIncrement;
}
paula->remainder += paula->stepRemainder;
paula.remainder += paula.stepRemainder;
// Now, process any remaining integer clock amount < MINIMUM_INTERVAL
uint32 remainClocks = paula->remainder.GetInt();
uint32 remainClocks = paula.remainder.GetInt();
if(remainClocks)
{
typename Traits::output_t inSample = 0;
int32 posInt = pos.GetInt() * Traits::numChannelsIn;
for(int32 i = 0; i < Traits::numChannelsIn; i++)
inSample += Traits::Convert(inBuffer[posInt + i]);
paula->InputSample(static_cast<int16>(inSample / (4 * Traits::numChannelsIn)));
paula->Clock(remainClocks);
paula->remainder.RemoveInt();
paula.InputSample(static_cast<int16>(inSample / (4 * Traits::numChannelsIn)));
paula.Clock(remainClocks);
paula.remainder.RemoveInt();
}
auto out = paula->OutputSample(*WinSincIntegral);
auto out = paula.OutputSample(WinSincIntegral);
for(int i = 0; i < Traits::numChannelsOut; i++)
outSample[i] = out;
}
@ -104,9 +115,7 @@ struct AmigaBlepInterpolation
template<class Traits>
struct LinearInterpolation
{
MPT_FORCEINLINE void Start(const ModChannel &, const CResampler &) { }
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE LinearInterpolation(const ModChannel &, const CResampler &, unsigned int) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const MPT_RESTRICT inBuffer, const uint32 posLo)
{
@ -127,8 +136,7 @@ struct LinearInterpolation
template<class Traits>
struct FastSincInterpolation
{
MPT_FORCEINLINE void Start(const ModChannel &, const CResampler &) { }
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE FastSincInterpolation(const ModChannel &, const CResampler &, unsigned int) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const MPT_RESTRICT inBuffer, const uint32 posLo)
{
@ -152,7 +160,7 @@ struct PolyphaseInterpolation
{
const SINC_TYPE *sinc;
MPT_FORCEINLINE void Start(const ModChannel &chn, const CResampler &resampler)
MPT_FORCEINLINE PolyphaseInterpolation(const ModChannel &chn, const CResampler &resampler, unsigned int)
{
#ifdef MODPLUG_TRACKER
// Otherwise causes "warning C4100: 'resampler' : unreferenced formal parameter"
@ -164,8 +172,6 @@ struct PolyphaseInterpolation
(((chn.increment > SamplePosition(0x180000000ll)) || (chn.increment < SamplePosition(-0x180000000ll))) ? resampler.gDownsample2x : resampler.gDownsample13x) : resampler.gKaiserSinc);
}
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const MPT_RESTRICT inBuffer, const uint32 posLo)
{
static_assert(static_cast<int>(Traits::numChannelsIn) <= static_cast<int>(Traits::numChannelsOut), "Too many input channels");
@ -192,13 +198,11 @@ struct FIRFilterInterpolation
{
const int16 *WFIRlut;
MPT_FORCEINLINE void Start(const ModChannel &, const CResampler &resampler)
MPT_FORCEINLINE FIRFilterInterpolation(const ModChannel &, const CResampler &resampler, unsigned int)
{
WFIRlut = resampler.m_WindowedFIR.lut;
}
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const MPT_RESTRICT inBuffer, const uint32 posLo)
{
static_assert(static_cast<int>(Traits::numChannelsIn) <= static_cast<int>(Traits::numChannelsOut), "Too many input channels");
@ -230,30 +234,30 @@ struct NoRamp
{
typename Traits::output_t lVol, rVol;
MPT_FORCEINLINE void Start(const ModChannel &chn)
MPT_FORCEINLINE NoRamp(const ModChannel &chn)
{
lVol = chn.leftVol;
rVol = chn.rightVol;
}
MPT_FORCEINLINE void End(const ModChannel &) { }
};
struct Ramp
{
ModChannel &channel;
int32 lRamp, rRamp;
MPT_FORCEINLINE void Start(const ModChannel &chn)
MPT_FORCEINLINE Ramp(ModChannel &chn)
: channel{chn}
{
lRamp = chn.rampLeftVol;
rRamp = chn.rampRightVol;
}
MPT_FORCEINLINE void End(ModChannel &chn)
MPT_FORCEINLINE ~Ramp()
{
chn.rampLeftVol = lRamp; chn.leftVol = lRamp >> VOLUMERAMPPRECISION;
chn.rampRightVol = rRamp; chn.rightVol = rRamp >> VOLUMERAMPPRECISION;
channel.rampLeftVol = lRamp; channel.leftVol = lRamp >> VOLUMERAMPPRECISION;
channel.rampRightVol = rRamp; channel.rightVol = rRamp >> VOLUMERAMPPRECISION;
}
};
@ -331,8 +335,7 @@ struct MixStereoRamp : public Ramp
template<class Traits>
struct NoFilter
{
MPT_FORCEINLINE void Start(const ModChannel &) { }
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE NoFilter(const ModChannel &) { }
MPT_FORCEINLINE void operator() (const typename Traits::outbuf_t &, const ModChannel &) { }
};
@ -342,10 +345,12 @@ struct NoFilter
template<class Traits>
struct ResonantFilter
{
ModChannel &channel;
// Filter history
typename Traits::output_t fy[Traits::numChannelsIn][2];
MPT_FORCEINLINE void Start(const ModChannel &chn)
MPT_FORCEINLINE ResonantFilter(ModChannel &chn)
: channel{chn}
{
for(int i = 0; i < Traits::numChannelsIn; i++)
{
@ -354,12 +359,12 @@ struct ResonantFilter
}
}
MPT_FORCEINLINE void End(ModChannel &chn)
MPT_FORCEINLINE ~ResonantFilter()
{
for(int i = 0; i < Traits::numChannelsIn; i++)
{
chn.nFilter_Y[i][0] = fy[i][0];
chn.nFilter_Y[i][1] = fy[i][1];
channel.nFilter_Y[i][0] = fy[i][0];
channel.nFilter_Y[i][1] = fy[i][1];
}
}

View File

@ -353,7 +353,7 @@ bool CSoundFile::ReadDBM(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = U_("DigiBooster Pro");
m_modFormat.type = U_("dbm");
m_modFormat.madeWithTracker = MPT_UFORMAT("DigiBooster Pro {}.{}")(mpt::ufmt::hex(fileHeader.trkVerHi), mpt::ufmt::hex(fileHeader.trkVerLo));
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
// Name chunk
FileReader nameChunk = chunks.GetChunk(DBMChunk::idNAME);
@ -380,7 +380,7 @@ bool CSoundFile::ReadDBM(FileReader &file, ModLoadingFlags loadFlags)
if(Order.AddSequence() == SEQUENCEINDEX_INVALID)
break;
}
Order().SetName(mpt::ToUnicode(mpt::Charset::ISO8859_1, name));
Order().SetName(mpt::ToUnicode(mpt::Charset::Amiga_no_C1, name));
ReadOrderFromFile<uint16be>(Order(), songChunk, numOrders);
#else
const ORDERINDEX startIndex = Order().GetLength();

View File

@ -129,7 +129,7 @@ bool CSoundFile::ReadDIGI(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = U_("DigiBooster");
m_modFormat.type = U_("digi");
m_modFormat.madeWithTracker = MPT_UFORMAT("Digi Booster {}.{}")(fileHeader.versionInt >> 4, fileHeader.versionInt & 0x0F);
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
ReadOrderFromArray(Order(), fileHeader.orders, fileHeader.lastOrdIndex + 1);

View File

@ -604,7 +604,7 @@ bool CSoundFile::ReadDSym(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = MPT_UFORMAT("Digital Symphony v{}")(fileHeader.version);
m_modFormat.type = U_("dsym"); // RISC OS doesn't use file extensions but this is a common abbreviation used for this tracker
m_modFormat.madeWithTracker = U_("Digital Symphony");
m_modFormat.charset = mpt::Charset::ISO8859_1; // Close enough (RISC OS uses slightly customized variant)
m_modFormat.charset = mpt::Charset::RISC_OS;
return true;
}

View File

@ -599,7 +599,7 @@ bool CSoundFile::ReadDTM(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = U_("Digital Tracker");
m_modFormat.type = U_("dtm");
m_modFormat.madeWithTracker = std::move(tracker);
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
return true;
}

View File

@ -1145,7 +1145,7 @@ bool CSoundFile::ReadMED(FileReader &file, ModLoadingFlags loadFlags)
}
}
if(playSeq.name[0])
order.SetName(mpt::ToUnicode(mpt::Charset::ISO8859_1, mpt::String::ReadAutoBuf(playSeq.name)));
order.SetName(mpt::ToUnicode(mpt::Charset::Amiga_no_C1, mpt::String::ReadAutoBuf(playSeq.name)));
// Play commands (jump / stop)
if(playSeq.commandTableOffset > 0 && file.Seek(playSeq.commandTableOffset))
@ -1193,7 +1193,7 @@ bool CSoundFile::ReadMED(FileReader &file, ModLoadingFlags loadFlags)
{
file.ReadString<mpt::String::maybeNullTerminated>(m_songName, expData.songNameLength);
if(numSongs > 1)
order.SetName(mpt::ToUnicode(mpt::Charset::ISO8859_1, m_songName));
order.SetName(mpt::ToUnicode(mpt::Charset::Amiga_no_C1, m_songName));
}
if(expData.annoLength > 1 && file.Seek(expData.annoText))
{
@ -1432,7 +1432,7 @@ bool CSoundFile::ReadMED(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = MPT_UFORMAT("OctaMED (MMD{})")(version);
m_modFormat.type = MPT_USTRING("med");
m_modFormat.madeWithTracker = madeWithTracker;
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
return true;
}

View File

@ -921,7 +921,8 @@ bool CSoundFile::ReadMO3(FileReader &file, ModLoadingFlags loadFlags)
}
}
ReadOrderFromFile<uint8>(Order(), musicChunk, fileHeader.numOrders, 0xFF, 0xFE);
const bool hasOrderSeparators = !(m_nType & (MOD_TYPE_MOD | MOD_TYPE_XM));
ReadOrderFromFile<uint8>(Order(), musicChunk, fileHeader.numOrders, hasOrderSeparators ? 0xFF : uint16_max, hasOrderSeparators ? 0xFE : uint16_max);
// Track assignments for all patterns
FileReader trackChunk = musicChunk.ReadChunk(fileHeader.numPatterns * fileHeader.numChannels * sizeof(uint16));
@ -1967,7 +1968,7 @@ bool CSoundFile::ReadMO3(FileReader &file, ModLoadingFlags loadFlags)
if(m_dwLastSavedWithVersion)
m_modFormat.charset = mpt::Charset::Windows1252;
else if(GetType() == MOD_TYPE_MOD)
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
else
m_modFormat.charset = mpt::Charset::CP437;

View File

@ -1318,7 +1318,7 @@ bool CSoundFile::ReadMOD(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.type = U_("mod");
if(modMagicResult.madeWithTracker)
m_modFormat.madeWithTracker = modMagicResult.madeWithTracker;
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
return true;
}
@ -1819,7 +1819,7 @@ bool CSoundFile::ReadM15(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = U_("Soundtracker");
m_modFormat.type = U_("stk");
m_modFormat.madeWithTracker = madeWithTracker;
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
// Reading samples
if(loadFlags & loadSampleData)
@ -1908,13 +1908,13 @@ bool CSoundFile::ReadICE(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = U_("MnemoTroN SoundTracker");
m_modFormat.type = U_("st26");
m_modFormat.madeWithTracker = U_("SoundTracker 2.6");
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
} else if(IsMagic(magic, "IT10"))
{
m_modFormat.formatName = U_("Ice Tracker");
m_modFormat.type = U_("ice");
m_modFormat.madeWithTracker = U_("Ice Tracker 1.0 / 1.1");
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
} else
{
return false;
@ -2148,7 +2148,7 @@ bool CSoundFile::ReadPT36(FileReader &file, ModLoadingFlags loadFlags)
chunk.Skip(4);
if(chunk.ReadMagic("PT") && iffHead.chunksize > 6)
{
chunk.ReadString<mpt::String::maybeNullTerminated>(version, mpt::Charset::ISO8859_1, iffHead.chunksize - 6);
chunk.ReadString<mpt::String::maybeNullTerminated>(version, mpt::Charset::Amiga_no_C1, iffHead.chunksize - 6);
}
break;
@ -2204,7 +2204,7 @@ bool CSoundFile::ReadPT36(FileReader &file, ModLoadingFlags loadFlags)
std::string author;
commentChunk.ReadString<mpt::String::maybeNullTerminated>(author, 32);
if(author != "UNNAMED AUTHOR")
m_songArtist = mpt::ToUnicode(mpt::Charset::ISO8859_1, author);
m_songArtist = mpt::ToUnicode(mpt::Charset::Amiga_no_C1, author);
if(!commentChunk.NoBytesLeft())
{
m_songMessage.ReadFixedLineLength(commentChunk, commentChunk.BytesLeft(), 40, 0);

View File

@ -342,7 +342,7 @@ bool CSoundFile::ReadOKT(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = U_("Oktalyzer");
m_modFormat.type = U_("okt");
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
// Go through IFF chunks...
while(file.CanRead(sizeof(OktIffChunk)))

View File

@ -475,7 +475,7 @@ bool CSoundFile::ReadSFX(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = m_nSamples == 15 ? MPT_UFORMAT("SoundFX 1.{}")(version) : U_("SoundFX 2.0 / MultiMedia Sound");
m_modFormat.type = m_nSamples == 15 ? UL_("sfx") : UL_("sfx2");
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
return true;
}

View File

@ -258,7 +258,7 @@ bool CSoundFile::ReadSTP(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.formatName = MPT_UFORMAT("Soundtracker Pro II v{}")(fileHeader.version);
m_modFormat.type = U_("stp");
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
m_nChannels = 4;
m_nSamples = 0;

View File

@ -1231,7 +1231,7 @@ bool CSoundFile::ReadSymMOD(FileReader &file, ModLoadingFlags loadFlags)
if(symInst.IsEmpty() || symInst.IsVirtual())
continue;
auto filename = mpt::PathString::FromUnicode(mpt::ToUnicode(mpt::Charset::ISO8859_1, symInst.GetName()));
auto filename = mpt::PathString::FromUnicode(mpt::ToUnicode(mpt::Charset::Amiga_no_C1, symInst.GetName()));
if(file.GetOptionalFileName())
filename = file.GetOptionalFileName()->GetPath() + filename.GetFullFileName();
@ -1939,7 +1939,7 @@ bool CSoundFile::ReadSymMOD(FileReader &file, ModLoadingFlags loadFlags)
m_modFormat.madeWithTracker = U_("Symphonie Pro");
else
m_modFormat.madeWithTracker = U_("Symphonie Pro 256");
m_modFormat.charset = mpt::Charset::ISO8859_1;
m_modFormat.charset = mpt::Charset::Amiga_no_C1;
return true;
}

View File

@ -245,11 +245,11 @@ CString MIDIMacroConfig::GetFixedMacroName(FixedMacro macroType) const
}
int MIDIMacroConfig::MacroToPlugParam(uint32 macroIndex) const
PlugParamIndex MIDIMacroConfig::MacroToPlugParam(uint32 macroIndex) const
{
const std::string macro = SFx[macroIndex].NormalizedString();
int code = 0;
PlugParamIndex code = 0;
const char *param = macro.c_str();
param += 4;
if ((param[0] >= '0') && (param[0] <= '9')) code = (param[0] - '0') << 4; else

View File

@ -198,7 +198,7 @@ public:
CString GetFixedMacroName(FixedMacro macroType) const;
// Extract information from a parametered macro string.
int MacroToPlugParam(uint32 macroIndex) const;
PlugParamIndex MacroToPlugParam(uint32 macroIndex) const;
int MacroToMidiCC(uint32 macroIndex) const;
// Check if any macro can automate a given plugin parameter

View File

@ -41,8 +41,7 @@ struct MixerTraits
template<class Traits>
struct NoInterpolation
{
MPT_FORCEINLINE void Start(const ModChannel &, const CResampler &) { }
MPT_FORCEINLINE void End(const ModChannel &) { }
MPT_FORCEINLINE NoInterpolation(const ModChannel &, const CResampler &, unsigned int) { }
MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32)
{
@ -72,14 +71,9 @@ static void SampleLoop(ModChannel &chn, const CResampler &resampler, typename Tr
ModChannel &c = chn;
const typename Traits::input_t * MPT_RESTRICT inSample = static_cast<const typename Traits::input_t *>(c.pCurrentSample);
InterpolationFunc interpolate;
FilterFunc filter;
MixFunc mix;
// Do initialisation if necessary
interpolate.Start(c, resampler);
filter.Start(c);
mix.Start(c);
InterpolationFunc interpolate{c, resampler, numSamples};
FilterFunc filter{c};
MixFunc mix{c};
unsigned int samples = numSamples;
SamplePosition smpPos = c.position; // Fixed-point sample position
@ -96,10 +90,6 @@ static void SampleLoop(ModChannel &chn, const CResampler &resampler, typename Tr
smpPos += increment;
}
mix.End(c);
filter.End(c);
interpolate.End(c);
c.position = smpPos;
}

View File

@ -491,6 +491,10 @@ std::vector<GetLengthType> CSoundFile::GetLength(enmGetLengthResetMode adjustMod
break;
case CMD_S3MCMDEX:
if(!chn.rowCommand.param && (GetType() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT)))
chn.rowCommand.param = chn.nOldCmdEx;
else
chn.nOldCmdEx = static_cast<ModCommand::PARAM>(chn.rowCommand.param);
if((p->param & 0xF0) == 0x60)
{
// Fine Pattern Delay
@ -885,6 +889,11 @@ std::vector<GetLengthType> CSoundFile::GetLength(enmGetLengthResetMode adjustMod
}
break;
}
if(m_playBehaviour[kST3EffectMemory] && param != 0)
{
UpdateS3MEffectMemory(chn, param);
}
}
// Interpret F00 effect in XM files as "stop song"
@ -3303,10 +3312,6 @@ bool CSoundFile::ProcessEffects()
// S3M/IT Sxx Extended Commands
case CMD_S3MCMDEX:
if(m_playBehaviour[kST3EffectMemory] && param == 0)
{
param = chn.nArpeggio; // S00 uses the last non-zero effect parameter as memory, like other effects including Arpeggio, so we "borrow" our memory there.
}
ExtendedS3MCommands(nChn, static_cast<ModCommand::PARAM>(param));
break;
@ -3578,9 +3583,9 @@ void CSoundFile::UpdateS3MEffectMemory(ModChannel &chn, ModCommand::PARAM param)
chn.nTremorParam = param; // Ixy
chn.nArpeggio = param; // Jxy
chn.nRetrigParam = param; // Qxy
chn.nTremoloDepth = (param & 0x0F) << 2; // Rxy
chn.nTremoloSpeed = (param >> 4) & 0x0F; // Rxy
// Sxy is not handled here.
chn.nTremoloDepth = (param & 0x0F) << 2; // Rxy
chn.nTremoloSpeed = (param >> 4) & 0x0F; // Rxy
chn.nOldCmdEx = param; // Sxy
}
@ -5144,13 +5149,16 @@ void CSoundFile::SendMIDIData(PlayState &playState, CHANNELINDEX nChn, bool isSm
if(plug > 0 && plug <= MAX_MIXPLUGINS && param < 0x80)
{
plug--;
const float newRatio = (127 - param) / 127.0f;
if(localOnly)
playState.m_midiMacroEvaluationResults->pluginDryWetRatio[plug] = newRatio;
else if(!isSmooth)
m_MixPlugins[plug].fDryRatio = newRatio;
else
m_MixPlugins[plug].fDryRatio = CalculateSmoothParamChange(playState, m_MixPlugins[plug].fDryRatio, newRatio);
if(IMixPlugin* pPlugin = m_MixPlugins[plug].pMixPlugin; pPlugin)
{
const float newRatio = (127 - param) / 127.0f;
if(localOnly)
playState.m_midiMacroEvaluationResults->pluginDryWetRatio[plug] = newRatio;
else if(!isSmooth)
pPlugin->SetDryRatio(newRatio);
else
pPlugin->SetDryRatio(CalculateSmoothParamChange(playState, m_MixPlugins[plug].fDryRatio, newRatio));
}
}
} else if((macroCode & 0x80) || isExtended)
{
@ -5159,8 +5167,7 @@ void CSoundFile::SendMIDIData(PlayState &playState, CHANNELINDEX nChn, bool isSm
if(plug > 0 && plug <= MAX_MIXPLUGINS && param < 0x80)
{
plug--;
IMixPlugin *pPlugin = m_MixPlugins[plug].pMixPlugin;
if(pPlugin)
if(IMixPlugin *pPlugin = m_MixPlugins[plug].pMixPlugin; pPlugin)
{
const PlugParamIndex plugParam = isExtended ? (0x80 + macroCode) : (macroCode & 0x7F);
const PlugParamValue value = param / 127.0f;
@ -5189,8 +5196,7 @@ void CSoundFile::SendMIDIData(PlayState &playState, CHANNELINDEX nChn, bool isSm
if(plug > 0 && plug <= MAX_MIXPLUGINS)
{
IMixPlugin *pPlugin = m_MixPlugins[plug - 1].pMixPlugin;
if (pPlugin != nullptr)
if(IMixPlugin *pPlugin = m_MixPlugins[plug - 1].pMixPlugin; pPlugin != nullptr)
{
if(macro[0] == 0xF0)
{
@ -5236,7 +5242,7 @@ void CSoundFile::SendMIDINote(CHANNELINDEX chn, uint16 note, uint16 volume)
}
void CSoundFile::ProcessSampleOffset(ModChannel& chn, CHANNELINDEX nChn, const PlayState& playState) const
void CSoundFile::ProcessSampleOffset(ModChannel &chn, CHANNELINDEX nChn, const PlayState &playState) const
{
const ModCommand &m = chn.rowCommand;
uint32 extendedRows = 0;

View File

@ -618,9 +618,10 @@ protected:
public:
#ifdef MODPLUG_TRACKER
std::bitset<MAX_BASECHANNELS> m_bChannelMuteTogglePending;
std::bitset<MAX_MIXPLUGINS> m_pluginDryWetRatioChanged; // Dry/Wet ratio was changed by playback code (e.g. through MIDI macro), need to update UI
std::vector<PatternCuePoint> *m_PatternCuePoints = nullptr; // For WAV export (writing pattern positions to file)
std::vector<SmpLength> *m_SamplePlayLengths = nullptr; // For storing the maximum play length of each sample for automatic sample trimming
std::vector<PatternCuePoint> *m_PatternCuePoints = nullptr; // For WAV export (writing pattern positions to file)
std::vector<SmpLength> *m_SamplePlayLengths = nullptr; // For storing the maximum play length of each sample for automatic sample trimming
#endif // MODPLUG_TRACKER
std::unique_ptr<OPL> m_opl;

View File

@ -2634,8 +2634,8 @@ void CSoundFile::ProcessMidiOut(CHANNELINDEX nChn)
switch(pIns->pluginVolumeHandling)
{
case PLUGIN_VOLUMEHANDLING_DRYWET:
if(hasVolCommand) pPlugin->SetDryRatio(2 * vol);
else pPlugin->SetDryRatio(2 * defaultVolume);
if(hasVolCommand) pPlugin->SetDryRatio(1.0f - (2 * vol) / 127.0f);
else pPlugin->SetDryRatio(1.0f - (2 * defaultVolume) / 127.0f);
break;
case PLUGIN_VOLUMEHANDLING_MIDI:
if(hasVolCommand) pPlugin->MidiCC(MIDIEvents::MIDICC_Volume_Coarse, std::min(uint8(127), static_cast<uint8>(2 * vol)), nChn);

View File

@ -84,7 +84,7 @@ void ModCommand::ExtendedMODtoS3MEffect()
case 0x70: param = (param & 0x03) | 0x40; break;
case 0x90: command = CMD_RETRIG; param = (param & 0x0F); break;
case 0xA0: if(param & 0x0F) { command = CMD_VOLUMESLIDE; param = (param << 4) | 0x0F; } else command = CMD_NONE; break;
case 0xB0: if(param & 0x0F) { command = CMD_VOLUMESLIDE; param = 0xF0 | std::min(param, PARAM(0x0E)); } else command = CMD_NONE; break;
case 0xB0: if(param & 0x0F) { command = CMD_VOLUMESLIDE; param = 0xF0 | static_cast<PARAM>(std::min(param & 0x0F, 0x0E)); } else command = CMD_NONE; break;
case 0xC0: if(param == 0xC0) { command = CMD_NONE; note = NOTE_NOTECUT; } break; // this does different things in IT and ST3
case 0xD0: if(param == 0xD0) { command = CMD_NONE; } break; // ditto
// rest are the same or handled elsewhere

View File

@ -51,10 +51,12 @@ protected:
std::vector<std::byte> m_chunkData;
static constexpr PlugParamIndex INVALID_OUTPUT_PARAM = uint32_max;
// LFO parameters
float m_amplitude = 0.5f, m_offset = 0.5f, m_frequency = 0.290241f;
LFOWaveform m_waveForm = kSine;
PlugParamIndex m_outputParam = int32_max;
PlugParamIndex m_outputParam = INVALID_OUTPUT_PARAM;
bool m_tempoSync = false, m_polarity = false, m_bypassed = false, m_outputToCC = false, m_oneshot = false;
// LFO state

View File

@ -200,10 +200,12 @@ void IMixPlugin::RecalculateGain()
}
void IMixPlugin::SetDryRatio(uint32 param)
void IMixPlugin::SetDryRatio(float dryRatio)
{
param = std::min(param, uint32(127));
m_pMixStruct->fDryRatio = 1.0f - (param / 127.0f);
m_pMixStruct->fDryRatio = std::clamp(dryRatio, 0.0f, 1.0f);
#ifdef MODPLUG_TRACKER
m_SndFile.m_pluginDryWetRatioChanged.set(m_nSlot);
#endif // MODPLUG_TRACKER
}
@ -497,7 +499,7 @@ void IMixPlugin::SaveAllParameters()
m_pMixStruct->defaultProgram = -1;
// Default implementation: Save all parameter values
PlugParamIndex numParams = std::min(GetNumParameters(), static_cast<int32>((std::numeric_limits<uint32>::max() - sizeof(uint32)) / sizeof(IEEE754binary32LE)));
PlugParamIndex numParams = std::min(GetNumParameters(), static_cast<PlugParamIndex>((std::numeric_limits<uint32>::max() - sizeof(uint32)) / sizeof(IEEE754binary32LE)));
uint32 nLen = numParams * sizeof(IEEE754binary32LE);
if (!nLen) return;
nLen += sizeof(uint32);

View File

@ -109,7 +109,7 @@ public:
// Returns the next instance of the same plugin
inline IMixPlugin *GetNextInstance() const { return m_pNext; }
void SetDryRatio(uint32 param);
void SetDryRatio(float dryRatio);
bool IsBypassed() const;
void RecalculateGain();
// Query output latency from host (in seconds)

View File

@ -643,9 +643,6 @@ bool CVstPluginManager::RemovePlugin(VSTPluginLib *pFactory)
bool CVstPluginManager::CreateMixPlugin(SNDMIXPLUGIN &mixPlugin, CSoundFile &sndFile)
{
VSTPluginLib *pFound = nullptr;
#ifdef MODPLUG_TRACKER
mixPlugin.SetAutoSuspend(TrackerSettings::Instance().enableAutoSuspend);
#endif // MODPLUG_TRACKER
// Find plugin in library
enum PlugMatchQuality

View File

@ -22,7 +22,7 @@ OPENMPT_NAMESPACE_BEGIN
////////////////////////////////////////////////////////////////////
// Mix Plugins
using PlugParamIndex = int32;
using PlugParamIndex = uint32;
using PlugParamValue = float;
struct SNDMIXPLUGINSTATE;
@ -37,21 +37,21 @@ struct SNDMIXPLUGININFO
// dwInputRouting flags
enum RoutingFlags
{
irApplyToMaster = 0x01, // Apply to master mix
irBypass = 0x02, // Bypass effect
irWetMix = 0x04, // Wet Mix (dry added)
irExpandMix = 0x08, // [0%,100%] -> [-200%,200%]
irAutoSuspend = 0x10, // Plugin will automatically suspend on silence
irApplyToMaster = 0x01, // Apply to master mix
irBypass = 0x02, // Bypass effect
irWetMix = 0x04, // Wet Mix (dry added)
irExpandMix = 0x08, // [0%,100%] -> [-200%,200%]
irAutoSuspend = 0x10, // Plugin will automatically suspend on silence
};
int32le dwPluginId1; // Plugin type (kEffectMagic, kDmoMagic, kBuzzMagic)
int32le dwPluginId2; // Plugin unique ID
uint8le routingFlags; // See RoutingFlags
int32le dwPluginId1; // Plugin type (kEffectMagic, kDmoMagic, kBuzzMagic)
int32le dwPluginId2; // Plugin unique ID
uint8le routingFlags; // See RoutingFlags
uint8le mixMode;
uint8le gain; // Divide by 10 to get real gain
uint8le gain; // Divide by 10 to get real gain
uint8le reserved;
uint32le dwOutputRouting; // 0 = send to master 0x80 + x = send to plugin x
uint32le dwReserved[4]; // Reserved for routing info
uint32le dwOutputRouting; // 0 = send to master 0x80 + x = send to plugin x
uint32le dwReserved[4]; // Reserved for routing info
mpt::modecharbuf<32, mpt::String::nullTerminated> szName; // User-chosen plugin display name - this is locale ANSI!
mpt::modecharbuf<64, mpt::String::nullTerminated> szLibraryName; // original DLL name - this is UTF-8!

View File

@ -36,7 +36,7 @@ protected:
kChorusNumParameters
};
float m_param[kChorusNumParameters];
std::array<float, kChorusNumParameters> m_param;
// Calculated parameters
float m_waveShapeMin, m_waveShapeMax, m_waveShapeVal;

View File

@ -31,7 +31,7 @@ protected:
kCompNumParameters
};
float m_param[kCompNumParameters];
std::array<float, kCompNumParameters> m_param;
// Calculated parameters and coefficients
float m_gain;

View File

@ -141,9 +141,11 @@ CString Distortion::GetParamLabel(PlugParamIndex param)
{
switch(param)
{
case kDistGain: return _T("dB");
case kDistGain:
return _T("dB");
case kDistPreLowpassCutoff:
case kDistPostEQCenterFrequency:
case kDistPostEQBandwidth:
return _T("Hz");
}
return CString();
@ -183,19 +185,8 @@ void Distortion::RecalculateDistortionParams()
// Distortion
float edge = 2.0f + m_param[kDistEdge] * 29.0f;
m_edge = static_cast<uint8>(edge); // 2...31 shifted bits
// Work out the magical shift factor (= floor(log2(edge)) + 1 == index of highest bit + 1)
uint8 shift;
if(m_edge <= 3)
shift = 2;
else if(m_edge <= 7)
shift = 3;
else if(m_edge <= 15)
shift = 4;
else
shift = 5;
m_shift = shift;
m_edge = static_cast<uint8>(edge); // 2...31 shifted bits
m_shift = mpt::bit_width(m_edge);
static constexpr float LogNorm[32] =
{

View File

@ -30,7 +30,7 @@ protected:
kDistNumParameters
};
float m_param[kDistNumParameters];
std::array<float, kDistNumParameters> m_param;
// Pre-EQ coefficients
float m_preEQz1[2], m_preEQb1, m_preEQa0;

View File

@ -109,7 +109,7 @@ void Gargle::Process(float *pOutL, float *pOutR, uint32 numFrames)
PlugParamValue Gargle::GetParameter(PlugParamIndex index)
{
if(index < kEqNumParameters)
if(index < kGargleNumParameters)
{
return m_param[index];
}
@ -119,7 +119,7 @@ PlugParamValue Gargle::GetParameter(PlugParamIndex index)
void Gargle::SetParameter(PlugParamIndex index, PlugParamValue value)
{
if(index < kEqNumParameters)
if(index < kGargleNumParameters)
{
value = mpt::safe_clamp(value, 0.0f, 1.0f);
if(index == kGargleWaveShape)

View File

@ -24,10 +24,10 @@ protected:
{
kGargleRate = 0,
kGargleWaveShape,
kEqNumParameters
kGargleNumParameters
};
float m_param[kEqNumParameters];
std::array<float, kGargleNumParameters> m_param;
uint32 m_period, m_periodHalf, m_counter; // In frames
@ -49,7 +49,7 @@ public:
int32 GetCurrentProgram() override { return 0; }
void SetCurrentProgram(int32) override { }
PlugParamIndex GetNumParameters() const override { return kEqNumParameters; }
PlugParamIndex GetNumParameters() const override { return kGargleNumParameters; }
PlugParamValue GetParameter(PlugParamIndex index) override;
void SetParameter(PlugParamIndex index, PlugParamValue value) override;

View File

@ -309,7 +309,7 @@ int32 I3DL2Reverb::GetNumPrograms() const
void I3DL2Reverb::SetCurrentProgram(int32 program)
{
#ifdef MODPLUG_TRACKER
if(program < NUM_REVERBTYPES)
if(program < static_cast<int32>(NUM_REVERBTYPES))
{
m_program = program;
const auto &preset = *GetReverbPreset(m_program);

View File

@ -63,7 +63,7 @@ protected:
float Get() const;
};
float m_param[kI3DL2ReverbNumParameters];
std::array<float, kI3DL2ReverbNumParameters> m_param;
int32 m_program = 0;
// Calculated parameters

View File

@ -28,7 +28,7 @@ protected:
kEqNumParameters
};
float m_param[kEqNumParameters];
std::array<float, kEqNumParameters> m_param;
// Equalizer coefficients
float b0DIVa0, b1DIVa0, b2DIVa0, a1DIVa0, a2DIVa0;

View File

@ -122,7 +122,7 @@ void WavesReverb::Process(float *pOutL, float *pOutR, uint32 numFrames)
PlugParamValue WavesReverb::GetParameter(PlugParamIndex index)
{
if(index < kDistNumParameters)
if(index < kRvbNumParameters)
{
return m_param[index];
}
@ -132,7 +132,7 @@ PlugParamValue WavesReverb::GetParameter(PlugParamIndex index)
void WavesReverb::SetParameter(PlugParamIndex index, PlugParamValue value)
{
if(index < kDistNumParameters)
if(index < kRvbNumParameters)
{
value = mpt::safe_clamp(value, 0.0f, 1.0f);
m_param[index] = value;

View File

@ -26,16 +26,16 @@ protected:
kRvbReverbMix,
kRvbReverbTime,
kRvbHighFreqRTRatio,
kDistNumParameters
kRvbNumParameters
};
float m_param[kDistNumParameters];
std::array<float, kRvbNumParameters> m_param;
// Parameters and coefficients
float m_dryFactor;
float m_wetFactor;
float m_coeffs[10];
uint32 m_delay[6];
std::array<float, 10> m_coeffs;
std::array<uint32, 6> m_delay;
// State
struct ReverbState
@ -64,7 +64,7 @@ public:
int32 GetCurrentProgram() override { return 0; }
void SetCurrentProgram(int32) override { }
PlugParamIndex GetNumParameters() const override { return kDistNumParameters; }
PlugParamIndex GetNumParameters() const override { return kRvbNumParameters; }
PlugParamValue GetParameter(PlugParamIndex index) override;
void SetParameter(PlugParamIndex index, PlugParamValue value) override;

View File

@ -1,14 +1,17 @@
# clang-format 13
Language: Cpp
Standard: c++17
Standard: c++20
AccessModifierOffset: -4 #?
AlignAfterOpenBracket: AlwaysBreak
AlignArrayOfStructures: Left
AlignConsecutiveAssignments: false
AlignConsecutiveBitFields: false
AlignConsecutiveDeclarations: false
AlignConsecutiveMacros: true
AlignEscapedNewlines: DontAlign
AlignOperands: DontAlign
AlignOperands: AlignAfterOperator
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
@ -23,8 +26,10 @@ AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros: []
BinPackArguments: true
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
@ -47,6 +52,7 @@ BraceWrapping:
#BreakAfterJavaFieldAnnotations
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BreakBeforeConceptDeclarations: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeComma
@ -60,17 +66,22 @@ ContinuationIndentWidth: 4 #?
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
EmptyLineAfterAccessModifier: Leave
EmptyLineBeforeAccessModifier: Leave
FixNamespaceComments: true
ForEachMacros: []
IfMacros: ['MPT_MAYBE_CONSTANT_IF']
IncludeBlocks: Preserve
IncludeCategories: [] #?
IncludeIsMainRegex: '' #?
IncludeIsMainSourceRegex: '' #?
IndentAccessModifiers: false
IndentCaseLabels: true
IndentCaseBlocks: true
IndentExternBlock: NoIndent
IndentGotoLabels: false
IndentPPDirectives: None
#IndentRequiresClause: true
InsertTrailingCommas: None
#BeforeHash
IndentWidth: 4
@ -79,6 +90,7 @@ IndentWrappedFunctionNames: true
#JavaScriptQuotes
#JavaScriptWrapImports
KeepEmptyLinesAtTheStartOfBlocks: true
LambdaBodyIndentation: OuterScope
MacroBlockBegin: '^MPT_TEST_GROUP_BEGIN$' #?
MacroBlockEnd: '^MPT_TEST_GROUP_END$' #?
MaxEmptyLinesToKeep: 5
@ -96,16 +108,23 @@ NamespaceMacros: [] #?
#PenaltyBreakString
#PenaltyBreakTemplateDeclaration
#PenaltyExcessCharacter
#PenaltyIndentedWhitespace
#PenaltyReturnTypeOnItsOwnLine
PointerAlignment: Middle
PPIndentWidth: -1
#RawStringFormats
ReferenceAlignment: Pointer
ReflowComments: false
ShortNamespaceLines: 1
SortIncludes: false
#SortJavaStaticImport
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
@ -119,8 +138,12 @@ SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
StatementAttributeLikeMacros: []
StatementMacros: [ '_Pragma', '__pragma', 'MPT_WARNING', 'MPT_TEST_GROUP_INLINE_IDENTIFIER', 'MPT_TEST_GROUP_INLINE', 'MPT_TEST_GROUP_STATIC' ] #?
TabWidth: 4
TypenameMacros: [] #?

View File

@ -352,14 +352,13 @@ private:
std::size_t m_offset;
public:
audio_span_with_offset(Taudio_span buffer, std::size_t offsetFrames) noexcept
constexpr audio_span_with_offset(Taudio_span buffer, std::size_t offsetFrames) noexcept
: m_buffer(buffer)
, m_offset(offsetFrames) {
return;
}
sample_type * data() const noexcept {
if (!is_contiguous())
{
if (!is_contiguous()) {
return nullptr;
}
return m_buffer.data() + (size_channels() * m_offset);

View File

@ -112,8 +112,7 @@ constexpr bool endian_is_weird() noexcept {
#endif // !MPT_COMPILER_GENERIC
enum class endian
{
enum class endian {
little = 0x78563412u,
big = 0x12345678u,
weird = 1u,
@ -135,7 +134,9 @@ MPT_FORCEINLINE mpt::endian endian_probe() noexcept {
static_assert(sizeof(endian_probe_type) == 4);
constexpr endian_probe_type endian_probe_big = 0x12345678u;
constexpr endian_probe_type endian_probe_little = 0x78563412u;
const std::array<std::byte, sizeof(endian_probe_type)> probe{{std::byte{0x12}, std::byte{0x34}, std::byte{0x56}, std::byte{0x78}}};
const std::array<std::byte, sizeof(endian_probe_type)> probe{
{std::byte{0x12}, std::byte{0x34}, std::byte{0x56}, std::byte{0x78}}
};
const endian_probe_type test = mpt::bit_cast<endian_probe_type>(probe);
mpt::endian result = mpt::endian::native;
switch (test) {
@ -183,9 +184,9 @@ MPT_FORCEINLINE bool endian_is_weird() noexcept {
#if MPT_CXX_AT_LEAST(20) && !MPT_COMPILER_MSVC && !MPT_CLANG_BEFORE(12, 0, 0)
#if MPT_CXX_AT_LEAST(20) && MPT_MSVC_AT_LEAST(2022, 1) && !MPT_CLANG_BEFORE(12, 0, 0)
// Disabled for VS2022 for now because of
// Disabled for VS2022.0 because of
// <https://developercommunity.visualstudio.com/t/vs2022-cl-193030705-generates-non-universally-avai/1578571>
// / <https://github.com/microsoft/STL/issues/2330> with fix already queued
// (<https://github.com/microsoft/STL/pull/2333>).

View File

@ -50,7 +50,9 @@
#elif defined(_MSC_VER)
#define MPT_COMPILER_MSVC 1
#if (_MSC_VER >= 1930)
#if (_MSC_VER >= 1931)
#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2022, 1)
#elif (_MSC_VER >= 1930)
#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2022, 0)
#elif (_MSC_VER >= 1929)
#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 10)

View File

@ -83,7 +83,10 @@ constexpr bool operator>=(version_info const a, version_info const b) noexcept {
return a.as_tuple() >= b.as_tuple();
}
constexpr inline version_info Version = {{MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH}, MPT_VERSION_BUILD};
constexpr inline version_info Version = {
{MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH},
MPT_VERSION_BUILD
};
} // namespace MPT_INLINE_NS

View File

@ -35,18 +35,18 @@ MPT_TEST_GROUP_INLINE("mpt/base/bit")
#if MPT_CXX_BEFORE(20)
MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian_probe());
#endif
MPT_MAYBE_CONSTANT_IF(mpt::endian_is_little()) {
MPT_MAYBE_CONSTANT_IF (mpt::endian_is_little()) {
MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::little);
MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
MPT_MAYBE_CONSTANT_IF ((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::little);
}
#if MPT_CXX_BEFORE(20)
MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::little);
#endif
}
MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
MPT_MAYBE_CONSTANT_IF (mpt::endian_is_big()) {
MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::big);
MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
MPT_MAYBE_CONSTANT_IF ((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::big);
}
#if MPT_CXX_BEFORE(20)

View File

@ -35,7 +35,8 @@ inline constexpr std::array<mpt::uchar, 64> base64 = {
{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('+'), MPT_UCHAR('/')}};
MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('+'), MPT_UCHAR('/')}
};
template <typename Tbyte>

View File

@ -35,7 +35,8 @@ inline constexpr std::array<mpt::uchar, 64> base64url = {
{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('-'), MPT_UCHAR('_')}};
MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('-'), MPT_UCHAR('_')}
};
template <typename Tbyte>
inline mpt::ustring encode_base64url(mpt::span<Tbyte> src_) {

View File

@ -26,7 +26,8 @@ inline constexpr std::array<mpt::uchar, 16> encode_nibble = {
{MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'),
MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'),
MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('A'), MPT_UCHAR('B'),
MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F')}};
MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F')}
};
inline bool decode_byte(uint8 & byte, mpt::uchar c1, mpt::uchar c2) {

View File

@ -164,10 +164,10 @@ public:
}
MPT_FORCEINLINE uint32 GetInt32() const {
return 0u
| (static_cast<uint32>(bytes[hihi]) << 24)
| (static_cast<uint32>(bytes[hilo]) << 16)
| (static_cast<uint32>(bytes[lohi]) << 8)
| (static_cast<uint32>(bytes[lolo]) << 0);
| (static_cast<uint32>(bytes[hihi]) << 24)
| (static_cast<uint32>(bytes[hilo]) << 16)
| (static_cast<uint32>(bytes[lohi]) << 8)
| (static_cast<uint32>(bytes[lolo]) << 0);
}
MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
return true
@ -220,14 +220,14 @@ public:
}
MPT_FORCEINLINE uint64 GetInt64() const {
return 0u
| (static_cast<uint64>(bytes[hihihi]) << 56)
| (static_cast<uint64>(bytes[hihilo]) << 48)
| (static_cast<uint64>(bytes[hilohi]) << 40)
| (static_cast<uint64>(bytes[hilolo]) << 32)
| (static_cast<uint64>(bytes[lohihi]) << 24)
| (static_cast<uint64>(bytes[lohilo]) << 16)
| (static_cast<uint64>(bytes[lolohi]) << 8)
| (static_cast<uint64>(bytes[lololo]) << 0);
| (static_cast<uint64>(bytes[hihihi]) << 56)
| (static_cast<uint64>(bytes[hihilo]) << 48)
| (static_cast<uint64>(bytes[hilohi]) << 40)
| (static_cast<uint64>(bytes[hilolo]) << 32)
| (static_cast<uint64>(bytes[lohihi]) << 24)
| (static_cast<uint64>(bytes[lohilo]) << 16)
| (static_cast<uint64>(bytes[lolohi]) << 8)
| (static_cast<uint64>(bytes[lololo]) << 0);
}
MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
return true

View File

@ -29,22 +29,20 @@ struct uint24 {
template <typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>
explicit uint24(T other) noexcept {
using Tunsigned = typename std::make_unsigned<T>::type;
MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
MPT_MAYBE_CONSTANT_IF (mpt::endian_is_big()) {
bytes[0] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 16) & 0xff));
bytes[1] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 8) & 0xff));
bytes[2] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 0) & 0xff));
}
else {
} else {
bytes[0] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 0) & 0xff));
bytes[1] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 8) & 0xff));
bytes[2] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 16) & 0xff));
}
}
operator int() const noexcept {
MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
MPT_MAYBE_CONSTANT_IF (mpt::endian_is_big()) {
return (mpt::byte_cast<uint8>(bytes[0]) * 65536) + (mpt::byte_cast<uint8>(bytes[1]) * 256) + mpt::byte_cast<uint8>(bytes[2]);
}
else {
} else {
return (mpt::byte_cast<uint8>(bytes[2]) * 65536) + (mpt::byte_cast<uint8>(bytes[1]) * 256) + mpt::byte_cast<uint8>(bytes[0]);
}
}
@ -59,22 +57,20 @@ struct int24 {
template <typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>
explicit int24(T other) noexcept {
using Tunsigned = typename std::make_unsigned<T>::type;
MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
MPT_MAYBE_CONSTANT_IF (mpt::endian_is_big()) {
bytes[0] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 16) & 0xff));
bytes[1] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 8) & 0xff));
bytes[2] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 0) & 0xff));
}
else {
} else {
bytes[0] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 0) & 0xff));
bytes[1] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 8) & 0xff));
bytes[2] = mpt::byte_cast<std::byte>(static_cast<uint8>((static_cast<Tunsigned>(other) >> 16) & 0xff));
}
}
operator int() const noexcept {
MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
MPT_MAYBE_CONSTANT_IF (mpt::endian_is_big()) {
return (static_cast<int8>(mpt::byte_cast<uint8>(bytes[0])) * 65536) + (mpt::byte_cast<uint8>(bytes[1]) * 256) + mpt::byte_cast<uint8>(bytes[2]);
}
else {
} else {
return (static_cast<int8>(mpt::byte_cast<uint8>(bytes[2])) * 65536) + (mpt::byte_cast<uint8>(bytes[1]) * 256) + mpt::byte_cast<uint8>(bytes[0]);
}
}

View File

@ -43,28 +43,28 @@ struct LittleEndian_tag {
constexpr inline uint16 constexpr_bswap16(uint16 x) noexcept {
return uint16(0)
| ((x >> 8) & 0x00FFu)
| ((x << 8) & 0xFF00u);
| ((x >> 8) & 0x00FFu)
| ((x << 8) & 0xFF00u);
}
constexpr inline uint32 constexpr_bswap32(uint32 x) noexcept {
return uint32(0)
| ((x & 0x000000FFu) << 24)
| ((x & 0x0000FF00u) << 8)
| ((x & 0x00FF0000u) >> 8)
| ((x & 0xFF000000u) >> 24);
| ((x & 0x000000FFu) << 24)
| ((x & 0x0000FF00u) << 8)
| ((x & 0x00FF0000u) >> 8)
| ((x & 0xFF000000u) >> 24);
}
constexpr inline uint64 constexpr_bswap64(uint64 x) noexcept {
return uint64(0)
| (((x >> 0) & 0xffull) << 56)
| (((x >> 8) & 0xffull) << 48)
| (((x >> 16) & 0xffull) << 40)
| (((x >> 24) & 0xffull) << 32)
| (((x >> 32) & 0xffull) << 24)
| (((x >> 40) & 0xffull) << 16)
| (((x >> 48) & 0xffull) << 8)
| (((x >> 56) & 0xffull) << 0);
| (((x >> 0) & 0xffull) << 56)
| (((x >> 8) & 0xffull) << 48)
| (((x >> 16) & 0xffull) << 40)
| (((x >> 24) & 0xffull) << 32)
| (((x >> 32) & 0xffull) << 24)
| (((x >> 40) & 0xffull) << 16)
| (((x >> 48) & 0xffull) << 8)
| (((x >> 56) & 0xffull) << 0);
}
#if MPT_COMPILER_GCC
@ -139,55 +139,49 @@ MPT_CONSTEXPRINLINE T EndianDecode(std::array<std::byte, size> data) noexcept {
MPT_CONSTEXPR20_FUN uint64 SwapBytesImpl(uint64 value) noexcept {
MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
MPT_MAYBE_CONSTANT_IF (MPT_IS_CONSTANT_EVALUATED20()) {
return mpt::constexpr_bswap64(value);
}
else {
} else {
return MPT_bswap64(value);
}
}
MPT_CONSTEXPR20_FUN uint32 SwapBytesImpl(uint32 value) noexcept {
MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
MPT_MAYBE_CONSTANT_IF (MPT_IS_CONSTANT_EVALUATED20()) {
return mpt::constexpr_bswap32(value);
}
else {
} else {
return MPT_bswap32(value);
}
}
MPT_CONSTEXPR20_FUN uint16 SwapBytesImpl(uint16 value) noexcept {
MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
MPT_MAYBE_CONSTANT_IF (MPT_IS_CONSTANT_EVALUATED20()) {
return mpt::constexpr_bswap16(value);
}
else {
} else {
return MPT_bswap16(value);
}
}
MPT_CONSTEXPR20_FUN int64 SwapBytesImpl(int64 value) noexcept {
MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
MPT_MAYBE_CONSTANT_IF (MPT_IS_CONSTANT_EVALUATED20()) {
return mpt::constexpr_bswap64(value);
}
else {
} else {
return MPT_bswap64(value);
}
}
MPT_CONSTEXPR20_FUN int32 SwapBytesImpl(int32 value) noexcept {
MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
MPT_MAYBE_CONSTANT_IF (MPT_IS_CONSTANT_EVALUATED20()) {
return mpt::constexpr_bswap32(value);
}
else {
} else {
return MPT_bswap32(value);
}
}
MPT_CONSTEXPR20_FUN int16 SwapBytesImpl(int16 value) noexcept {
MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
MPT_MAYBE_CONSTANT_IF (MPT_IS_CONSTANT_EVALUATED20()) {
return mpt::constexpr_bswap16(value);
}
else {
} else {
return MPT_bswap16(value);
}
}
@ -232,7 +226,7 @@ public:
public:
MPT_CONSTEXPR20_FUN void set(base_type val) noexcept {
static_assert(std::numeric_limits<T>::is_integer);
MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
MPT_MAYBE_CONSTANT_IF (MPT_IS_CONSTANT_EVALUATED20()) {
if constexpr (endian_type::endian == mpt::endian::big) {
typename std::make_unsigned<base_type>::type uval = val;
for (std::size_t i = 0; i < sizeof(base_type); ++i) {
@ -244,8 +238,7 @@ public:
data[i] = static_cast<std::byte>((uval >> (8 * i)) & 0xffu);
}
}
}
else {
} else {
if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
if constexpr (mpt::endian::native != endian_type::endian) {
val = mpt::SwapBytesImpl(val);
@ -259,7 +252,7 @@ public:
}
MPT_CONSTEXPR20_FUN base_type get() const noexcept {
static_assert(std::numeric_limits<T>::is_integer);
MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
MPT_MAYBE_CONSTANT_IF (MPT_IS_CONSTANT_EVALUATED20()) {
if constexpr (endian_type::endian == mpt::endian::big) {
typename std::make_unsigned<base_type>::type uval = 0;
for (std::size_t i = 0; i < sizeof(base_type); ++i) {
@ -273,8 +266,7 @@ public:
}
return static_cast<base_type>(uval);
}
}
else {
} else {
if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
base_type val = base_type();
std::memcpy(&val, data.data(), sizeof(val));

View File

@ -53,8 +53,7 @@ private:
std::size_t max_arg = 0;
//std::size_t args = 0;
bool success = true;
enum class state : int
{
enum class state : int {
error = -1,
text = 0,
open_seen = 1,
@ -204,8 +203,7 @@ MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count_impl(const
std::size_t max_arg = 0;
std::size_t args = 0;
bool success = true;
enum class state : int
{
enum class state : int {
error = -1,
text = 0,
open_seen = 1,

View File

@ -18,8 +18,7 @@ inline namespace MPT_INLINE_NS {
struct format_simple_base {
enum FormatFlagsEnum
{
enum FormatFlagsEnum {
BaseDec = 0x0001, // base 10 (integers only) // int+float
BaseHex = 0x0002, // base 16 (integers only) // int+float
CaseLow = 0x0010, // lower case hex digits // int+float

View File

@ -24,8 +24,7 @@ namespace IO {
template <typename Tstream>
struct CallbackStreamTemplate {
enum : int
{
enum : int {
SeekSet = 0,
SeekCur = 1,
SeekEnd = 2

View File

@ -31,13 +31,11 @@ namespace IO {
class FileDataSeekableBuffered : public FileDataSeekable {
private:
enum : std::size_t
{
enum : std::size_t {
CHUNK_SIZE = mpt::IO::BUFFERSIZE_SMALL,
BUFFER_SIZE = mpt::IO::BUFFERSIZE_NORMAL
};
enum : std::size_t
{
enum : std::size_t {
NUM_CHUNKS = BUFFER_SIZE / CHUNK_SIZE
};
struct chunk_info {

View File

@ -43,8 +43,7 @@ protected:
}
private:
enum : std::size_t
{
enum : std::size_t {
QUANTUM_SIZE = mpt::IO::BUFFERSIZE_SMALL,
BUFFER_SIZE = mpt::IO::BUFFERSIZE_NORMAL
};

View File

@ -26,8 +26,7 @@ inline namespace MPT_INLINE_NS {
namespace osinfo {
enum class osclass
{
enum class osclass {
Unknown,
Windows,
Linux,

View File

@ -29,8 +29,7 @@ namespace windows {
class Version {
public:
enum Number : uint64
{
enum Number : uint64 {
WinNT4 = 0x0000000400000000ull,
Win2000 = 0x0000000500000000ull,
WinXP = 0x0000000500000001ull,
@ -46,7 +45,10 @@ public:
struct System {
uint32 Major = 0;
uint32 Minor = 0;
System() = default;
constexpr System() noexcept
: Major(0)
, Minor(0) {
}
constexpr System(Number number) noexcept
: Major(static_cast<uint32>((static_cast<uint64>(number) >> 32) & 0xffffffffu))
, Minor(static_cast<uint32>((static_cast<uint64>(number) >> 0) & 0xffffffffu)) {
@ -67,7 +69,10 @@ public:
struct ServicePack {
uint16 Major = 0;
uint16 Minor = 0;
ServicePack() = default;
constexpr ServicePack() noexcept
: Major(0)
, Minor(0) {
}
explicit constexpr ServicePack(uint16 major, uint16 minor) noexcept
: Major(major)
, Minor(minor) {
@ -84,7 +89,7 @@ public:
typedef uint32 TypeId;
protected:
private:
bool m_SystemIsWindows;
System m_System;
@ -92,8 +97,8 @@ protected:
Build m_Build;
TypeId m_Type;
protected:
Version() noexcept
private:
constexpr Version() noexcept
: m_SystemIsWindows(false)
, m_System()
, m_ServicePack()
@ -102,11 +107,11 @@ protected:
}
public:
static Version NoWindows() noexcept {
static constexpr Version NoWindows() noexcept {
return Version();
}
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
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)
, m_ServicePack(servicePack)
@ -114,46 +119,67 @@ public:
, m_Type(type) {
}
protected:
public:
#if MPT_OS_WINDOWS
static mpt::osinfo::windows::Version VersionFromNTDDI_VERSION() noexcept {
static mpt::osinfo::windows::Version FromSDK() noexcept {
// Initialize to used SDK version
mpt::osinfo::windows::Version::System System =
#if NTDDI_VERSION >= 0x0A000000 // NTDDI_WIN10
mpt::osinfo::windows::Version::Win10
#if defined(NTDDI_VERSION)
#if NTDDI_VERSION >= 0x0A00000B // NTDDI_WIN10_CO Win11
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 22000, 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
// return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 19043, 0);
//#elif // NTDDI_WIN10_FE 20H2
// return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 19042, 0);
#elif NTDDI_VERSION >= 0x0A000008 // NTDDI_WIN10_MN 2004/20H1
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 19041, 0);
//#elif // NTDDI_WIN10_VB 1909/19H2
// return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 18363, 0);
#elif NTDDI_VERSION >= 0x0A000007 // NTDDI_WIN10_19H1 1903/19H1
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 18362, 0);
#elif NTDDI_VERSION >= 0x0A000006 // NTDDI_WIN10_RS5 1809
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 17763, 0);
#elif NTDDI_VERSION >= 0x0A000005 // NTDDI_WIN10_RS4 1803
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 17134, 0);
#elif NTDDI_VERSION >= 0x0A000004 // NTDDI_WIN10_RS3 1709
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 16299, 0);
#elif NTDDI_VERSION >= 0x0A000003 // NTDDI_WIN10_RS2 1703
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 15063, 0);
#elif NTDDI_VERSION >= 0x0A000002 // NTDDI_WIN10_RS1 1607
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 14393, 0);
#elif NTDDI_VERSION >= 0x0A000001 // NTDDI_WIN10_TH2 1511
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 10586, 0);
#elif NTDDI_VERSION >= 0x0A000000 // NTDDI_WIN10 1507
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win10, mpt::osinfo::windows::Version::ServicePack(0, 0), 10240, 0);
#elif NTDDI_VERSION >= 0x06030000 // NTDDI_WINBLUE
mpt::osinfo::windows::Version::Win81
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win81, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
#elif NTDDI_VERSION >= 0x06020000 // NTDDI_WIN8
mpt::osinfo::windows::Version::Win8
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win8, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
#elif NTDDI_VERSION >= 0x06010000 // NTDDI_WIN7
mpt::osinfo::windows::Version::Win7
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win7, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
#elif NTDDI_VERSION >= 0x06000000 // NTDDI_VISTA
mpt::osinfo::windows::Version::WinVista
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::WinVista, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
#elif NTDDI_VERSION >= 0x05020000 // NTDDI_WS03
mpt::osinfo::windows::Version::WinXP64
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::WinXP64, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
#elif NTDDI_VERSION >= NTDDI_WINXP
mpt::osinfo::windows::Version::WinXP
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::WinXP, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
#elif NTDDI_VERSION >= NTDDI_WIN2K
mpt::osinfo::windows::Version::Win2000
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::Win2000, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
#else
mpt::osinfo::windows::Version::WinNT4
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::WinNT4, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
#endif
;
return mpt::osinfo::windows::Version(System, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
}
static mpt::osinfo::windows::Version::System SystemVersionFrom_WIN32_WINNT() noexcept {
#if defined(_WIN32_WINNT)
return mpt::osinfo::windows::Version::System((static_cast<uint64>(_WIN32_WINNT) & 0xff00u) >> 8, (static_cast<uint64>(_WIN32_WINNT) & 0x00ffu) >> 0);
#elif defined(_WIN32_WINNT)
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::System((static_cast<uint64>(_WIN32_WINNT) & 0xff00u) >> 8, (static_cast<uint64>(_WIN32_WINNT) & 0x00ffu) >> 0), mpt::osinfo::windows::Version::ServicePack(0, 0), 0, 0);
#else
return mpt::osinfo::windows::Version::System();
return mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::System(0, 0), mpt::osinfo::windows::Version::ServicePack(0, 0), 0, 0);
#endif
}
static mpt::osinfo::windows::Version GatherWindowsVersion() noexcept {
#if MPT_OS_WINDOWS_WINRT
return VersionFromNTDDI_VERSION();
return mpt::osinfo::windows::Version::FromSDK();
#else // !MPT_OS_WINDOWS_WINRT
OSVERSIONINFOEXW versioninfoex{};
versioninfoex.dwOSVersionInfoSize = sizeof(versioninfoex);
@ -167,7 +193,7 @@ protected:
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
#endif // MPT_COMPILER_CLANG
if (GetVersionExW((LPOSVERSIONINFOW)&versioninfoex) == FALSE) {
return VersionFromNTDDI_VERSION();
return mpt::osinfo::windows::Version::FromSDK();
}
#if MPT_COMPILER_MSVC
#pragma warning(pop)
@ -176,7 +202,7 @@ protected:
#pragma clang diagnostic pop
#endif // MPT_COMPILER_CLANG
if (versioninfoex.dwPlatformId != VER_PLATFORM_WIN32_NT) {
return VersionFromNTDDI_VERSION();
return mpt::osinfo::windows::Version::FromSDK();
}
DWORD dwProductType = 0;
#if (_WIN32_WINNT >= 0x0600) // _WIN32_WINNT_VISTA
@ -261,6 +287,10 @@ public:
return m_Build < build;
}
bool IsBefore(mpt::osinfo::windows::Version version) const noexcept {
return IsBefore(version.GetSystem(), version.GetServicePack(), version.GetBuild());
}
bool IsAtLeast(mpt::osinfo::windows::Version::System version) const noexcept {
if (!m_SystemIsWindows) {
return false;
@ -313,6 +343,10 @@ public:
return m_Build >= build;
}
bool IsAtLeast(mpt::osinfo::windows::Version version) const noexcept {
return IsAtLeast(version.GetSystem(), version.GetServicePack(), version.GetBuild());
}
mpt::osinfo::windows::Version::System GetSystem() const noexcept {
return m_System;
}

View File

@ -37,8 +37,7 @@ struct engine_traits {
template <>
struct engine_traits<std::mt19937> {
enum : std::size_t
{
enum : std::size_t {
seed_bits = sizeof(std::mt19937::result_type) * 8 * std::mt19937::state_size
};
typedef std::mt19937 rng_type;
@ -56,8 +55,7 @@ struct engine_traits<std::mt19937> {
template <>
struct engine_traits<std::mt19937_64> {
enum : std::size_t
{
enum : std::size_t {
seed_bits = sizeof(std::mt19937_64::result_type) * 8 * std::mt19937_64::state_size
};
typedef std::mt19937_64 rng_type;
@ -75,8 +73,7 @@ struct engine_traits<std::mt19937_64> {
template <>
struct engine_traits<std::ranlux24_base> {
enum : std::size_t
{
enum : std::size_t {
seed_bits = std::ranlux24_base::word_size
};
typedef std::ranlux24_base rng_type;
@ -94,8 +91,7 @@ struct engine_traits<std::ranlux24_base> {
template <>
struct engine_traits<std::ranlux48_base> {
enum : std::size_t
{
enum : std::size_t {
seed_bits = std::ranlux48_base::word_size
};
typedef std::ranlux48_base rng_type;
@ -113,8 +109,7 @@ struct engine_traits<std::ranlux48_base> {
template <>
struct engine_traits<std::ranlux24> {
enum : std::size_t
{
enum : std::size_t {
seed_bits = std::ranlux24_base::word_size
};
typedef std::ranlux24 rng_type;
@ -132,8 +127,7 @@ struct engine_traits<std::ranlux24> {
template <>
struct engine_traits<std::ranlux48> {
enum : std::size_t
{
enum : std::size_t {
seed_bits = std::ranlux48_base::word_size
};
typedef std::ranlux48 rng_type;

View File

@ -27,8 +27,7 @@ inline namespace MPT_INLINE_NS {
enum class common_encoding
{
enum class common_encoding {
utf8,
ascii, // strictly 7-bit ASCII
iso8859_1,
@ -36,11 +35,15 @@ enum class common_encoding
cp850,
cp437,
windows1252,
amiga,
riscos,
iso8859_1_no_c1,
iso8859_15_no_c1,
amiga_no_c1,
};
enum class logical_encoding
{
enum class logical_encoding {
locale, // CP_ACP on windows, system configured C locale otherwise
active_locale, // active C/C++ global locale
};

View File

@ -43,27 +43,25 @@ inline namespace MPT_INLINE_NS {
/*
default 1:1 mapping
// default 1:1 mapping
inline constexpr char32_t CharsetTableISO8859_1[256] = {
0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
};
*/
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
inline constexpr char32_t CharsetTableISO8859_15[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
@ -137,6 +135,45 @@ inline constexpr char32_t CharsetTableCP437[256] = {
0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0};
// <https://de.wikipedia.org/wiki/Commodore_Amiga_(Zeichensatz)>
inline constexpr char32_t CharsetTableAmiga[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2592,
0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x2013, 0x00ae, 0x00af,
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
// Based on RISCOSI.TXT from <https://www.unicode.org/L2/L2019/19025-terminals-prop.pdf>,
// with gaps filled in from standard set at <https://en.wikipedia.org/wiki/RISC_OS_character_set>.
inline constexpr char32_t CharsetTableRISC_OS[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
0x20AC, 0x0174, 0x0175, 0x25f0, 0x1fbc0, 0x0176, 0x0177, 0xfffd, 0x21e6, 0x21e8, 0x21e9, 0x21e7, 0x2026, 0x2122, 0x2030, 0x2022,
0x2018, 0x2019, 0x2039, 0x203A, 0x201C, 0x201D, 0x201E, 0x2013, 0x2014, 0x2212, 0x0152, 0x0153, 0x2020, 0x2021, 0xFB01, 0xFB02,
0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
template <typename Tsrcstring>
inline mpt::widestring decode_8bit(const Tsrcstring & str, const char32_t (&table)[256], mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
mpt::widestring res;
@ -186,12 +223,66 @@ inline Tdststring encode_8bit(const mpt::widestring & str, const char32_t (&tabl
return res;
}
template <typename Tsrcstring>
inline mpt::widestring decode_8bit_no_c1(const Tsrcstring & str, const char32_t (&table)[256], mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
mpt::widestring res;
res.reserve(str.length());
for (std::size_t i = 0; i < str.length(); ++i) {
std::size_t c = static_cast<std::size_t>(mpt::char_value(str[i]));
if ((0x80 <= c) && (c <= 0x9f)) {
res.push_back(replacement);
} else if (c < std::size(table)) {
res.push_back(static_cast<mpt::widechar>(table[c]));
} else {
res.push_back(replacement);
}
}
return res;
}
template <typename Tdststring>
inline Tdststring encode_8bit_no_c1(const mpt::widestring & str, const char32_t (&table)[256], char replacement = '?') {
Tdststring res;
res.reserve(str.length());
for (std::size_t i = 0; i < str.length(); ++i) {
char32_t c = static_cast<char32_t>(str[i]);
bool found = false;
// Try non-control characters first.
// In cases where there are actual characters mirrored in this range (like in AMS/AMS2 character sets),
// characters in the common range are preferred this way.
for (std::size_t x = 0x20; x < std::size(table); ++x) {
if ((0x80 <= c) && (c <= 0x9f)) {
continue;
}
if (c == table[x]) {
res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
found = true;
break;
}
}
if (!found) {
// try control characters
for (std::size_t x = 0x00; x < std::size(table) && x < 0x20; ++x) {
if (c == table[x]) {
res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
found = true;
break;
}
}
}
if (!found) {
res.push_back(replacement);
}
}
return res;
}
template <typename Tsrcstring>
inline mpt::widestring decode_ascii(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
mpt::widestring res;
res.reserve(str.length());
for (std::size_t i = 0; i < str.length(); ++i) {
uint8 c = str[i];
uint8 c = mpt::char_value(str[i]);
if (c <= 0x7f) {
res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
} else {
@ -222,7 +313,7 @@ inline mpt::widestring decode_iso8859_1(const Tsrcstring & str, mpt::widechar re
mpt::widestring res;
res.reserve(str.length());
for (std::size_t i = 0; i < str.length(); ++i) {
uint8 c = str[i];
uint8 c = mpt::char_value(str[i]);
res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
}
return res;
@ -471,6 +562,21 @@ inline bool windows_has_encoding(common_encoding encoding) {
case common_encoding::windows1252:
result = has_codepage(1252);
break;
case common_encoding::amiga:
result = false;
break;
case common_encoding::riscos:
result = false;
break;
case common_encoding::iso8859_1_no_c1:
result = false;
break;
case common_encoding::iso8859_15_no_c1:
result = false;
break;
case common_encoding::amiga_no_c1:
result = false;
break;
}
return result;
}
@ -495,7 +601,7 @@ inline UINT codepage_from_encoding(logical_encoding encoding) {
result = CP_ACP;
break;
case logical_encoding::active_locale:
result = 0;
throw std::domain_error("unsupported encoding");
break;
}
return result;
@ -525,6 +631,21 @@ inline UINT codepage_from_encoding(common_encoding encoding) {
case common_encoding::windows1252:
result = 1252;
break;
case common_encoding::amiga:
throw std::domain_error("unsupported encoding");
break;
case common_encoding::riscos:
throw std::domain_error("unsupported encoding");
break;
case common_encoding::iso8859_1_no_c1:
throw std::domain_error("unsupported encoding");
break;
case common_encoding::iso8859_15_no_c1:
throw std::domain_error("unsupported encoding");
break;
case common_encoding::amiga_no_c1:
throw std::domain_error("unsupported encoding");
break;
}
return result;
}
@ -828,6 +949,21 @@ inline Tdststring encode(common_encoding encoding, const mpt::widestring & src)
case common_encoding::windows1252:
return encode_8bit<Tdststring>(src, CharsetTableWindows1252);
break;
case common_encoding::amiga:
return encode_8bit<Tdststring>(src, CharsetTableAmiga);
break;
case common_encoding::riscos:
return encode_8bit<Tdststring>(src, CharsetTableRISC_OS);
break;
case common_encoding::iso8859_1_no_c1:
return encode_8bit_no_c1<Tdststring>(src, CharsetTableISO8859_1);
break;
case common_encoding::iso8859_15_no_c1:
return encode_8bit_no_c1<Tdststring>(src, CharsetTableISO8859_15);
break;
case common_encoding::amiga_no_c1:
return encode_8bit_no_c1<Tdststring>(src, CharsetTableAmiga);
break;
}
throw std::domain_error("unsupported encoding");
}
@ -922,6 +1058,21 @@ inline mpt::widestring decode(common_encoding encoding, const Tsrcstring & src)
case common_encoding::windows1252:
return decode_8bit(src, CharsetTableWindows1252);
break;
case common_encoding::amiga:
return decode_8bit(src, CharsetTableAmiga);
break;
case common_encoding::riscos:
return decode_8bit(src, CharsetTableRISC_OS);
break;
case common_encoding::iso8859_1_no_c1:
return decode_8bit_no_c1(src, CharsetTableISO8859_1);
break;
case common_encoding::iso8859_15_no_c1:
return decode_8bit_no_c1(src, CharsetTableISO8859_15);
break;
case common_encoding::amiga_no_c1:
return decode_8bit_no_c1(src, CharsetTableAmiga);
break;
}
throw std::domain_error("unsupported encoding");
}

View File

@ -160,7 +160,7 @@ public:
private:
static MPT_CONSTEXPRINLINE uint8 NibbleFromChar(char x) {
return ('0' <= x && x <= '9') ? static_cast<uint8>(x - '0' + 0) : ('a' <= x && x <= 'z') ? static_cast<uint8>(x - 'a' + 10)
: ('A' <= x && x <= 'Z') ? static_cast<uint8>(x - 'A' + 10)
: ('A' <= x && x <= 'Z') ? static_cast<uint8>(x - 'A' + 10)
: mpt::constexpr_throw<uint8>(std::domain_error(""));
}
static MPT_CONSTEXPRINLINE uint8 ByteFromHex(char x, char y) {
@ -351,29 +351,29 @@ public:
}
std::string ToAString() const {
return std::string()
+ mpt::format<std::string>::hex0<8>(GetData1())
+ std::string("-")
+ mpt::format<std::string>::hex0<4>(GetData2())
+ std::string("-")
+ mpt::format<std::string>::hex0<4>(GetData3())
+ std::string("-")
+ mpt::format<std::string>::hex0<4>(static_cast<uint16>(GetData4() >> 48))
+ std::string("-")
+ mpt::format<std::string>::hex0<4>(static_cast<uint16>(GetData4() >> 32))
+ mpt::format<std::string>::hex0<8>(static_cast<uint32>(GetData4() >> 0));
+ mpt::format<std::string>::hex0<8>(GetData1())
+ std::string("-")
+ mpt::format<std::string>::hex0<4>(GetData2())
+ std::string("-")
+ mpt::format<std::string>::hex0<4>(GetData3())
+ std::string("-")
+ mpt::format<std::string>::hex0<4>(static_cast<uint16>(GetData4() >> 48))
+ std::string("-")
+ mpt::format<std::string>::hex0<4>(static_cast<uint16>(GetData4() >> 32))
+ mpt::format<std::string>::hex0<8>(static_cast<uint32>(GetData4() >> 0));
}
mpt::ustring ToUString() const {
return mpt::ustring()
+ mpt::format<mpt::ustring>::hex0<8>(GetData1())
+ MPT_USTRING("-")
+ mpt::format<mpt::ustring>::hex0<4>(GetData2())
+ MPT_USTRING("-")
+ mpt::format<mpt::ustring>::hex0<4>(GetData3())
+ MPT_USTRING("-")
+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 48))
+ MPT_USTRING("-")
+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 32))
+ mpt::format<mpt::ustring>::hex0<8>(static_cast<uint32>(GetData4() >> 0));
+ mpt::format<mpt::ustring>::hex0<8>(GetData1())
+ MPT_USTRING("-")
+ mpt::format<mpt::ustring>::hex0<4>(GetData2())
+ MPT_USTRING("-")
+ mpt::format<mpt::ustring>::hex0<4>(GetData3())
+ MPT_USTRING("-")
+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 48))
+ MPT_USTRING("-")
+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 32))
+ mpt::format<mpt::ustring>::hex0<8>(static_cast<uint32>(GetData4() >> 0));
}
};

View File

@ -35,8 +35,8 @@ void ConvertBufferMixInternalFixedToBuffer(TOutBuf outBuf, TInBuf inBuf, Tdither
assert(inBuf.size_frames() >= count);
assert(outBuf.size_frames() >= count);
constexpr int ditherBits = SampleFormat(SampleFormatTraits<TOutSample>::sampleFormat()).IsInt()
? SampleFormat(SampleFormatTraits<TOutSample>::sampleFormat()).GetBitsPerSample()
: 0;
? SampleFormat(SampleFormatTraits<TOutSample>::sampleFormat()).GetBitsPerSample()
: 0;
SC::ClipFixed<int32, fractionalBits, clipOutput> clip;
SC::ConvertFixedPoint<TOutSample, TInSample, fractionalBits> conv;
for(std::size_t i = 0; i < count; ++i)
@ -79,8 +79,8 @@ void ConvertBufferMixInternalToBuffer(TOutBuf outBuf, TInBuf inBuf, Tdither &dit
assert(inBuf.size_frames() >= count);
assert(outBuf.size_frames() >= count);
constexpr int ditherBits = SampleFormat(SampleFormatTraits<TOutSample>::sampleFormat()).IsInt()
? SampleFormat(SampleFormatTraits<TOutSample>::sampleFormat()).GetBitsPerSample()
: 0;
? SampleFormat(SampleFormatTraits<TOutSample>::sampleFormat()).GetBitsPerSample()
: 0;
SC::Clip<TInSample, clipOutput> clip;
SC::Convert<TOutSample, TInSample> conv;
for(std::size_t i = 0; i < count; ++i)

View File

@ -264,7 +264,7 @@ struct DecodeInt64
| (static_cast<uint64>(mpt::byte_cast<uint8>(inBuf[b5])) << 40)
| (static_cast<uint64>(mpt::byte_cast<uint8>(inBuf[b6])) << 48)
| (static_cast<uint64>(mpt::byte_cast<uint8>(inBuf[b7])) << 56))
- offset;
- offset;
}
};

View File

@ -250,27 +250,27 @@ public:
}
MPT_CONSTEXPRINLINE uint8 GetSampleSize() const noexcept
{
return !IsValid() ? 0
: (value == SampleFormat::Unsigned8) ? 1
: (value == SampleFormat::Int8) ? 1
: (value == SampleFormat::Int16) ? 2
: (value == SampleFormat::Int24) ? 3
: (value == SampleFormat::Int32) ? 4
: (value == SampleFormat::Float32) ? 4
: (value == SampleFormat::Float64) ? 8
: 0;
return !IsValid() ? 0
: (value == SampleFormat::Unsigned8) ? 1
: (value == SampleFormat::Int8) ? 1
: (value == SampleFormat::Int16) ? 2
: (value == SampleFormat::Int24) ? 3
: (value == SampleFormat::Int32) ? 4
: (value == SampleFormat::Float32) ? 4
: (value == SampleFormat::Float64) ? 8
: 0;
}
MPT_CONSTEXPRINLINE uint8 GetBitsPerSample() const noexcept
{
return !IsValid() ? 0
: (value == SampleFormat::Unsigned8) ? 8
: (value == SampleFormat::Int8) ? 8
: (value == SampleFormat::Int16) ? 16
: (value == SampleFormat::Int24) ? 24
: (value == SampleFormat::Int32) ? 32
: (value == SampleFormat::Float32) ? 32
: (value == SampleFormat::Float64) ? 64
: 0;
return !IsValid() ? 0
: (value == SampleFormat::Unsigned8) ? 8
: (value == SampleFormat::Int8) ? 8
: (value == SampleFormat::Int16) ? 16
: (value == SampleFormat::Int24) ? 24
: (value == SampleFormat::Int32) ? 32
: (value == SampleFormat::Float32) ? 32
: (value == SampleFormat::Float64) ? 64
: 0;
}
MPT_CONSTEXPRINLINE operator SampleFormat::Enum() const noexcept