You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
(3) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(2) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
2008 |
Jan
(6) |
Feb
(4) |
Mar
(5) |
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(2) |
Oct
(9) |
Nov
(1) |
Dec
(4) |
2009 |
Jan
(9) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(6) |
Jun
(18) |
Jul
(33) |
Aug
(39) |
Sep
(33) |
Oct
(24) |
Nov
(23) |
Dec
(22) |
2010 |
Jan
(29) |
Feb
(32) |
Mar
(51) |
Apr
(17) |
May
(31) |
Jun
(21) |
Jul
(32) |
Aug
(28) |
Sep
(35) |
Oct
(27) |
Nov
(11) |
Dec
(13) |
2011 |
Jan
(14) |
Feb
(13) |
Mar
(27) |
Apr
(27) |
May
(28) |
Jun
(20) |
Jul
(43) |
Aug
(52) |
Sep
(66) |
Oct
(61) |
Nov
(11) |
Dec
(8) |
2012 |
Jan
(20) |
Feb
(30) |
Mar
(38) |
Apr
(21) |
May
(33) |
Jun
(21) |
Jul
(25) |
Aug
(9) |
Sep
(24) |
Oct
(42) |
Nov
(27) |
Dec
(41) |
2013 |
Jan
(20) |
Feb
(35) |
Mar
(156) |
Apr
(298) |
May
(258) |
Jun
(201) |
Jul
(105) |
Aug
(60) |
Sep
(193) |
Oct
(245) |
Nov
(280) |
Dec
(194) |
2014 |
Jan
(63) |
Feb
(202) |
Mar
(200) |
Apr
(23) |
May
(53) |
Jun
(105) |
Jul
(18) |
Aug
(26) |
Sep
(110) |
Oct
(187) |
Nov
(97) |
Dec
(74) |
2015 |
Jan
(45) |
Feb
(55) |
Mar
(116) |
Apr
(116) |
May
(193) |
Jun
(164) |
Jul
(50) |
Aug
(111) |
Sep
(98) |
Oct
(71) |
Nov
(103) |
Dec
(63) |
2016 |
Jan
(33) |
Feb
(101) |
Mar
(182) |
Apr
(139) |
May
(140) |
Jun
(103) |
Jul
(165) |
Aug
(286) |
Sep
(208) |
Oct
(127) |
Nov
(97) |
Dec
(54) |
2017 |
Jan
(64) |
Feb
(335) |
Mar
(202) |
Apr
(212) |
May
(139) |
Jun
(127) |
Jul
(294) |
Aug
(154) |
Sep
(170) |
Oct
(152) |
Nov
(156) |
Dec
(62) |
2018 |
Jan
(168) |
Feb
(237) |
Mar
(196) |
Apr
(174) |
May
(174) |
Jun
(161) |
Jul
(127) |
Aug
(88) |
Sep
(149) |
Oct
(66) |
Nov
(52) |
Dec
(135) |
2019 |
Jan
(146) |
Feb
(126) |
Mar
(104) |
Apr
(58) |
May
(60) |
Jun
(28) |
Jul
(197) |
Aug
(129) |
Sep
(141) |
Oct
(148) |
Nov
(63) |
Dec
(100) |
2020 |
Jan
(74) |
Feb
(37) |
Mar
(59) |
Apr
(154) |
May
(194) |
Jun
(133) |
Jul
(313) |
Aug
(197) |
Sep
(49) |
Oct
(162) |
Nov
(143) |
Dec
(57) |
2021 |
Jan
(120) |
Feb
(107) |
Mar
(314) |
Apr
(157) |
May
(524) |
Jun
(169) |
Jul
(72) |
Aug
(133) |
Sep
(135) |
Oct
(146) |
Nov
(198) |
Dec
(325) |
2022 |
Jan
(409) |
Feb
(249) |
Mar
(138) |
Apr
(95) |
May
(102) |
Jun
(221) |
Jul
(66) |
Aug
(120) |
Sep
(192) |
Oct
(131) |
Nov
(53) |
Dec
(171) |
2023 |
Jan
(357) |
Feb
(82) |
Mar
(168) |
Apr
(218) |
May
(196) |
Jun
(86) |
Jul
(115) |
Aug
(49) |
Sep
(190) |
Oct
(102) |
Nov
(45) |
Dec
(76) |
2024 |
Jan
(86) |
Feb
(50) |
Mar
(324) |
Apr
(209) |
May
(197) |
Jun
(232) |
Jul
(194) |
Aug
(247) |
Sep
(219) |
Oct
(266) |
Nov
(328) |
Dec
(304) |
2025 |
Jan
(191) |
Feb
(115) |
Mar
(137) |
Apr
(32) |
May
(126) |
Jun
(403) |
Jul
(72) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <sv...@op...> - 2025-02-09 14:05:39
|
Author: sagamusix Date: Sun Feb 9 15:05:31 2025 New Revision: 22871 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22871 Log: [Mod] Channel mute status is no longer saved by default. Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Sat Feb 8 16:53:27 2025 (r22870) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Sun Feb 9 15:05:31 2025 (r22871) @@ -205,7 +205,7 @@ , autoApplySmoothFT2Ramping(conf, UL_("Misc"), UL_("SmoothFT2Ramping"), false) , MiscITCompressionStereo(conf, UL_("Misc"), UL_("ITCompressionStereo"), 4) , MiscITCompressionMono(conf, UL_("Misc"), UL_("ITCompressionMono"), 7) - , MiscSaveChannelMuteStatus(conf, UL_("Misc"), UL_("SaveChannelMuteStatus"), true) + , MiscSaveChannelMuteStatus(conf, UL_("Misc"), UL_("SaveChannelMuteStatus"), false) , MiscAllowMultipleCommandsPerKey(conf, UL_("Misc"), UL_("AllowMultipleCommandsPerKey"), false) , MiscDistinguishModifiers(conf, UL_("Misc"), UL_("DistinguishModifiers"), false) , MiscProcessPriorityClass(conf, UL_("Misc"), UL_("ProcessPriorityClass"), ProcessPriorityClassNORMAL) |
From: <sv...@op...> - 2025-02-08 15:53:34
|
Author: sagamusix Date: Sat Feb 8 16:53:27 2025 New Revision: 22870 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22870 Log: Merged revision(s) 22869 from trunk/OpenMPT: [Imp] BRR: Relax file rejection heuristics a bit for files that only set the loop bit for frames that are inside the loop (https://bugs.openmpt.org/view.php?id=1859). ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/SampleFormatBRR.cpp Modified: branches/OpenMPT-1.31/soundlib/SampleFormatBRR.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/SampleFormatBRR.cpp Sat Feb 8 16:53:09 2025 (r22869) +++ branches/OpenMPT-1.31/soundlib/SampleFormatBRR.cpp Sat Feb 8 16:53:27 2025 (r22870) @@ -87,7 +87,14 @@ if(isLast != file.EndOfFile()) return false; if(!first && enableLoop != isLoop) - return false; + { + if(!hasLoopInfo) + return false; + // In some files, the loop flag is only set for the blocks within the loop (except for the first block?) + const bool inLoop = file.GetPosition() > loopStart + 11u; + if(enableLoop != inLoop) + return false; + } // While a range of 13 is technically invalid as well, it can be found in the wild. if(range > 13) return false; |
From: <sv...@op...> - 2025-02-08 15:53:16
|
Author: sagamusix Date: Sat Feb 8 16:53:09 2025 New Revision: 22869 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22869 Log: [Imp] BRR: Relax file rejection heuristics a bit for files that only set the loop bit for frames that are inside the loop (https://bugs.openmpt.org/view.php?id=1859). Modified: trunk/OpenMPT/soundlib/SampleFormatBRR.cpp Modified: trunk/OpenMPT/soundlib/SampleFormatBRR.cpp ============================================================================== --- trunk/OpenMPT/soundlib/SampleFormatBRR.cpp Fri Feb 7 23:23:14 2025 (r22868) +++ trunk/OpenMPT/soundlib/SampleFormatBRR.cpp Sat Feb 8 16:53:09 2025 (r22869) @@ -87,7 +87,14 @@ if(isLast != file.EndOfFile()) return false; if(!first && enableLoop != isLoop) - return false; + { + if(!hasLoopInfo) + return false; + // In some files, the loop flag is only set for the blocks within the loop (except for the first block?) + const bool inLoop = file.GetPosition() > loopStart + 11u; + if(enableLoop != inLoop) + return false; + } // While a range of 13 is technically invalid as well, it can be found in the wild. if(range > 13) return false; |
From: <sv...@op...> - 2025-02-07 22:23:21
|
Author: sagamusix Date: Fri Feb 7 23:23:14 2025 New Revision: 22868 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22868 Log: Merged revision(s) 22864 from trunk/OpenMPT: [Fix] Don't execute sample cues when a channel is actually an Adlib channel. Sample cues share memory with the OPL patch data. ........ Modified: branches/OpenMPT-1.28/ (props changed) branches/OpenMPT-1.28/soundlib/Snd_fx.cpp Modified: branches/OpenMPT-1.28/soundlib/Snd_fx.cpp ============================================================================== --- branches/OpenMPT-1.28/soundlib/Snd_fx.cpp Fri Feb 7 23:22:30 2025 (r22867) +++ branches/OpenMPT-1.28/soundlib/Snd_fx.cpp Fri Feb 7 23:23:14 2025 (r22868) @@ -1050,7 +1050,7 @@ startTick = playState.m_nMusicSpeed - 1; } else if(m.volcmd == VOLCMD_OFFSET) { - if(chn.pModSample != nullptr && m.vol <= CountOf(chn.pModSample->cues)) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && m.vol <= CountOf(chn.pModSample->cues)) { SmpLength offset; if(m.vol == 0) @@ -3116,7 +3116,7 @@ break; case VOLCMD_OFFSET: - if (triggerNote && chn.pModSample && vol <= CountOf(chn.pModSample->cues)) + if(triggerNote && chn.pModSample && !chn.pModSample->uFlags[CHN_ADLIB] && vol <= CountOf(chn.pModSample->cues)) { SmpLength offset; if(vol == 0) @@ -5554,7 +5554,7 @@ if(m_playBehaviour[kITRetrigger]) chn.position.Set(0); offset--; - if(chn.pModSample != nullptr && offset >= 0 && offset <= static_cast<int>(CountOf(chn.pModSample->cues)) && chn.pModSample != nullptr) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && offset >= 0 && offset <= static_cast<int>(CountOf(chn.pModSample->cues))) { if(offset == 0) offset = chn.oldOffset; else offset = chn.oldOffset = chn.pModSample->cues[offset - 1]; |
From: <sv...@op...> - 2025-02-07 22:22:37
|
Author: sagamusix Date: Fri Feb 7 23:22:30 2025 New Revision: 22867 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22867 Log: Merged revision(s) 22864 from trunk/OpenMPT: [Fix] Don't execute sample cues when a channel is actually an Adlib channel. Sample cues share memory with the OPL patch data. ........ Modified: branches/OpenMPT-1.29/ (props changed) branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Modified: branches/OpenMPT-1.29/soundlib/Snd_fx.cpp ============================================================================== --- branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Fri Feb 7 23:21:23 2025 (r22866) +++ branches/OpenMPT-1.29/soundlib/Snd_fx.cpp Fri Feb 7 23:22:30 2025 (r22867) @@ -1076,7 +1076,7 @@ startTick = playState.m_nMusicSpeed - 1; } else if(m.volcmd == VOLCMD_OFFSET) { - if(chn.pModSample != nullptr && m.vol <= CountOf(chn.pModSample->cues)) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && m.vol <= CountOf(chn.pModSample->cues)) { SmpLength offset; if(m.vol == 0) @@ -3192,7 +3192,7 @@ break; case VOLCMD_OFFSET: - if (triggerNote && chn.pModSample && vol <= CountOf(chn.pModSample->cues)) + if(triggerNote && chn.pModSample && !chn.pModSample->uFlags[CHN_ADLIB] && vol <= CountOf(chn.pModSample->cues)) { SmpLength offset; if(vol == 0) @@ -5701,7 +5701,7 @@ if(m_playBehaviour[kITRetrigger]) chn.position.Set(0); offset--; - if(chn.pModSample != nullptr && offset >= 0 && offset <= static_cast<int>(CountOf(chn.pModSample->cues))) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && offset >= 0 && offset <= static_cast<int>(CountOf(chn.pModSample->cues))) { if(offset == 0) offset = chn.oldOffset; |
From: <sv...@op...> - 2025-02-07 22:21:30
|
Author: sagamusix Date: Fri Feb 7 23:21:23 2025 New Revision: 22866 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22866 Log: Merged revision(s) 22864 from trunk/OpenMPT: [Fix] Don't execute sample cues when a channel is actually an Adlib channel. Sample cues share memory with the OPL patch data. ........ Modified: branches/OpenMPT-1.30/ (props changed) branches/OpenMPT-1.30/soundlib/Snd_fx.cpp Modified: branches/OpenMPT-1.30/soundlib/Snd_fx.cpp ============================================================================== --- branches/OpenMPT-1.30/soundlib/Snd_fx.cpp Fri Feb 7 23:21:03 2025 (r22865) +++ branches/OpenMPT-1.30/soundlib/Snd_fx.cpp Fri Feb 7 23:21:23 2025 (r22866) @@ -1005,7 +1005,7 @@ startTick = playState.m_nMusicSpeed - 1; } else if(m.volcmd == VOLCMD_OFFSET) { - if(chn.pModSample != nullptr && m.vol <= std::size(chn.pModSample->cues)) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && m.vol <= std::size(chn.pModSample->cues)) { SmpLength offset; if(m.vol == 0) @@ -3045,7 +3045,7 @@ break; case VOLCMD_OFFSET: - if(triggerNote && chn.pModSample && vol <= std::size(chn.pModSample->cues)) + if(triggerNote && chn.pModSample && !chn.pModSample->uFlags[CHN_ADLIB] && vol <= std::size(chn.pModSample->cues)) { SmpLength offset; if(vol == 0) @@ -5285,7 +5285,7 @@ { if(m.vol == 0) offset = Util::muldivr_unsigned(chn.nLength, offset, 256u << (8u * std::max(uint32(1), extendedRows))); // o00 + Oxx = Percentage Offset - else if(m.vol <= std::size(ModSample().cues) && chn.pModSample != nullptr) + else if(m.vol <= std::size(ModSample().cues) && chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB]) offset += chn.pModSample->cues[m.vol - 1]; // Offset relative to cue point chn.oldOffset = offset; } @@ -5599,7 +5599,7 @@ chn.position.Set(0); offset--; - if(chn.pModSample != nullptr && offset >= 0 && offset <= static_cast<int>(std::size(chn.pModSample->cues))) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && offset >= 0 && offset <= static_cast<int>(std::size(chn.pModSample->cues))) { if(offset == 0) offset = chn.oldOffset; |
From: <sv...@op...> - 2025-02-07 22:21:14
|
Author: sagamusix Date: Fri Feb 7 23:21:03 2025 New Revision: 22865 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22865 Log: Merged revision(s) 22864 from trunk/OpenMPT: [Fix] Don't execute sample cues when a channel is actually an Adlib channel. Sample cues share memory with the OPL patch data. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Snd_fx.cpp Modified: branches/OpenMPT-1.31/soundlib/Snd_fx.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Snd_fx.cpp Fri Feb 7 23:20:33 2025 (r22864) +++ branches/OpenMPT-1.31/soundlib/Snd_fx.cpp Fri Feb 7 23:21:03 2025 (r22865) @@ -1082,7 +1082,7 @@ startTick = playState.m_nMusicSpeed - 1; } else if(m.volcmd == VOLCMD_OFFSET) { - if(chn.pModSample != nullptr && m.vol <= std::size(chn.pModSample->cues)) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && m.vol <= std::size(chn.pModSample->cues)) { SmpLength offset; if(m.vol == 0) @@ -3132,7 +3132,7 @@ break; case VOLCMD_OFFSET: - if(triggerNote && chn.pModSample && vol <= std::size(chn.pModSample->cues)) + if(triggerNote && chn.pModSample && !chn.pModSample->uFlags[CHN_ADLIB] && vol <= std::size(chn.pModSample->cues)) { SmpLength offset; if(vol == 0) @@ -5452,7 +5452,7 @@ { if(m.vol == 0) offset = Util::muldivr_unsigned(chn.nLength, offset, 256u << (8u * std::max(uint32(1), extendedRows))); // o00 + Oxx = Percentage Offset - else if(m.vol <= std::size(ModSample().cues) && chn.pModSample != nullptr) + else if(m.vol <= std::size(ModSample().cues) && chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB]) offset += chn.pModSample->cues[m.vol - 1]; // Offset relative to cue point chn.oldOffset = offset; } @@ -5774,7 +5774,7 @@ chn.position.Set(0); offset--; - if(chn.pModSample != nullptr && offset >= 0 && offset <= static_cast<int>(std::size(chn.pModSample->cues))) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && offset >= 0 && offset <= static_cast<int>(std::size(chn.pModSample->cues))) { if(offset == 0) offset = chn.oldOffset; |
From: <sv...@op...> - 2025-02-07 22:20:46
|
Author: sagamusix Date: Fri Feb 7 23:20:33 2025 New Revision: 22864 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22864 Log: [Fix] Don't execute sample cues when a channel is actually an Adlib channel. Sample cues share memory with the OPL patch data. Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp Sun Feb 2 21:27:19 2025 (r22863) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp Fri Feb 7 23:20:33 2025 (r22864) @@ -1146,7 +1146,7 @@ startTick = playState.m_nMusicSpeed - 1; } else if(m.volcmd == VOLCMD_OFFSET) { - if(chn.pModSample != nullptr && m.vol <= std::size(chn.pModSample->cues)) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && m.vol <= std::size(chn.pModSample->cues)) { SmpLength offset; if(m.vol == 0) @@ -3343,7 +3343,7 @@ break; case VOLCMD_OFFSET: - if(triggerNote && chn.pModSample && vol <= std::size(chn.pModSample->cues)) + if(triggerNote && chn.pModSample && !chn.pModSample->uFlags[CHN_ADLIB] && vol <= std::size(chn.pModSample->cues)) { SmpLength offset; if(vol == 0) @@ -5668,7 +5668,7 @@ { if(m.vol == 0) offset = Util::muldivr_unsigned(chn.nLength, offset, 256u << (8u * std::max(uint32(1), extendedRows))); // o00 + Oxx = Percentage Offset - else if(m.vol <= std::size(ModSample().cues) && chn.pModSample != nullptr) + else if(m.vol <= std::size(ModSample().cues) && chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB]) offset += chn.pModSample->cues[m.vol - 1]; // Offset relative to cue point chn.oldOffset = offset; } @@ -5993,7 +5993,7 @@ chn.position.Set(0); offset--; - if(chn.pModSample != nullptr && offset >= 0 && offset <= static_cast<int>(std::size(chn.pModSample->cues))) + if(chn.pModSample != nullptr && !chn.pModSample->uFlags[CHN_ADLIB] && offset >= 0 && offset <= static_cast<int>(std::size(chn.pModSample->cues))) { if(offset == 0) offset = chn.oldOffset; |
From: <sv...@op...> - 2025-02-02 20:27:32
|
Author: sagamusix Date: Sun Feb 2 21:27:19 2025 New Revision: 22863 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22863 Log: [Fix] Plugin editors: Avoid bad interaction between resizable window auto-layout code and double-clicking the plugin editor title bar to minimize the client area, in particular for the MIDI I/O plugin. VSTs should not have been affected by this. Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/ResizableDialog.cpp trunk/OpenMPT/mptrack/ResizableDialog.h Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp ============================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp Sat Feb 1 13:19:30 2025 (r22862) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp Sun Feb 2 21:27:19 2025 (r22863) @@ -139,7 +139,8 @@ m_clientHeight = -m_clientHeight; int rcHeight = rcWnd.Height() + m_clientHeight; - SetWindowPos(NULL, 0, 0, + EnableAutoLayout(!m_isMinimized); + SetWindowPos(nullptr, 0, 0, rcWnd.Width(), rcHeight, SWP_NOZORDER | SWP_NOMOVE); } Modified: trunk/OpenMPT/mptrack/ResizableDialog.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ResizableDialog.cpp Sat Feb 1 13:19:30 2025 (r22862) +++ trunk/OpenMPT/mptrack/ResizableDialog.cpp Sun Feb 2 21:27:19 2025 (r22863) @@ -145,7 +145,7 @@ void ResizableDialog::ResizeDynamicLayout() { - if(m_dynamicItems.empty() || IsIconic()) + if(m_dynamicItems.empty() || IsIconic() || !m_enableAutoLayout) return; CRect rectWindow; @@ -166,13 +166,16 @@ void ResizableDialog::OnGetMinMaxInfo(MINMAXINFO *mmi) { - auto size = m_minSize; - if(GetDPI() != m_originalDPI) + if(m_enableAutoLayout) { - size.x = MulDiv(size.x, GetDPI(), m_originalDPI); - size.y = MulDiv(size.y, GetDPI(), m_originalDPI); + auto size = m_minSize; + if(GetDPI() != m_originalDPI) + { + size.x = MulDiv(size.x, GetDPI(), m_originalDPI); + size.y = MulDiv(size.y, GetDPI(), m_originalDPI); + } + mmi->ptMinTrackSize = size; } - mmi->ptMinTrackSize = size; DialogBase::OnGetMinMaxInfo(mmi); } Modified: trunk/OpenMPT/mptrack/ResizableDialog.h ============================================================================== --- trunk/OpenMPT/mptrack/ResizableDialog.h Sat Feb 1 13:19:30 2025 (r22862) +++ trunk/OpenMPT/mptrack/ResizableDialog.h Sun Feb 2 21:27:19 2025 (r22863) @@ -37,6 +37,8 @@ afx_msg void OnGetMinMaxInfo(MINMAXINFO *mmi); + void EnableAutoLayout(bool enable) { m_enableAutoLayout = enable; } + DECLARE_MESSAGE_MAP() private: @@ -47,6 +49,7 @@ CPoint m_minSize; CSize m_originalClientSize; int m_originalDPI = 0; + bool m_enableAutoLayout = true; }; OPENMPT_NAMESPACE_END |
From: <sv...@op...> - 2025-02-01 12:19:38
|
Author: sagamusix Date: Sat Feb 1 13:19:30 2025 New Revision: 22862 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22862 Log: [Imp] Add label to metronome volume setting. Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Mon Jan 27 19:24:00 2025 (r22861) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Sat Feb 1 13:19:30 2025 (r22862) @@ -1783,16 +1783,26 @@ } SetSampleInfo(TrackerSettings::Instance().metronomeSampleMeasure, m_measureCombo, m_measureEdit, m_measureButton); SetSampleInfo(TrackerSettings::Instance().metronomeSampleBeat, m_beatCombo, m_beatEdit, m_beatButton); + GetDlgItem(IDC_VOLUME)->SetWindowText(GetVolumeString()); return TRUE; } +CString MetronomeSettingsDlg::GetVolumeString() const +{ + CString s = (m_volumeSlider.GetPos() >= 0) ? _T("+") : _T(""); + s.AppendFormat(_T("%.2f dB"), m_volumeSlider.GetPos() * METRONOME_VOLUME_SCALE); + return s; +} + + void MetronomeSettingsDlg::OnHScroll(UINT, UINT, CScrollBar *bar) { if(bar == static_cast<CWnd *>(&m_volumeSlider)) { TrackerSettings::Instance().metronomeVolume = m_volumeSlider.GetPos() * METRONOME_VOLUME_SCALE; CMainFrame::GetMainFrame()->UpdateMetronomeVolume(); + GetDlgItem(IDC_VOLUME)->SetWindowText(GetVolumeString()); } } @@ -1892,8 +1902,7 @@ switch(id) { case IDC_SLIDER1: - s = (m_volumeSlider.GetPos() >= 0) ? _T("+") : _T(""); - s.AppendFormat(_T("%.2f dB"), m_volumeSlider.GetPos() * METRONOME_VOLUME_SCALE); + s = GetVolumeString(); break; } Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h Mon Jan 27 19:24:00 2025 (r22861) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h Sat Feb 1 13:19:30 2025 (r22862) @@ -229,6 +229,7 @@ BOOL OnInitDialog() override; CString GetToolTipText(UINT id, HWND hwnd) const override; + CString GetVolumeString() const; void SetSampleInfo(const mpt::PathString &path, CComboBox &combo, CEdit &edit, CButton &browseButton); bool GetSampleInfo(Setting<mpt::PathString> &path, CComboBox &combo, CEdit &edit, CButton &browseButton); mpt::PathString BrowseForSample(const mpt::PathString &path); Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Mon Jan 27 19:24:00 2025 (r22861) +++ trunk/OpenMPT/mptrack/mptrack.rc Sat Feb 1 13:19:30 2025 (r22862) @@ -669,6 +669,7 @@ GROUPBOX "Common Settings",IDC_STATIC,6,6,264,54 CONTROL "&Enable Metronome",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,18,75,10 LTEXT "&Volume:",IDC_STATIC,12,39,26,8 + RTEXT "Static",IDC_VOLUME,210,19,48,8 CONTROL "",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOOLTIPS | WS_TABSTOP,54,36,204,15 GROUPBOX "Measure",IDC_STATIC,6,66,264,55 COMBOBOX IDC_COMBO1,12,78,192,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP Modified: trunk/OpenMPT/mptrack/resource.h ============================================================================== --- trunk/OpenMPT/mptrack/resource.h Mon Jan 27 19:24:00 2025 (r22861) +++ trunk/OpenMPT/mptrack/resource.h Sat Feb 1 13:19:30 2025 (r22862) @@ -728,6 +728,7 @@ #define IDC_DELPLUGIN 2239 #define IDC_AUTOSAVE_USECUSTOMDIR 2245 #define IDC_BUTTON_MODTYPE2 2246 +#define IDC_VOLUME 2247 #define IDC_SLIDER_SAMPLEPREAMP3 2248 #define IDC_SLIDER_GLOBALVOL 2249 #define IDC_EDIT_VSTIVOL 2250 |
From: <sv...@op...> - 2025-01-27 18:24:12
|
Author: sagamusix Date: Mon Jan 27 19:24:00 2025 New Revision: 22861 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22861 Log: Merged revision(s) 22856, 22858 from trunk/OpenMPT: [Ref] ITP: Avoid setting m_nInstruments to invalid value and then resetting it to 0. No functional change, just feels cleaner. ........ [Fix] When adding channels, properly reset master channel association for channels that could previously have been background channels. This caused notes to pan randomly due to NNA age tracking being applied to pattern channels. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Load_itp.cpp branches/OpenMPT-1.31/soundlib/ModChannel.cpp Modified: branches/OpenMPT-1.31/soundlib/Load_itp.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Load_itp.cpp Mon Jan 27 19:20:30 2025 (r22860) +++ branches/OpenMPT-1.31/soundlib/Load_itp.cpp Mon Jan 27 19:24:00 2025 (r22861) @@ -227,12 +227,10 @@ m_MidiCfg.Sanitize(); // Song Instruments - m_nInstruments = static_cast<INSTRUMENTINDEX>(file.ReadUint32LE()); - if(m_nInstruments >= MAX_INSTRUMENTS) - { - m_nInstruments = 0; + if(uint32 numIns = file.ReadUint32LE(); numIns < MAX_INSTRUMENTS) + m_nInstruments = static_cast<INSTRUMENTINDEX>(numIns); + else return false; - } // Instruments' paths if(version <= 0x102) Modified: branches/OpenMPT-1.31/soundlib/ModChannel.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/ModChannel.cpp Mon Jan 27 19:20:30 2025 (r22860) +++ branches/OpenMPT-1.31/soundlib/ModChannel.cpp Mon Jan 27 19:24:00 2025 (r22861) @@ -73,6 +73,7 @@ nVibratoPos = nTremoloPos = nPanbrelloPos = 0; nOldHiOffset = 0; nLeftVU = nRightVU = 0; + nMasterChn = 0; // Custom tuning related m_ReCalculateFreqOnFirstTick = false; |
From: <sv...@op...> - 2025-01-27 18:20:42
|
Author: sagamusix Date: Mon Jan 27 19:20:30 2025 New Revision: 22860 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22860 Log: Merged revision(s) 22859 from trunk/OpenMPT: [Fix] Instrument tab: Crash when trying to remove the only point of an envelope. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/View_ins.cpp Modified: branches/OpenMPT-1.31/mptrack/View_ins.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/View_ins.cpp Mon Jan 27 19:18:45 2025 (r22859) +++ branches/OpenMPT-1.31/mptrack/View_ins.cpp Mon Jan 27 19:20:30 2025 (r22860) @@ -1010,16 +1010,15 @@ m_dcMemMain.MoveTo(x2, y2 - nspace); m_dcMemMain.LineTo(x2, y2 + nspace); } - uint32 maxpoint = EnvGetNumPoints(); + uint32 numPoints = EnvGetNumPoints(); // Drawing Envelope - if(maxpoint) + if(numPoints) { - maxpoint--; m_dcMemMain.SelectObject(GetStockObject(DC_PEN)); m_dcMemMain.SetDCPenColor(TrackerSettings::Instance().rgbCustomColors[MODCOLOR_ENVELOPES]); uint32 releaseNode = EnvGetReleaseNode(); RECT rect; - for(uint32 i = 0; i <= maxpoint; i++) + for(uint32 i = 0; i < numPoints; i++) { int x = PointToScreen(i); int y = ValueToScreen(EnvGetValue(i)); @@ -1080,18 +1079,27 @@ PrepareUndo("Remove Envelope Point"); envelope->erase(envelope->begin() + nPoint); - if (nPoint >= envelope->size()) nPoint = envelope->size() - 1; - if (envelope->nLoopStart > nPoint) envelope->nLoopStart--; - if (envelope->nLoopEnd > nPoint) envelope->nLoopEnd--; - if (envelope->nSustainStart > nPoint) envelope->nSustainStart--; - if (envelope->nSustainEnd > nPoint) envelope->nSustainEnd--; - if (envelope->nReleaseNode>nPoint && envelope->nReleaseNode != ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode--; - envelope->at(0).tick = 0; + if(nPoint >= envelope->size()) + nPoint = envelope->size() - 1; + if(envelope->nLoopStart > nPoint) + envelope->nLoopStart--; + if(envelope->nLoopEnd > nPoint) + envelope->nLoopEnd--; + if(envelope->nSustainStart > nPoint) + envelope->nSustainStart--; + if(envelope->nSustainEnd > nPoint) + envelope->nSustainEnd--; + if(envelope->nReleaseNode > nPoint && envelope->nReleaseNode != ENV_RELEASE_NODE_UNSET) + envelope->nReleaseNode--; if(envelope->size() <= 1) { - // if only one node is left, just disable the envelope completely - *envelope = InstrumentEnvelope(); + // If only one node is left, just disable the envelope completely + mpt::reset(*envelope); + } else + { + // If we removed the first node, make sure that we have a node on tick 0 again + envelope->at(0).tick = 0; } SetModified(InstrumentHint().Envelope(), true); |
From: <sv...@op...> - 2025-01-27 18:18:58
|
Author: sagamusix Date: Mon Jan 27 19:18:45 2025 New Revision: 22859 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22859 Log: [Fix] Instrument tab: Crash when trying to remove the only point of an envelope. Modified: trunk/OpenMPT/mptrack/View_ins.cpp Modified: trunk/OpenMPT/mptrack/View_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp Sun Jan 19 23:08:35 2025 (r22858) +++ trunk/OpenMPT/mptrack/View_ins.cpp Mon Jan 27 19:18:45 2025 (r22859) @@ -1010,16 +1010,15 @@ m_dcMemMain.MoveTo(x2, y2 - nspace); m_dcMemMain.LineTo(x2, y2 + nspace); } - uint32 maxpoint = EnvGetNumPoints(); + uint32 numPoints = EnvGetNumPoints(); // Drawing Envelope - if(maxpoint) + if(numPoints) { - maxpoint--; m_dcMemMain.SelectObject(GetStockObject(DC_PEN)); m_dcMemMain.SetDCPenColor(TrackerSettings::Instance().rgbCustomColors[MODCOLOR_ENVELOPES]); uint32 releaseNode = EnvGetReleaseNode(); RECT rect; - for(uint32 i = 0; i <= maxpoint; i++) + for(uint32 i = 0; i < numPoints; i++) { int x = PointToScreen(i); int y = ValueToScreen(EnvGetValue(i)); @@ -1080,18 +1079,27 @@ PrepareUndo("Remove Envelope Point"); envelope->erase(envelope->begin() + nPoint); - if (nPoint >= envelope->size()) nPoint = envelope->size() - 1; - if (envelope->nLoopStart > nPoint) envelope->nLoopStart--; - if (envelope->nLoopEnd > nPoint) envelope->nLoopEnd--; - if (envelope->nSustainStart > nPoint) envelope->nSustainStart--; - if (envelope->nSustainEnd > nPoint) envelope->nSustainEnd--; - if (envelope->nReleaseNode>nPoint && envelope->nReleaseNode != ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode--; - envelope->at(0).tick = 0; + if(nPoint >= envelope->size()) + nPoint = envelope->size() - 1; + if(envelope->nLoopStart > nPoint) + envelope->nLoopStart--; + if(envelope->nLoopEnd > nPoint) + envelope->nLoopEnd--; + if(envelope->nSustainStart > nPoint) + envelope->nSustainStart--; + if(envelope->nSustainEnd > nPoint) + envelope->nSustainEnd--; + if(envelope->nReleaseNode > nPoint && envelope->nReleaseNode != ENV_RELEASE_NODE_UNSET) + envelope->nReleaseNode--; if(envelope->size() <= 1) { - // if only one node is left, just disable the envelope completely - *envelope = InstrumentEnvelope(); + // If only one node is left, just disable the envelope completely + mpt::reset(*envelope); + } else + { + // If we removed the first node, make sure that we have a node on tick 0 again + envelope->at(0).tick = 0; } SetModified(InstrumentHint().Envelope(), true); |
From: <sv...@op...> - 2025-01-19 22:08:47
|
Author: sagamusix Date: Sun Jan 19 23:08:35 2025 New Revision: 22858 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22858 Log: [Fix] When adding channels, properly reset master channel association for channels that could previously have been background channels. This caused notes to pan randomly due to NNA age tracking being applied to pattern channels. Modified: trunk/OpenMPT/soundlib/ModChannel.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/soundlib/ModChannel.cpp ============================================================================== --- trunk/OpenMPT/soundlib/ModChannel.cpp Sun Jan 19 20:31:50 2025 (r22857) +++ trunk/OpenMPT/soundlib/ModChannel.cpp Sun Jan 19 23:08:35 2025 (r22858) @@ -83,6 +83,7 @@ nLeftVU = nRightVU = 0; nOldExtraFinePortaUpDown = nOldFinePortaUpDown = nOldPortaDown = nOldPortaUp = 0; portamentoSlide = 0; + nMasterChn = 0; // Custom tuning related m_ReCalculateFreqOnFirstTick = false; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp Sun Jan 19 20:31:50 2025 (r22857) +++ trunk/OpenMPT/soundlib/Sndmix.cpp Sun Jan 19 23:08:35 2025 (r22858) @@ -2180,7 +2180,7 @@ chn.nROfs = chn.nLOfs = 0; } // Increment age of NNA channels - if(chn.nMasterChn && chn.nnaChannelAge < Util::MaxValueOfType(chn.nnaChannelAge)) + if(chn.nMasterChn && nChn < GetNumChannels() && chn.nnaChannelAge < Util::MaxValueOfType(chn.nnaChannelAge)) chn.nnaChannelAge++; // Check for unused channel if(chn.dwFlags[CHN_MUTE] || (nChn >= GetNumChannels() && !chn.nLength)) |
From: <sv...@op...> - 2025-01-19 19:31:59
|
Author: sagamusix Date: Sun Jan 19 20:31:50 2025 New Revision: 22857 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22857 Log: [Fix] MED: If an IFFOCT instrument has sample loop information in the extra data, the sample loop points must be doubled with each sample, just like with the normal loop data. Modified: trunk/OpenMPT/soundlib/Load_med.cpp Modified: trunk/OpenMPT/soundlib/Load_med.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp Wed Jan 15 18:24:06 2025 (r22856) +++ trunk/OpenMPT/soundlib/Load_med.cpp Sun Jan 19 20:31:50 2025 (r22857) @@ -1285,6 +1285,8 @@ } #endif // MPT_WITH_VST + loopStart = instrExt.loopStart; + loopEnd = instrExt.loopStart + instrExt.loopLength; for(SAMPLEINDEX i = 0; i < numSamples; i++) { ModSample &sample = Samples[smp + i]; @@ -1292,8 +1294,10 @@ if(!isSynth && size > offsetof(MMDInstrExt, loopLength)) { - sample.nLoopStart = instrExt.loopStart; - sample.nLoopEnd = instrExt.loopStart + instrExt.loopLength; + sample.nLoopStart = loopStart; + sample.nLoopEnd = loopEnd; + loopStart *= 2; + loopEnd *= 2; } if(size > offsetof(MMDInstrExt, instrFlags)) { |
From: <sv...@op...> - 2025-01-15 17:24:21
|
Author: sagamusix Date: Wed Jan 15 18:24:06 2025 New Revision: 22856 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22856 Log: [Ref] ITP: Avoid setting m_nInstruments to invalid value and then resetting it to 0. No functional change, just feels cleaner. Modified: trunk/OpenMPT/soundlib/Load_itp.cpp Modified: trunk/OpenMPT/soundlib/Load_itp.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp Wed Jan 15 18:23:23 2025 (r22855) +++ trunk/OpenMPT/soundlib/Load_itp.cpp Wed Jan 15 18:24:06 2025 (r22856) @@ -222,12 +222,10 @@ m_MidiCfg.Sanitize(); // Song Instruments - m_nInstruments = static_cast<INSTRUMENTINDEX>(file.ReadUint32LE()); - if(m_nInstruments >= MAX_INSTRUMENTS) - { - m_nInstruments = 0; + if(uint32 numIns = file.ReadUint32LE(); numIns < MAX_INSTRUMENTS) + m_nInstruments = static_cast<INSTRUMENTINDEX>(numIns); + else return false; - } // Instruments' paths if(version <= 0x102) |
From: <sv...@op...> - 2025-01-15 17:23:37
|
Author: sagamusix Date: Wed Jan 15 18:23:23 2025 New Revision: 22855 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22855 Log: [Imp] IT: Enable Envelope Carry fix for recent Schism Tracker builds as well. Modified: trunk/OpenMPT/soundlib/Load_it.cpp Modified: trunk/OpenMPT/soundlib/Load_it.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp Thu Jan 9 21:12:05 2025 (r22854) +++ trunk/OpenMPT/soundlib/Load_it.cpp Wed Jan 15 18:23:23 2025 (r22855) @@ -1317,6 +1317,7 @@ {SchismVersionFromDate<2024, 5, 12>::date, kITEmptyNoteMapSlotIgnoreCell }, // https://github.com/schismtracker/schismtracker/commit/aa84148e019a65f3d52ecd33fd84bfecfdb87bf4 {SchismVersionFromDate<2024, 5, 27>::date, kITOffsetWithInstrNumber }, // https://github.com/schismtracker/schismtracker/commit/9237960d45079a54ad73f87bacfe5dd8ae82e273 {SchismVersionFromDate<2024, 10, 13>::date, kITDoublePortamentoSlides }, // https://github.com/schismtracker/schismtracker/commit/223e327d9448561931b8cac8a55180286b17276c + {SchismVersionFromDate<2025, 1, 8>::date, kITCarryAfterNoteOff }, // https://github.com/schismtracker/schismtracker/commit/ff7a817df327c8f13d97b8c6546a9329f59edff8 }; for(const auto &quirk : SchismQuirks) { |
From: <sv...@op...> - 2025-01-09 20:12:21
|
Author: sagamusix Date: Thu Jan 9 21:12:05 2025 New Revision: 22854 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22854 Log: Merged revision(s) 22852-22853 from trunk/OpenMPT: [Doc] Update HTMLHelp path documentation. ........ [Fix] If multiple keyboard layouts were installed, scancode conversion could be based on the wrong layout, causing e.g. B-4 and Note-Off keys to be swapped on a setup with active US keyboard layout but also a German layout being present. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/CommandSet.cpp branches/OpenMPT-1.31/mptrack/manual_generator/readme.txt Modified: branches/OpenMPT-1.31/mptrack/CommandSet.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/CommandSet.cpp Thu Jan 9 21:11:38 2025 (r22853) +++ branches/OpenMPT-1.31/mptrack/CommandSet.cpp Thu Jan 9 21:12:05 2025 (r22854) @@ -511,6 +511,15 @@ }; // clang-format on +std::vector<HKL> GetKeyboardLayouts() +{ + std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); + GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + // GetKeyboardLayoutList appears to return the layouts in no particular order. Always force the active layout to be evaluated first. + layouts.insert(layouts.begin(), GetKeyboardLayout(0)); + return layouts; +} + }; // namespace #ifdef MPT_ALL_LOGGING @@ -2127,8 +2136,7 @@ "//----------------------------------------------------------------------\n" "version:" << mpt::ToCharset(mpt::Charset::ASCII, Version::Current().ToUString()) << "\n"; - std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); - GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + const std::vector<HKL> layouts = GetKeyboardLayouts(); for(int ctx = 0; ctx < kCtxMaxInputContexts; ctx++) { @@ -2185,8 +2193,7 @@ CString errText; int errorCount = 0; - std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); - GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + const std::vector<HKL> layouts = GetKeyboardLayouts(); const std::string whitespace(" \n\r\t"); while(iStrm.getline(s, std::size(s))) @@ -2330,8 +2337,7 @@ QuickChange_SetEffects(*specs); } - std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); - GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + const std::vector<HKL> layouts = GetKeyboardLayouts(); const auto previousVersion = TrackerSettings::Instance().PreviousSettingsVersion; @@ -2558,8 +2564,7 @@ { // Hack for situations where a non-latin keyboard layout without A...Z key code mapping may the current layout (e.g. Russian), // but a latin layout (e.g. EN-US) is installed as well. - std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); - GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + const std::vector<HKL> layouts = GetKeyboardLayouts(); SHORT codeNmod = -1; for(auto i = layouts.begin(); i != layouts.end() && codeNmod == -1; i++) { Modified: branches/OpenMPT-1.31/mptrack/manual_generator/readme.txt ============================================================================== --- branches/OpenMPT-1.31/mptrack/manual_generator/readme.txt Thu Jan 9 21:11:38 2025 (r22853) +++ branches/OpenMPT-1.31/mptrack/manual_generator/readme.txt Thu Jan 9 21:12:05 2025 (r22854) @@ -1,5 +1,5 @@ Prerequisites: -- HTML Help Workshop must be placed in the directory "include\htmlhelp" +- HTML Help Workshop must be placed in the directory "..\..\build\tools\htmlhelp" (build\download_externals.cmd will take care of that) - Python 3 |
From: <sv...@op...> - 2025-01-09 20:11:45
|
Author: sagamusix Date: Thu Jan 9 21:11:38 2025 New Revision: 22853 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22853 Log: [Fix] If multiple keyboard layouts were installed, scancode conversion could be based on the wrong layout, causing e.g. B-4 and Note-Off keys to be swapped on a setup with active US keyboard layout but also a German layout being present. Modified: trunk/OpenMPT/mptrack/CommandSet.cpp Modified: trunk/OpenMPT/mptrack/CommandSet.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp Thu Jan 9 19:35:13 2025 (r22852) +++ trunk/OpenMPT/mptrack/CommandSet.cpp Thu Jan 9 21:11:38 2025 (r22853) @@ -45,6 +45,15 @@ {kcCommentsStartNotes, kcCommentsStartNoteStops}, }; +std::vector<HKL> GetKeyboardLayouts() +{ + std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); + GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + // GetKeyboardLayoutList appears to return the layouts in no particular order. Always force the active layout to be evaluated first. + layouts.insert(layouts.begin(), GetKeyboardLayout(0)); + return layouts; +} + }; // namespace #ifdef MPT_ALL_LOGGING @@ -1685,8 +1694,7 @@ "//----------------------------------------------------------------------\n" "version:" << mpt::ToCharset(mpt::Charset::ASCII, Version::Current().ToUString()) << "\n"; - std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); - GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + const std::vector<HKL> layouts = GetKeyboardLayouts(); for(int ctx = 0; ctx < kCtxMaxInputContexts; ctx++) { @@ -1743,8 +1751,7 @@ CString errText; int errorCount = 0; - std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); - GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + const std::vector<HKL> layouts = GetKeyboardLayouts(); const std::string whitespace(" \n\r\t"); while(iStrm.getline(s, std::size(s))) @@ -1911,8 +1918,7 @@ QuickChange_SetEffects(*specs); } - std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); - GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + const std::vector<HKL> layouts = GetKeyboardLayouts(); mpt::span<const DefaultKeybinding> defaults; switch(preset) @@ -2172,8 +2178,7 @@ { // Hack for situations where a non-latin keyboard layout without A...Z key code mapping may the current layout (e.g. Russian), // but a latin layout (e.g. EN-US) is installed as well. - std::vector<HKL> layouts(GetKeyboardLayoutList(0, nullptr)); - GetKeyboardLayoutList(static_cast<int>(layouts.size()), layouts.data()); + const std::vector<HKL> layouts = GetKeyboardLayouts(); SHORT codeNmod = -1; for(auto i = layouts.begin(); i != layouts.end() && codeNmod == -1; i++) { |
From: <sv...@op...> - 2025-01-09 18:35:20
|
Author: sagamusix Date: Thu Jan 9 19:35:13 2025 New Revision: 22852 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22852 Log: [Doc] Update HTMLHelp path documentation. Modified: trunk/OpenMPT/mptrack/manual_generator/readme.txt Modified: trunk/OpenMPT/mptrack/manual_generator/readme.txt ============================================================================== --- trunk/OpenMPT/mptrack/manual_generator/readme.txt Thu Jan 9 19:29:42 2025 (r22851) +++ trunk/OpenMPT/mptrack/manual_generator/readme.txt Thu Jan 9 19:35:13 2025 (r22852) @@ -1,5 +1,5 @@ Prerequisites: -- HTML Help Workshop must be placed in the directory "include\htmlhelp" +- HTML Help Workshop must be placed in the directory "..\..\build\tools\htmlhelp" (build\download_externals.cmd will take care of that) - Python 3 |
From: <sv...@op...> - 2025-01-09 18:29:55
|
Author: sagamusix Date: Thu Jan 9 19:29:42 2025 New Revision: 22851 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22851 Log: Merged revision(s) 22850 from trunk/OpenMPT: [Var] Update manual generator to cope with MediaWiki 1.43 output. CSS now uses variables in a few places, which the CHM viewer (probably still using IE10 under the hood) does not comprehend. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/manual_generator/wiki.py Modified: branches/OpenMPT-1.31/mptrack/manual_generator/wiki.py ============================================================================== --- branches/OpenMPT-1.31/mptrack/manual_generator/wiki.py Thu Jan 9 19:15:25 2025 (r22850) +++ branches/OpenMPT-1.31/mptrack/manual_generator/wiki.py Thu Jan 9 19:29:42 2025 (r22851) @@ -17,10 +17,11 @@ shutil.rmtree('html', ignore_errors=True) shutil.copytree('source', 'html') -style = urlopen(base_url + '/load.php?debug=false&lang=en&modules=mediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.page.gallery.styles%7Cmediawiki.skinning.interface%7Cskins.vector.styles%7Csite.styles&only=styles&skin=vector').read().decode('UTF-8') +style = urlopen(base_url + '/load.php?debug=false&lang=en&modules=mediawiki.page.gallery.styles%7Cmediawiki.skinning.interface%7Cskins.vector.styles%7Csite.styles&only=styles&skin=vector').read().decode('UTF-8') # Remove a few unused CSS classes style = re.sub(r'\}(\w+)?[\.#]vector([\w >]+)\{.+?\}', '}', style) +style = re.sub(r'var\([A-Za-z\-]+,([^)]*)\)', '\\1', style) style_file = open('html/style.css', 'w') style_file.write(style) style_file.close() |
From: <sv...@op...> - 2025-01-09 18:15:38
|
Author: sagamusix Date: Thu Jan 9 19:15:25 2025 New Revision: 22850 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22850 Log: [Var] Update manual generator to cope with MediaWiki 1.43 output. CSS now uses variables in a few places, which the CHM viewer (probably still using IE10 under the hood) does not comprehend. Modified: trunk/OpenMPT/mptrack/manual_generator/wiki.py Modified: trunk/OpenMPT/mptrack/manual_generator/wiki.py ============================================================================== --- trunk/OpenMPT/mptrack/manual_generator/wiki.py Wed Jan 8 18:17:22 2025 (r22849) +++ trunk/OpenMPT/mptrack/manual_generator/wiki.py Thu Jan 9 19:15:25 2025 (r22850) @@ -17,10 +17,11 @@ shutil.rmtree('html', ignore_errors=True) shutil.copytree('source', 'html') -style = urlopen(base_url + '/load.php?debug=false&lang=en&modules=mediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.page.gallery.styles%7Cmediawiki.skinning.interface%7Cskins.vector.styles%7Csite.styles&only=styles&skin=vector').read().decode('UTF-8') +style = urlopen(base_url + '/load.php?debug=false&lang=en&modules=mediawiki.page.gallery.styles%7Cmediawiki.skinning.interface%7Cskins.vector.styles%7Csite.styles&only=styles&skin=vector').read().decode('UTF-8') # Remove a few unused CSS classes style = re.sub(r'\}(\w+)?[\.#]vector([\w >]+)\{.+?\}', '}', style) +style = re.sub(r'var\([A-Za-z\-]+,([^)]*)\)', '\\1', style) style_file = open('html/style.css', 'w') style_file.write(style) style_file.close() |
From: <sv...@op...> - 2025-01-08 17:17:35
|
Author: sagamusix Date: Wed Jan 8 18:17:22 2025 New Revision: 22849 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22849 Log: [Fix] IT compatibility: Envelope Carry should not be influenced by a previous note-off. Fixes bridge.it by rs3 (https://www.un4seen.com/forum/?topic=15448.msg144272#msg144272). [Mod] OpenMPT: Version is now 1.32.00.40 Modified: trunk/OpenMPT/common/versionNumber.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/UpgradeModule.cpp Modified: trunk/OpenMPT/common/versionNumber.h ============================================================================== --- trunk/OpenMPT/common/versionNumber.h Wed Jan 8 16:40:37 2025 (r22848) +++ trunk/OpenMPT/common/versionNumber.h Wed Jan 8 18:17:22 2025 (r22849) @@ -16,4 +16,4 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 32 #define VER_MINOR 00 -#define VER_MINORMINOR 39 +#define VER_MINORMINOR 40 Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp Wed Jan 8 16:40:37 2025 (r22848) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp Wed Jan 8 18:17:22 2025 (r22849) @@ -752,6 +752,7 @@ case kFT2AutoVibratoAbortSweep: desc = _T("Key-off before auto-vibrato sweep-in is complete resets auto-vibrato depth"); break; case kLegacyPPQpos: desc = _T("Report inaccurate PPQ position to VST plugins (like OpenMPT 1.31 and older)"); break; case kLegacyPluginNNABehaviour: desc = _T("Plugin notes with New Note Action set to Continue are affected by note-offs (like OpenMPT 1.31 and older)"); break; + case kITCarryAfterNoteOff: desc = _T("Note-Off status does not influence Envelope Carry behaviour"); break; default: MPT_ASSERT_NOTREACHED(); } Modified: trunk/OpenMPT/soundlib/Snd_defs.h ============================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h Wed Jan 8 16:40:37 2025 (r22848) +++ trunk/OpenMPT/soundlib/Snd_defs.h Wed Jan 8 18:17:22 2025 (r22849) @@ -615,6 +615,7 @@ kFT2AutoVibratoAbortSweep, // Key-off before auto-vibrato sweep-in is complete resets auto-vibrato depth kLegacyPPQpos, // Report fake PPQ position to VST plugins kLegacyPluginNNABehaviour, // Plugin notes with NNA=continue are affected by note-offs etc. + kITCarryAfterNoteOff, // Envelope Carry continues to function as normal even after note-off // Add new play behaviours here. Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp Wed Jan 8 16:40:37 2025 (r22848) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp Wed Jan 8 18:17:22 2025 (r22849) @@ -1643,10 +1643,12 @@ reset = (!chn.nLength || (insNumber && bPorta && m_SongFlags[SONG_ITCOMPATGXX]) || (insNumber && !bPorta && chn.dwFlags[CHN_NOTEFADE | CHN_KEYOFF] && m_SongFlags[SONG_ITOLDEFFECTS])); - // NOTE: IT2.14 with SB/GUS/etc. output is different. We are going after IT's WAV writer here. - // For SB/GUS/etc. emulation, envelope carry should only apply when the NNA isn't set to "Note Cut". + // NOTE: Carry behaviour is not consistent between IT drivers. + // If NNA is set to "Note Cut", carry only works if the driver uses volume ramping on cut notes. + // This means that the normal SB and GUS drivers behave differently than what is implemented here. + // We emulate IT's WAV writer and SB16 MMX driver instead. // Test case: CarryNNA.it - resetAlways = (!chn.nFadeOutVol || instrumentChanged || chn.dwFlags[CHN_KEYOFF]); + resetAlways = !chn.nFadeOutVol || instrumentChanged || (m_playBehaviour[kITCarryAfterNoteOff] ? !chn.rowCommand.IsNote() : chn.dwFlags[CHN_KEYOFF]); } else { reset = (!bPorta || !(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_DBM)) || m_SongFlags[SONG_ITCOMPATGXX] Modified: trunk/OpenMPT/soundlib/Sndfile.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp Wed Jan 8 16:40:37 2025 (r22848) +++ trunk/OpenMPT/soundlib/Sndfile.cpp Wed Jan 8 18:17:22 2025 (r22849) @@ -1224,6 +1224,7 @@ playBehaviour.set(kITEmptyNoteMapSlotIgnoreCell); playBehaviour.set(kITOffsetWithInstrNumber); playBehaviour.set(kITDoublePortamentoSlides); + playBehaviour.set(kITCarryAfterNoteOff); break; case MOD_TYPE_XM: Modified: trunk/OpenMPT/soundlib/UpgradeModule.cpp ============================================================================== --- trunk/OpenMPT/soundlib/UpgradeModule.cpp Wed Jan 8 16:40:37 2025 (r22848) +++ trunk/OpenMPT/soundlib/UpgradeModule.cpp Wed Jan 8 18:17:22 2025 (r22849) @@ -602,6 +602,7 @@ { kITEmptyNoteMapSlotIgnoreCell, MPT_V("1.32.00.13") }, { kITOffsetWithInstrNumber, MPT_V("1.32.00.15") }, { kITDoublePortamentoSlides, MPT_V("1.32.00.27") }, + { kITCarryAfterNoteOff, MPT_V("1.32.00.40") }, }; for(const auto &b : behaviours) |
From: <sv...@op...> - 2025-01-08 15:40:50
|
Author: sagamusix Date: Wed Jan 8 16:40:37 2025 New Revision: 22848 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22848 Log: [Imp] xmp-openmpt: Improve loop behaviour: If a module has a restart position that's not the song start, always assume that it should loop. If it doesn't, apply behaviour similar to XMPlay's auto-looping: If the last 2ms of audio are mostly non-silent, assume that it should loop. Modified: trunk/OpenMPT/libopenmpt/xmp-openmpt/xmp-openmpt.cpp Modified: trunk/OpenMPT/libopenmpt/xmp-openmpt/xmp-openmpt.cpp ============================================================================== --- trunk/OpenMPT/libopenmpt/xmp-openmpt/xmp-openmpt.cpp Tue Jan 7 16:25:32 2025 (r22847) +++ trunk/OpenMPT/libopenmpt/xmp-openmpt/xmp-openmpt.cpp Wed Jan 8 16:40:37 2025 (r22848) @@ -150,15 +150,19 @@ struct self_xmplay_t { std::vector<double> subsong_lengths; + std::vector<float> last_audio_frames; std::vector<std::string> subsong_names; std::size_t samplerate = 48000; std::size_t num_channels = 2; + std::size_t last_audio_frames_write_pos = 0; xmp_openmpt_settings settings; openmpt::module_ext * mod = nullptr; bool set_format_called = false; openmpt::ext::pattern_vis * pattern_vis = nullptr; std::int32_t tempo_factor = 0, pitch_factor = 0; + std::int32_t subsong_start_order = 0, subsong_start_row = 0; bool single_subsong_mode = false; + bool end_of_song_reached = false; self_xmplay_t() { settings.changed = apply_and_save_options; } @@ -994,8 +998,14 @@ self->subsong_lengths = build_subsong_lengths( *self->mod ); self->subsong_names = self->mod->get_subsong_names(); self->mod->select_subsong( 0 ); + self->subsong_start_order = self->mod->get_current_order(); + self->subsong_start_row = self->mod->get_current_row(); self->tempo_factor = 0; self->pitch_factor = 0; + self->end_of_song_reached = false; + self->single_subsong_mode = false; + self->last_audio_frames.assign( self->last_audio_frames.size(), 0.0f ); + self->last_audio_frames_write_pos = 0; xmpfin->SetLength( static_cast<float>( self->subsong_lengths[0] ), TRUE ); return 2; @@ -1054,6 +1064,7 @@ } form->res = 4; // float form->chanmask = 0; + self->last_audio_frames.assign( self->samplerate / 500, 0.0f ); } // get the tags @@ -1176,13 +1187,29 @@ // In the auto-looping case, the function should only loop when a loop has been detected, and otherwise return -1 // If the time of the loop start position is known, that should be returned, otherwise -2 can be returned to let the time run on. // There is currently no way to easily figure out at which time the loop restarts. - return -2; + self->end_of_song_reached = false; + if (self->mod->get_restart_order(self->mod->get_selected_subsong()) != self->subsong_start_order || self->mod->get_restart_row(self->mod->get_selected_subsong()) != self->subsong_start_row) { + return -2; + } else { + // Similar to XMPlay's auto-looping: If the last 2ms of audio are above -33dB RMS (roughly), we assume that the track is meant to loop. + float rms = 0.0f; + for ( const float v : self->last_audio_frames ) { + rms += v; // v is already squared + } + if ( std::sqrt( rms / self->last_audio_frames.size() ) >= 0.02f) + return -2; + else + return -1; // Let XMPlay's "auto-loop any track ending with sound" feature decide + } } if ( pos & XMPIN_POS_SUBSONG ) { self->single_subsong_mode = ( pos & XMPIN_POS_SUBSONG1 ) != 0; + self->last_audio_frames.assign( self->last_audio_frames.size(), 0.0f ); const int32_t subsong = pos & 0xffff; try { self->mod->select_subsong( subsong ); + self->subsong_start_order = self->mod->get_current_order(); + self->subsong_start_row = self->mod->get_current_row(); } catch ( ... ) { return 0.0; } @@ -1193,6 +1220,7 @@ return 0.0; } double new_position = self->mod->set_position_seconds( static_cast<double>( pos ) * 0.001 ); + self->last_audio_frames.assign(self->last_audio_frames.size(), 0.0f); reset_timeinfos( new_position ); return new_position; } @@ -1211,39 +1239,57 @@ if ( !self->mod || self->num_channels == 0 ) { return 0; } + if (self->end_of_song_reached) { + self->end_of_song_reached = false; + return 0; + } update_timeinfos( self->samplerate, 0 ); std::size_t frames = count / self->num_channels; std::size_t frames_to_render = frames; std::size_t frames_rendered = 0; while ( frames_to_render > 0 ) { std::size_t frames_chunk = std::min( frames_to_render, static_cast<std::size_t>( ( self->samplerate + 99 ) / 100 ) ); // 100 Hz timing info update interval + std::size_t frames_read = 0; switch ( self->num_channels ) { case 1: { - frames_chunk = self->mod->read( self->samplerate, frames_chunk, dstbuf ); + frames_read = self->mod->read( self->samplerate, frames_chunk, dstbuf ); + for ( std::size_t i = 0; i < frames_read; i++ ) { + self->last_audio_frames[self->last_audio_frames_write_pos++] = dstbuf[i] * dstbuf[i]; + if ( self->last_audio_frames_write_pos >= self->last_audio_frames.size() ) + self->last_audio_frames_write_pos = 0; + } } break; case 2: { - frames_chunk = self->mod->read_interleaved_stereo( self->samplerate, frames_chunk, dstbuf ); + frames_read = self->mod->read_interleaved_stereo( self->samplerate, frames_chunk, dstbuf ); + for ( std::size_t i = 0; i < frames_read * 2; i += 2 ) { + self->last_audio_frames[self->last_audio_frames_write_pos++] = (dstbuf[i] * dstbuf[i] + dstbuf[i + 1] * dstbuf[i + 1]) / 2; + if ( self->last_audio_frames_write_pos >= self->last_audio_frames.size() ) + self->last_audio_frames_write_pos = 0; + } } break; case 4: { - frames_chunk = self->mod->read_interleaved_quad( self->samplerate, frames_chunk, dstbuf ); + frames_read = self->mod->read_interleaved_quad( self->samplerate, frames_chunk, dstbuf ); + for ( std::size_t i = 0; i < frames_read * 4; i += 4 ) { + self->last_audio_frames[self->last_audio_frames_write_pos++] = ( dstbuf[i] * dstbuf[i] + dstbuf[i + 1] * dstbuf[i + 1] + dstbuf[i + 2] * dstbuf[i + 2] + dstbuf[i + 3] * dstbuf[i + 3]) / 4; + if ( self->last_audio_frames_write_pos >= self->last_audio_frames.size() ) + self->last_audio_frames_write_pos = 0; + } } break; } - dstbuf += frames_chunk * self->num_channels; - if ( frames_chunk == 0 ) { + dstbuf += frames_read * self->num_channels; + update_timeinfos( self->samplerate, frames_read ); + frames_to_render -= frames_read; + frames_rendered += frames_read; + if ( frames_read < frames_chunk ) { + self->end_of_song_reached = true; break; } - update_timeinfos( self->samplerate, frames_chunk ); - frames_to_render -= frames_chunk; - frames_rendered += frames_chunk; - } - if ( frames_rendered == 0 ) { - return 0; } return frames_rendered * self->num_channels; } @@ -1692,7 +1738,7 @@ #endif static XMPIN xmpin = { - XMPIN_FLAG_CONFIG | XMPIN_FLAG_LOOP, + XMPIN_FLAG_CONFIG | XMPIN_FLAG_LOOP, // Add XMPIN_FLAG_LOOPSOUND to let XMPlay automatically determine whether the song should loop when returning -1 from openmpt_SetPosition xmp_openmpt_string, nullptr, // "libopenmpt\0mptm/mptmz", openmpt_About, @@ -1729,7 +1775,7 @@ openmpt_GetConfig, openmpt_SetConfig, - nullptr + nullptr // Options }; static const char * xmp_openmpt_default_exts = "OpenMPT\0mptm/mptmz"; |
From: <sv...@op...> - 2025-01-07 15:25:44
|
Author: manx Date: Tue Jan 7 16:25:32 2025 New Revision: 22847 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22847 Log: Merged revision(s) 22845 from trunk/OpenMPT: [Fix] UnRAR: Work-around MSVC compiler hang on ARM64EC. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/include/unrar/OpenMPT.txt branches/OpenMPT-1.31/include/unrar/os.hpp Modified: branches/OpenMPT-1.31/include/unrar/OpenMPT.txt ============================================================================== --- branches/OpenMPT-1.31/include/unrar/OpenMPT.txt Tue Jan 7 16:25:07 2025 (r22846) +++ branches/OpenMPT-1.31/include/unrar/OpenMPT.txt Tue Jan 7 16:25:32 2025 (r22847) @@ -4,6 +4,7 @@ existing lines were edited; only new lines were added. os.hpp has been modified to support Clang/LLVM for Windows. Work-arounds for tiny problems with Clang/C2 have been implemented. +Work-arounds for ARM64EC compiler bugs have been implemented. Added lines can be found by looking for "// OPENMPT ADDITION" comments. Optimizations have been done to elimiate effectively dead code that would Modified: branches/OpenMPT-1.31/include/unrar/os.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/os.hpp Tue Jan 7 16:25:07 2025 (r22846) +++ branches/OpenMPT-1.31/include/unrar/os.hpp Tue Jan 7 16:25:32 2025 (r22847) @@ -78,11 +78,14 @@ // Use SSE only for x86/x64, not ARM Windows. #if !defined(__clang__) // OPENMPT ADDITION +#if !defined(_M_ARM64EC) // OPENMPT ADDITION +// MSVC enters an infinite loop when compiling blake2s.cpp in ARM64EC mode with SSE intrinsics enabled. // OPENMPT ADDITION #if defined(_M_IX86) || defined(_M_X64) #define USE_SSE #define SSE_ALIGNMENT 16 #endif #endif // OPENMPT ADDITION +#endif // OPENMPT ADDITION #include <stdio.h> #include <stdlib.h> |