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
(134) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <sv...@op...> - 2025-01-01 16:19:31
|
Author: sagamusix Date: Wed Jan 1 17:19:24 2025 New Revision: 22683 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22683 Log: [Ref] Silence warning. Modified: trunk/OpenMPT/mptrack/DialogBase.cpp Modified: trunk/OpenMPT/mptrack/DialogBase.cpp ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.cpp Wed Jan 1 16:32:09 2025 (r22682) +++ trunk/OpenMPT/mptrack/DialogBase.cpp Wed Jan 1 17:19:24 2025 (r22683) @@ -114,7 +114,7 @@ if(s.IsEmpty()) return FALSE; - if(s.GetLength() < std::size(pTTT->szText)) + if(s.GetLength() < static_cast<int>(std::size(pTTT->szText))) { mpt::String::WriteCStringBuf(pTTT->szText) = s; } else |
From: <sv...@op...> - 2025-01-01 15:32:22
|
Author: sagamusix Date: Wed Jan 1 16:32:09 2025 New Revision: 22682 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22682 Log: [Ref] Reduce duplicated code by moving framework-level tooltip handling to DialogBase class. [Fix] Pattern tab: Channel Manager tooltip didn't show keyboard shortcut if one was assigned, because it was the only button with a control ID < 1000 and thus ran into an ancient code path (that was removed as part of the refacotring) that overrode our custom tooltips. [Imp] Pattern tab: Show toolstips when sequence controls are disabled, and add tooltip to pattern detail level button. Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/mptrack/ChannelManagerDlg.h trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/CleanupSong.h trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_gen.h trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Ctrl_smp.h trunk/OpenMPT/mptrack/DialogBase.cpp trunk/OpenMPT/mptrack/DialogBase.h trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/Globals.h trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp trunk/OpenMPT/mptrack/MIDIMappingDialog.h trunk/OpenMPT/mptrack/OPLInstrDlg.cpp trunk/OpenMPT/mptrack/OPLInstrDlg.h trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/QuickStartDialog.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.h trunk/OpenMPT/mptrack/TempoSwingDialog.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -50,8 +50,6 @@ ON_COMMAND(IDC_BUTTON8, &CChannelManagerDlg::OnRestore) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CChannelManagerDlg::OnTabSelchange) - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CChannelManagerDlg::OnToolTipText) - END_MESSAGE_MAP() CChannelManagerDlg * CChannelManagerDlg::sharedInstance_ = nullptr; @@ -173,7 +171,6 @@ m_buttonHeight = HighDPISupport::ScalePixels(CM_BT_HEIGHT, m_hWnd); ::ShowWindow(::GetDlgItem(m_hWnd, IDC_BUTTON1), SW_HIDE); - EnableToolTips(); ResetState(true, true, true, true); @@ -202,14 +199,13 @@ } -BOOL CChannelManagerDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *) +CString CChannelManagerDlg::GetToolTipText(UINT id, HWND hwnd) const { - TOOLTIPTEXT *pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - if((pTTT->uFlags & TTF_IDISHWND) || !m_ModDoc || pNMHDR->idFrom >= m_states.size()) - return FALSE; - CString text; - const CHANNELINDEX chn = m_states[pNMHDR->idFrom].sourceChn; + if(hwnd || !m_ModDoc || id >= m_states.size()) + return text; + + const CHANNELINDEX chn = m_states[id].sourceChn; const auto &chnSettings = m_ModDoc->GetSoundFile().ChnSettings[chn]; if(!chnSettings.szName.empty()) text = MPT_CFORMAT("{}: {}")(chn + 1, mpt::ToWin(m_ModDoc->GetSoundFile().GetCharsetInternal(), chnSettings.szName)); @@ -233,15 +229,14 @@ text += chnSettings.dwFlags[CHN_NOFX] ? _T(" (Plugins Bypassed)") : _T(" (Plugins Enabled)"); break; case kReorderRemove: - if(m_states[pNMHDR->idFrom].removed) + if(m_states[id].removed) text += _T(" (Marked for Removal)"); break; case kNumTabs: MPT_ASSERT_NOTREACHED(); break; } - mpt::String::WriteCStringBuf(pTTT->szText) = text; - return TRUE; + return text; } Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.h ============================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.h Wed Jan 1 16:32:09 2025 (r22682) @@ -100,9 +100,9 @@ BOOL OnInitDialog() override; void OnDPIChanged() override; INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const override; + CString GetToolTipText(UINT id, HWND hwnd) const override; //}}AFX_VIRTUAL //{{AFX_MSG(CChannelManagerDlg) - afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *); afx_msg void OnApply(); afx_msg void OnClose(); afx_msg void OnSelectAll(); Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -100,8 +100,6 @@ ON_COMMAND(IDC_CHK_REMOVE_PLUGINS, &CModCleanupDlg::OnVerifyMutualExclusive) ON_COMMAND(IDC_CHK_RESET_VARIABLES, &CModCleanupDlg::OnVerifyMutualExclusive) ON_COMMAND(IDC_CHK_UNUSED_CHANNELS, &CModCleanupDlg::OnVerifyMutualExclusive) - - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CModCleanupDlg::OnToolTipNotify) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -127,7 +125,6 @@ GetDlgItem(m_CleanupIDtoDlgID[kCleanupInstruments])->EnableWindow((sndFile.GetNumInstruments() > 0) ? TRUE : FALSE); GetDlgItem(m_CleanupIDtoDlgID[kRemoveAllInstruments])->EnableWindow((sndFile.GetNumInstruments() > 0) ? TRUE : FALSE); - EnableToolTips(TRUE); return TRUE; } @@ -266,18 +263,10 @@ } -BOOL CModCleanupDlg::OnToolTipNotify(UINT, NMHDR *pNMHDR, LRESULT *) +CString CModCleanupDlg::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if (pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - } - - LPCTSTR lpszText = nullptr; - switch(nID) + LPCTSTR lpszText = _T(""); + switch(id) { // patterns case IDC_CHK_CLEANUP_PATTERNS: @@ -333,12 +322,8 @@ case IDC_CHK_UNUSED_CHANNELS: lpszText = _T("Removes all empty pattern channels."); break; - default: - lpszText = _T(""); - break; } - pTTT->lpszText = const_cast<LPTSTR>(lpszText); - return TRUE; + return lpszText; } Modified: trunk/OpenMPT/mptrack/CleanupSong.h ============================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/CleanupSong.h Wed Jan 1 16:32:09 2025 (r22682) @@ -85,10 +85,9 @@ //{{AFX_VIRTUAL(CModCleanupDlg) BOOL OnInitDialog() override; void OnOK() override; + CString GetToolTipText(UINT id, HWND hwnd) const override; //}}AFX_VIRTUAL - BOOL OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult); - //{{AFX_MSG(CModCleanupDlg) afx_msg void OnPresetCleanupSong(); afx_msg void OnPresetCompoCleanup(); Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -695,7 +695,7 @@ } -CString CCtrlGeneral::GetToolTipText(UINT uId) +CString CCtrlGeneral::GetToolTipText(UINT uId, HWND) const { CString s; if(uId) Modified: trunk/OpenMPT/mptrack/Ctrl_gen.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_gen.h Wed Jan 1 16:32:09 2025 (r22682) @@ -75,7 +75,7 @@ CRuntimeClass *GetAssociatedViewClass() override; void OnActivatePage(LPARAM) override; void OnDeactivatePage() override; - CString GetToolTipText(UINT uId) override; + CString GetToolTipText(UINT uId, HWND hwnd) const override; //}}AFX_VIRTUAL protected: Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -1758,13 +1758,13 @@ } -CString CCtrlInstruments::GetToolTipText(UINT uId) +CString CCtrlInstruments::GetToolTipText(UINT uId, HWND) const { CString s; if(uId) { CWnd *wnd = GetDlgItem(uId); - bool isEnabled = wnd != nullptr && wnd->IsWindowEnabled() != FALSE; + bool isEnabled = wnd == nullptr || wnd->IsWindowEnabled() != FALSE; if(!isEnabled && !m_sndFile.GetNumInstruments()) { s = _T("Create a new instrument to enable instrument mode."); @@ -1789,7 +1789,7 @@ // Pitch/Tempo lock if(isEnabled) { - const CModSpecifications& specs = m_sndFile.GetModSpecifications(); + const CModSpecifications &specs = m_sndFile.GetModSpecifications(); s = MPT_CFORMAT("Tempo Range: {} - {}")(specs.GetTempoMin().GetInt(), specs.GetTempoMax().GetInt()); } else { @@ -1842,8 +1842,6 @@ return s; if(m_sndFile.m_playBehaviour[kMIDICCBugEmulation]) { - velocityStyle.EnableWindow(FALSE); - m_CbnPluginVolumeHandling.EnableWindow(FALSE); s = _T("To enable, clear Plugin volume command bug emulation flag from Song Properties"); } else { Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h Wed Jan 1 16:32:09 2025 (r22682) @@ -147,7 +147,7 @@ void OnDeactivatePage() override; void UpdateView(UpdateHint hint, CObject *pObj = nullptr) override; LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; - CString GetToolTipText(UINT uId) override; + CString GetToolTipText(UINT uId, HWND hwnd) const override; BOOL PreTranslateMessage(MSG* pMsg) override; //}}AFX_VIRTUAL protected: Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -129,7 +129,6 @@ CRect rect, rcOrderList; CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModControlDlg::OnInitDialog(); - EnableToolTips(); if(!pMainFrm) return TRUE; @@ -1373,7 +1372,7 @@ } -CString CCtrlPatterns::GetToolTipText(UINT id) +CString CCtrlPatterns::GetToolTipText(UINT id, HWND) const { CString s; CommandID cmd = kcNull; @@ -1400,9 +1399,17 @@ case ID_PATTERN_PROPERTIES: s = _T("Pattern Properties"); cmd = kcShowPatternProperties; break; case ID_PATTERN_EXPAND: s = _T("Expand Pattern"); break; case ID_PATTERN_SHRINK: s = _T("Shrink Pattern"); break; + case ID_PATTERNDETAIL_DROPDOWN: s = _T("Change Pattern Detail Level"); break; case ID_OVERFLOWPASTE: s = _T("Toggle Overflow Paste"); cmd = kcToggleOverflowPaste; break; case IDC_PATTERN_LOOP: s = _T("Toggle Loop Pattern"); cmd = kcChangeLoopStatus; break; case IDC_PATTERN_FOLLOWSONG: s = _T("Toggle Follow Song"); cmd = kcToggleFollowSong; break; + + case IDC_SPIN_SEQNUM: + case IDC_EDIT_SEQNUM: + case IDC_EDIT_SEQUENCE_NAME: + if(!GetDlgItem(id)->IsWindowEnabled()) + s = _T("Multiple sequences are only supported in the MPTM format."); + break; } if(cmd != kcNull) Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h Wed Jan 1 16:32:09 2025 (r22682) @@ -224,7 +224,7 @@ LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; void OnActivatePage(LPARAM) override; void OnDeactivatePage() override; - CString GetToolTipText(UINT id) override; + CString GetToolTipText(UINT id, HWND hwnd) const override; void OnDPIChanged() override; //}}AFX_VIRTUAL protected: Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -533,7 +533,7 @@ } -CString CCtrlSamples::GetToolTipText(UINT uId) +CString CCtrlSamples::GetToolTipText(UINT uId, HWND) const { CString s; if(uId) Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_smp.h Wed Jan 1 16:32:09 2025 (r22682) @@ -97,7 +97,7 @@ void OnDeactivatePage() override; void UpdateView(UpdateHint hint, CObject *pObj = nullptr) override; LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; - CString GetToolTipText(UINT uId) override; + CString GetToolTipText(UINT uId, HWND hwnd) const override; BOOL PreTranslateMessage(MSG* pMsg) override; void OnDPIChanged() override; //}}AFX_VIRTUAL Modified: trunk/OpenMPT/mptrack/DialogBase.cpp ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/DialogBase.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -20,6 +20,7 @@ //{{AFX_MSG_MAP(DialogBase) ON_MESSAGE(WM_DPICHANGED, &DialogBase::OnDPIChanged) ON_MESSAGE(WM_DPICHANGED_AFTERPARENT, &DialogBase::OnDPIChanged) // Dialog inside dialog + ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &DialogBase::OnToolTipText) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -27,6 +28,7 @@ BOOL DialogBase::OnInitDialog() { UpdateDPI(); + EnableToolTips(); return CDialog::OnInitDialog(); } @@ -100,4 +102,34 @@ } +BOOL DialogBase::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +{ + auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); + CString s; + if(pTTT->uFlags & TTF_IDISHWND) + s = GetToolTipText(static_cast<UINT>(::GetDlgCtrlID(reinterpret_cast<HWND>(pNMHDR->idFrom))), reinterpret_cast<HWND>(pNMHDR->idFrom)); + else + s = GetToolTipText(static_cast<UINT>(pNMHDR->idFrom), nullptr); + + if(s.IsEmpty()) + return FALSE; + + if(s.GetLength() < std::size(pTTT->szText)) + { + mpt::String::WriteCStringBuf(pTTT->szText) = s; + } else + { + m_tooltipText = std::move(s); + pTTT->lpszText = const_cast<TCHAR *>(s.GetString()); + } + + *pResult = 0; + + // bring the tooltip window above other popup windows + ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); + + return TRUE; // message was handled +} + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/DialogBase.h ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/DialogBase.h Wed Jan 1 16:32:09 2025 (r22682) @@ -32,11 +32,15 @@ virtual void OnDPIChanged() {} void UpdateDPI(); + virtual CString GetToolTipText(UINT /*id*/, HWND /*hwnd*/) const { return {}; } + afx_msg LRESULT OnDPIChanged(WPARAM, LPARAM); + afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP() private: + CString m_tooltipText; int m_dpi = 0; }; Modified: trunk/OpenMPT/mptrack/Globals.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Globals.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -51,9 +51,7 @@ BEGIN_MESSAGE_MAP(CModControlDlg, DialogBase) //{{AFX_MSG_MAP(CModControlDlg) ON_WM_SIZE() - ON_MESSAGE(WM_MOD_UNLOCKCONTROLS, &CModControlDlg::OnUnlockControls) - ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, &CModControlDlg::OnToolTipText) - ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, &CModControlDlg::OnToolTipText) + ON_MESSAGE(WM_MOD_UNLOCKCONTROLS, &CModControlDlg::OnUnlockControls) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -69,14 +67,6 @@ } -BOOL CModControlDlg::OnInitDialog() -{ - DialogBase::OnInitDialog(); - EnableToolTips(TRUE); - return TRUE; -} - - void CModControlDlg::OnSize(UINT nType, int cx, int cy) { DialogBase::OnSize(nType, cx, cy); @@ -157,44 +147,6 @@ void CModControlDlg::UnlockControls() { PostMessage(WM_MOD_UNLOCKCONTROLS); } -BOOL CModControlDlg::OnToolTipText(UINT /*nID*/, NMHDR *pNMHDR, LRESULT *pResult) -{ - auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - CString strTipText; - - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(nID))); - } - - if(nID >= 1000 && nID < 65536) - { - strTipText = GetToolTipText(static_cast<UINT>(nID)); - } else - { - // allow top level routing frame to handle the message - if(GetRoutingFrame() != nullptr) - return FALSE; - if(nID != 0) // will be zero on a separator - { - TCHAR szFullText[256] = _T(""); - AfxLoadString(static_cast<UINT>(nID), szFullText, static_cast<UINT>(std::size(szFullText))); - // this is the command id, not the button index - AfxExtractSubString(strTipText, szFullText, 1, _T('\n')); - } - } - mpt::String::WriteCStringBuf(pTTT->szText) = strTipText; - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); - - return TRUE; // message was handled -} - - ///////////////////////////////////////////////////////////////////////////// // CModControlView Modified: trunk/OpenMPT/mptrack/Globals.h ============================================================================== --- trunk/OpenMPT/mptrack/Globals.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Globals.h Wed Jan 1 16:32:09 2025 (r22682) @@ -86,13 +86,10 @@ virtual LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam); virtual void OnActivatePage(LPARAM) {} virtual void OnDeactivatePage() {} - BOOL OnInitDialog() override; - virtual CString GetToolTipText(UINT) { return {}; } //}}AFX_VIRTUAL //{{AFX_MSG(CModControlDlg) afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg LRESULT OnUnlockControls(WPARAM, LPARAM) { if (m_nLockCount > 0) m_nLockCount--; return 0; } - afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp ============================================================================== --- trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -72,8 +72,6 @@ ON_MESSAGE(WM_MOD_MIDIMSG, &CMIDIMappingDialog::OnMidiMsg) ON_NOTIFY(UDN_DELTAPOS, IDC_SPINMOVEMAPPING, &CMIDIMappingDialog::OnDeltaposSpinmovemapping) ON_BN_CLICKED(IDC_CHECK_PATRECORD, &CMIDIMappingDialog::OnBnClickedCheckPatRecord) - - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CMIDIMappingDialog::OnToolTipNotify) END_MESSAGE_MAP() @@ -163,7 +161,6 @@ CMainFrame::GetMainFrame()->SetMidiRecordWnd(GetSafeHwnd()); CheckDlgButton(IDC_CHECK_MIDILEARN, BST_CHECKED); - EnableToolTips(TRUE); return TRUE; // return TRUE unless you set the focus to a control } @@ -458,18 +455,10 @@ } -BOOL CMIDIMappingDialog::OnToolTipNotify(UINT, NMHDR * pNMHDR, LRESULT *) +CString CMIDIMappingDialog::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT*)pNMHDR; const TCHAR *text = _T(""); - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - } - - switch(nID) + switch(id) { case IDC_CHECKCAPTURE: text = _T("The event is not passed to any further MIDI mappings or recording facilities."); @@ -497,8 +486,7 @@ break; } - mpt::String::WriteWinBuf(pTTT->szText) = mpt::winstring(text); - return TRUE; + return text; } Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.h ============================================================================== --- trunk/OpenMPT/mptrack/MIDIMappingDialog.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/MIDIMappingDialog.h Wed Jan 1 16:32:09 2025 (r22682) @@ -61,11 +61,11 @@ BOOL OnInitDialog() override; void DoDataExchange(CDataExchange* pDX) override; // DDX/DDV support + CString GetToolTipText(UINT id, HWND hwnd) const override; DECLARE_MESSAGE_MAP() afx_msg void OnSelectionChanged(NMHDR *pNMHDR = nullptr, LRESULT *pResult = nullptr); - afx_msg BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnBnClickedCheckactive(); afx_msg void OnBnClickedCheckCapture(); Modified: trunk/OpenMPT/mptrack/OPLInstrDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/OPLInstrDlg.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/OPLInstrDlg.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -31,7 +31,6 @@ ON_COMMAND(IDC_CHECK9, &OPLInstrDlg::ParamsChanged) ON_CBN_SELCHANGE(IDC_COMBO1, &OPLInstrDlg::ParamsChanged) ON_CBN_SELCHANGE(IDC_COMBO2, &OPLInstrDlg::ParamsChanged) - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &OPLInstrDlg::OnToolTip) END_MESSAGE_MAP() @@ -81,7 +80,6 @@ BOOL OPLInstrDlg::OnInitDialog() { DialogBase::OnInitDialog(); - EnableToolTips(); m_feedback.SetRange(0, 7); for(int op = 0; op < 2; op++) { @@ -234,27 +232,19 @@ } -BOOL OPLInstrDlg::OnToolTip(UINT /*id*/, NMHDR *pNMHDR, LRESULT* /*pResult*/) +CString OPLInstrDlg::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - } - static constexpr const char *feedback[] = {"disabled", "\xCF\x80/16", "\xCF\x80/8", "\xCF\x80/4", "\xCF\x80/2", "\xCF\x80", "2\xCF\x80", "4\xCF\x80"}; static constexpr const TCHAR *ksl[] = {_T("disabled"), _T("1.5 dB / octave"), _T("3 dB / octave"), _T("6 dB / octave")}; - mpt::tstring text; - const CWnd *wnd = GetDlgItem(static_cast<int>(nID)); + CString text; + const CWnd *wnd = GetDlgItem(static_cast<int>(id)); const CSliderCtrl *slider = static_cast<const CSliderCtrl *>(wnd); - switch(nID) + switch(id) { case IDC_SLIDER1: // Feedback - text = mpt::ToWin(mpt::Charset::UTF8, feedback[slider->GetPos() & 7]); + text = mpt::ToCString(mpt::Charset::UTF8, feedback[slider->GetPos() & 7]); break; case IDC_SLIDER2: @@ -264,20 +254,20 @@ case IDC_SLIDER10: case IDC_SLIDER12: // Attack / Decay / Release - text = _T("faster < ") + mpt::tfmt::val(slider->GetPos()) + _T(" > slower"); + text = _T("faster < ") + mpt::cfmt::val(slider->GetPos()) + _T(" > slower"); break; case IDC_SLIDER4: case IDC_SLIDER11: // Sustain Level { const int pos = slider->GetPos(); - text = mpt::tfmt::val((pos == 0) ? -93 : ((-15 + pos) * 3)) + _T(" dB"); + text = mpt::cfmt::val((pos == 0) ? -93 : ((-15 + pos) * 3)) + _T(" dB"); } break; case IDC_SLIDER6: case IDC_SLIDER13: // Volume Level - text = mpt::tfmt::fix((-63 + slider->GetPos()) * 0.75, 2) + _T(" dB"); + text = mpt::cfmt::fix((-63 + slider->GetPos()) * 0.75, 2) + _T(" dB"); break; case IDC_SLIDER7: case IDC_SLIDER14: @@ -290,12 +280,11 @@ if(slider->GetPos() == 0) text = _T("0.5"); else - text = mpt::tfmt::val(slider->GetPos()); + text = mpt::cfmt::val(slider->GetPos()); break; } - mpt::String::WriteWinBuf(pTTT->szText) = text.c_str(); - return TRUE; + return text; } OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/OPLInstrDlg.h ============================================================================== --- trunk/OpenMPT/mptrack/OPLInstrDlg.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/OPLInstrDlg.h Wed Jan 1 16:32:09 2025 (r22682) @@ -41,11 +41,11 @@ void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; BOOL PreTranslateMessage(MSG *pMsg) override; + CString GetToolTipText(UINT id, HWND hwnd) const override; void OnOK() override { } void OnCancel() override { } void OnHScroll(UINT, UINT, CScrollBar *) { ParamsChanged(); } LRESULT OnDragonDropping(WPARAM wParam, LPARAM lParam); - BOOL OnToolTip(UINT id, NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -1299,7 +1299,6 @@ ON_COMMAND(IDC_BUTTON5, &QuickChannelProperties::OnPickPrevColor) ON_COMMAND(IDC_BUTTON6, &QuickChannelProperties::OnPickNextColor) ON_MESSAGE(WM_MOD_KEYCOMMAND, &QuickChannelProperties::OnCustomKeyMsg) - ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, &QuickChannelProperties::OnToolTipText) END_MESSAGE_MAP() @@ -1336,7 +1335,6 @@ if(!m_hWnd) { Create(IDD_CHANNELSETTINGS, nullptr); - EnableToolTips(); m_colorBtn.SubclassDlgItem(IDC_BUTTON4, this); m_colorBtnPrev.SubclassDlgItem(IDC_BUTTON5, this); m_colorBtnNext.SubclassDlgItem(IDC_BUTTON6, this); @@ -1672,19 +1670,11 @@ } -BOOL QuickChannelProperties::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +CString QuickChannelProperties::GetToolTipText(UINT id, HWND) const { - auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - UINT_PTR id = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - id = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(id))); - } - - mpt::tstring text; + CString text; CommandID cmd = kcNull; - switch (id) + switch(id) { case IDC_EDIT1: case IDC_SLIDER1: @@ -1710,24 +1700,16 @@ text = _T("Take color from next channel"); cmd = kcChnColorFromNext; break; - default: - return FALSE; } if(cmd != kcNull) { auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); if(!keyText.IsEmpty()) - text += MPT_TFORMAT(" ({})")(keyText); + text += MPT_CFORMAT(" ({})")(keyText); } - mpt::String::WriteWinBuf(pTTT->szText) = text; - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); - - return TRUE; // message was handled + return text; } @@ -1746,8 +1728,6 @@ ON_CBN_SELCHANGE(IDC_COMBO2, &MetronomeSettingsDlg::OnSampleChanged) ON_EN_KILLFOCUS(IDC_EDIT1, &MetronomeSettingsDlg::OnSampleChanged) ON_EN_KILLFOCUS(IDC_EDIT2, &MetronomeSettingsDlg::OnSampleChanged) - - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &MetronomeSettingsDlg::OnToolTipText) END_MESSAGE_MAP() @@ -1791,7 +1771,6 @@ BOOL MetronomeSettingsDlg::OnInitDialog() { DialogBase::OnInitDialog(); - EnableToolTips(); CheckDlgButton(IDC_CHECK1, TrackerSettings::Instance().metronomeEnabled ? BST_CHECKED : BST_UNCHECKED); m_volumeSlider.SetRange(static_cast<int>(-48 / METRONOME_VOLUME_SCALE), 0, TRUE); m_volumeSlider.SetPos(mpt::saturate_round<int>(TrackerSettings::Instance().metronomeVolume / METRONOME_VOLUME_SCALE)); @@ -1907,16 +1886,8 @@ } -BOOL MetronomeSettingsDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +CString MetronomeSettingsDlg::GetToolTipText(UINT id, HWND) const { - auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - UINT_PTR id = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - id = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(id))); - } - CString s; switch(id) { @@ -1924,17 +1895,9 @@ s = (m_volumeSlider.GetPos() >= 0) ? _T("+") : _T(""); s.AppendFormat(_T("%.2f dB"), m_volumeSlider.GetPos() * METRONOME_VOLUME_SCALE); break; - default: - return FALSE; } - mpt::String::WriteCStringBuf(pTTT->szText) = s; - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); - - return TRUE; // message was handled + return s; } Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h Wed Jan 1 16:32:09 2025 (r22682) @@ -211,9 +211,9 @@ afx_msg void OnPickPrevColor(); afx_msg void OnPickNextColor(); afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); - afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); BOOL PreTranslateMessage(MSG *pMsg) override; + CString GetToolTipText(UINT id, HWND hwnd) const override; DECLARE_MESSAGE_MAP(); }; @@ -227,6 +227,7 @@ protected: void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; + CString GetToolTipText(UINT id, HWND hwnd) const override; void SetSampleInfo(const mpt::PathString &path, CComboBox &combo, CEdit &edit, CButton &browseButton); bool GetSampleInfo(Setting<mpt::PathString> &path, CComboBox &combo, CEdit &edit, CButton &browseButton); @@ -237,7 +238,6 @@ afx_msg void OnSampleChanged(); afx_msg void OnBrowseMeasure(); afx_msg void OnBrowseBeat(); - BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP(); Modified: trunk/OpenMPT/mptrack/QuickStartDialog.cpp ============================================================================== --- trunk/OpenMPT/mptrack/QuickStartDialog.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/QuickStartDialog.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -107,7 +107,6 @@ BOOL QuickStartDlg::OnInitDialog() { ResizableDialog::OnInitDialog(); - EnableToolTips(); OnDPIChanged(); return TRUE; } Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -653,7 +653,6 @@ ON_COMMAND(IDC_RADIO1, &CSampleXFadeDlg::OnLoopTypeChanged) ON_COMMAND(IDC_RADIO2, &CSampleXFadeDlg::OnLoopTypeChanged) ON_EN_CHANGE(IDC_EDIT1, &CSampleXFadeDlg::OnFadeLengthChanged) - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CSampleXFadeDlg::OnToolTipText) END_MESSAGE_MAP() @@ -761,35 +760,23 @@ } -BOOL CSampleXFadeDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +CString CSampleXFadeDlg::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = (UINT_PTR)::GetDlgCtrlID((HWND)nID); - } - switch(nID) + CString s; + switch(id) { case IDC_SLIDER1: { uint32 percent = m_SliderLength.GetPos(); - wsprintf(pTTT->szText, _T("%u.%03u%% of the loop (%u samples)"), percent / 1000, percent % 1000, PercentToSamples(percent)); + s.Format(_T("%u.%03u%% of the loop (%u samples)"), percent / 1000, percent % 1000, PercentToSamples(percent)); } break; case IDC_SLIDER2: - _tcscpy(pTTT->szText, _T("Slide towards constant power for fixing badly looped samples.")); + s = _T("Slide towards constant power for fixing badly looped samples."); break; - default: - return FALSE; } - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, - SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); - return TRUE; + + return s; } Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.h Wed Jan 1 16:32:09 2025 (r22682) @@ -200,11 +200,12 @@ void DoDataExchange(CDataExchange* pDX) override; BOOL OnInitDialog() override; void OnOK() override; + CString GetToolTipText(UINT id, HWND hwnd) const; afx_msg void OnLoopTypeChanged(); afx_msg void OnFadeLengthChanged(); afx_msg void OnHScroll(UINT, UINT, CScrollBar *); - afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); + DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/TempoSwingDialog.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TempoSwingDialog.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/TempoSwingDialog.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -191,6 +191,7 @@ r->valueSlider.SetTicFreq(SliderResolution / 8); r->valueSlider.SetPageSize(SliderResolution / 8); r->valueSlider.SetPos(1); // Work around https://bugs.winehq.org/show_bug.cgi?id=41909 + SetWindowLongPtr(r->valueSlider, GWLP_USERDATA, i); r->SetValue(m_tempoSwing[i]); rect.MoveToY(rect.top + m.rowHeight); } @@ -215,7 +216,6 @@ windowRect.bottom += displayHeight + m.paddingTop + m.footerHeight; SetWindowPos(nullptr, 0, 0, windowRect.Width(), windowRect.Height(), SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - EnableToolTips(); return TRUE; } @@ -465,15 +465,15 @@ BOOL CTempoSwingDlg::SliderContainer::OnToolTipNotify(UINT, NMHDR *pNMHDR, LRESULT *) { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT*)pNMHDR; - for(size_t i = 0; i < m_parent.m_controls.size(); i++) - { - if((HWND)pNMHDR->idFrom == m_parent.m_controls[i]->valueSlider.m_hWnd) - { - int32 val = Util::muldivr(m_parent.m_tempoSwing[i], 100, TempoSwing::Unity) - 100; - wsprintf(pTTT->szText, _T("%s%d"), val > 0 ? _T("+") : _T(""), val); - return TRUE; - } + TOOLTIPTEXT *pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); + if(!(pTTT->uFlags & TTF_IDISHWND)) + return FALSE; + CSliderCtrl *slider = dynamic_cast<CSliderCtrl *>(CWnd::FromHandlePermanent(reinterpret_cast<HWND>(pNMHDR->idFrom))); + if(slider != nullptr) + { + int32 val = Util::muldivr(m_parent.m_tempoSwing[GetWindowLongPtr(*slider, GWLP_USERDATA)], 100, TempoSwing::Unity) - 100; + wsprintf(pTTT->szText, _T("%s%d"), val > 0 ? _T("+") : _T(""), val); + return TRUE; } return FALSE; } Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -45,9 +45,6 @@ ON_COMMAND(IDC_BUTTON1, &CModTypeDlg::OnTempoSwing) ON_COMMAND(IDC_BUTTON2, &CModTypeDlg::OnLegacyPlaybackSettings) ON_COMMAND(IDC_BUTTON3, &CModTypeDlg::OnDefaultBehaviour) - - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CModTypeDlg::OnToolTipNotify) - //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -120,7 +117,6 @@ UpdateDialog(); m_initialized = true; - EnableToolTips(TRUE); return TRUE; } @@ -485,18 +481,10 @@ } -BOOL CModTypeDlg::OnToolTipNotify(UINT, NMHDR *pNMHDR, LRESULT *) +CString CModTypeDlg::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT*)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - } - - mpt::tstring text; - switch(nID) + CString text; + switch(id) { case IDC_CHECK1: text = _T("Note slides always slide the same amount, not depending on the sample frequency."); @@ -535,14 +523,13 @@ { if(i > 0) text += _T(" / "); - text += MPT_TFORMAT("{}%")(Util::muldivr(m_tempoSwing[i], 100, TempoSwing::Unity)); + text += MPT_CFORMAT("{}%")(Util::muldivr(m_tempoSwing[i], 100, TempoSwing::Unity)); } } } } - mpt::String::WriteWinBuf(pTTT->szText) = text; - return TRUE; + return text; } Modified: trunk/OpenMPT/mptrack/dlg_misc.h ============================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/dlg_misc.h Wed Jan 1 16:32:09 2025 (r22682) @@ -59,10 +59,9 @@ BOOL OnInitDialog() override; void OnDPIChanged() override; void OnOK() override; + CString GetToolTipText(UINT id, HWND HWND) const override; //}}AFX_VIRTUAL - BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); - DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/mptrack.rc Wed Jan 1 16:32:09 2025 (r22682) @@ -1524,6 +1524,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | WS_TABSTOP | 0x4d,2,4,382,18 + GROUPBOX "",IDC_STATIC,3,23,381,24 CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",0x0,6,31,11,12 COMBOBOX IDC_COMBO_INSTRUMENT,18,31,132,137,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,156,30,33,13 @@ -1532,17 +1533,16 @@ CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,31,11,11 CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,264,33,57,8 CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,324,33,55,8 + GROUPBOX "",IDC_STATIC,390,23,174,24 LTEXT "Pattern Name",IDC_STATIC_PATTERNNAME,396,33,48,8,SS_CENTERIMAGE EDITTEXT IDC_EDIT_PATTERNNAME,450,31,109,12,ES_AUTOHSCROLL + GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,390,0,174,24 LTEXT "Sequence",IDC_STATIC_SEQUENCE_NAME,396,10,36,8 EDITTEXT IDC_EDIT_SEQNUM,432,8,28,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN_SEQNUM,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,450,6,11,11 EDITTEXT IDC_EDIT_SEQUENCE_NAME,462,8,97,12,ES_AUTOHSCROLL PUSHBUTTON "<<",IDC_BUTTON2,3,51,14,15 PUSHBUTTON ">>",IDC_BUTTON1,15,51,14,15 - GROUPBOX "",IDC_STATIC,3,23,381,24 - GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,390,0,174,24 - GROUPBOX "",IDC_STATIC,390,23,174,24 END IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 560, 106 |
From: <sv...@op...> - 2025-01-01 14:15:10
|
Author: sagamusix Date: Wed Jan 1 15:15:03 2025 New Revision: 22681 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22681 Log: Merged revision(s) 22680 from trunk/OpenMPT: [Fix] Tree view: ReleaseBuffer was called on the wrong CString object, potentially causing incorrect string comparison results during MIDI library update. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/View_tre.cpp Modified: branches/OpenMPT-1.31/mptrack/View_tre.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/View_tre.cpp Wed Jan 1 15:13:27 2025 (r22680) +++ branches/OpenMPT-1.31/mptrack/View_tre.cpp Wed Jan 1 15:15:03 2025 (r22681) @@ -520,31 +520,31 @@ HTREEITEM parent = GetChildItem(m_hMidiLib); for(UINT iMidi = 0; iMidi < 128; iMidi++) { - DWORD dwImage = IMAGE_INSTRMUTE; + int image = IMAGE_INSTRMUTE; s = mpt::cfmt::val(iMidi) + _T(": ") + mpt::ToCString(mpt::Charset::ASCII, szMidiProgramNames[iMidi]); const LPARAM param = (MODITEM_MIDIINSTRUMENT << MIDILIB_SHIFT) | iMidi; if(!midiLib[iMidi].empty()) { s += _T(": ") + midiLib[iMidi].GetFilename().ToCString(); - dwImage = IMAGE_INSTRUMENTS; + image = IMAGE_INSTRUMENTS; } if(!m_tiMidi[iMidi]) { m_tiMidi[iMidi] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param, parent, TVI_LAST); + s, image, image, 0, 0, param, parent, TVI_LAST); } else { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.hItem = m_tiMidi[iMidi]; tvi.pszText = stmp.GetBuffer(s.GetLength() + 1); tvi.cchTextMax = stmp.GetAllocLength(); - tvi.iImage = tvi.iSelectedImage = dwImage; + tvi.iImage = tvi.iSelectedImage = image; GetItem(&tvi); - s.ReleaseBuffer(); - if(s != stmp || tvi.iImage != (int)dwImage) + stmp.ReleaseBuffer(); + if(tvi.iImage != image || s != stmp) { SetItem(m_tiMidi[iMidi], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param); + s, image, image, 0, 0, param); } } if((iMidi % 8u) == 7u) @@ -555,32 +555,32 @@ // Midi Percussions for(UINT iPerc = 24; iPerc <= 84; iPerc++) { - DWORD dwImage = IMAGE_NOSAMPLE; + int image = IMAGE_NOSAMPLE; s = mpt::ToCString(CSoundFile::GetNoteName((ModCommand::NOTE)(iPerc + NOTE_MIN), CSoundFile::GetDefaultNoteNames())) + _T(": ") + mpt::ToCString(mpt::Charset::ASCII, szMidiPercussionNames[iPerc - 24]); const LPARAM param = (MODITEM_MIDIPERCUSSION << MIDILIB_SHIFT) | iPerc; if(!midiLib[iPerc | 0x80].empty()) { s += _T(": ") + midiLib[iPerc | 0x80].GetFilename().ToCString(); - dwImage = IMAGE_SAMPLES; + image = IMAGE_SAMPLES; } if(!m_tiPerc[iPerc]) { m_tiPerc[iPerc] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param, parent, TVI_LAST); + s, image, image, 0, 0, param, parent, TVI_LAST); } else { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.hItem = m_tiPerc[iPerc]; tvi.pszText = stmp.GetBuffer(s.GetLength() + 1); tvi.cchTextMax = stmp.GetAllocLength(); - tvi.iImage = tvi.iSelectedImage = dwImage; + tvi.iImage = tvi.iSelectedImage = image; GetItem(&tvi); - s.ReleaseBuffer(); - if(s != stmp || tvi.iImage != (int)dwImage) + stmp.ReleaseBuffer(); + if(tvi.iImage != image || s != stmp) { SetItem(m_tiPerc[iPerc], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, - s, dwImage, dwImage, 0, 0, param); + s, image, image, 0, 0, param); } } } |
From: <sv...@op...> - 2025-01-01 14:13:34
|
Author: sagamusix Date: Wed Jan 1 15:13:27 2025 New Revision: 22680 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22680 Log: [Fix] Tree view: ReleaseBuffer was called on the wrong CString object, potentially causing incorrect string comparison results during MIDI library update. Modified: trunk/OpenMPT/mptrack/View_tre.cpp Modified: trunk/OpenMPT/mptrack/View_tre.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp Wed Jan 1 11:38:42 2025 (r22679) +++ trunk/OpenMPT/mptrack/View_tre.cpp Wed Jan 1 15:13:27 2025 (r22680) @@ -552,8 +552,8 @@ tvi.cchTextMax = stmp.GetAllocLength(); tvi.iImage = tvi.iSelectedImage = image; GetItem(&tvi); - s.ReleaseBuffer(); - if(s != stmp || tvi.iImage != image) + stmp.ReleaseBuffer(); + if(tvi.iImage != image || s != stmp) { SetItem(m_tiMidi[iMidi], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, s, image, image, 0, 0, param); @@ -567,32 +567,32 @@ // Midi Percussions for(UINT iPerc = 24; iPerc <= 84; iPerc++) { - DWORD dwImage = IMAGE_NOSAMPLE; + int image = IMAGE_NOSAMPLE; s = mpt::ToCString(CSoundFile::GetNoteName((ModCommand::NOTE)(iPerc + NOTE_MIN), CSoundFile::GetDefaultNoteNames())) + _T(": ") + mpt::ToCString(mpt::Charset::ASCII, szMidiPercussionNames[iPerc - 24]); const LPARAM param = (MODITEM_MIDIPERCUSSION << MIDILIB_SHIFT) | iPerc; if(!midiLib[iPerc | 0x80].empty()) { s += _T(": ") + midiLib[iPerc | 0x80].GetFilename().ToCString(); - dwImage = IMAGE_SAMPLES; + image = IMAGE_SAMPLES; } if(!m_tiPerc[iPerc]) { m_tiPerc[iPerc] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param, parent, TVI_LAST); + s, image, image, 0, 0, param, parent, TVI_LAST); } else { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.hItem = m_tiPerc[iPerc]; tvi.pszText = stmp.GetBuffer(s.GetLength() + 1); tvi.cchTextMax = stmp.GetAllocLength(); - tvi.iImage = tvi.iSelectedImage = dwImage; + tvi.iImage = tvi.iSelectedImage = image; GetItem(&tvi); - s.ReleaseBuffer(); - if(s != stmp || tvi.iImage != (int)dwImage) + stmp.ReleaseBuffer(); + if(tvi.iImage != image || s != stmp) { SetItem(m_tiPerc[iPerc], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, - s, dwImage, dwImage, 0, 0, param); + s, image, image, 0, 0, param); } } } |
From: <sv...@op...> - 2025-01-01 10:38:54
|
Author: manx Date: Wed Jan 1 11:38:42 2025 New Revision: 22679 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22679 Log: Merged revision(s) 22678 from trunk/OpenMPT: [Imp] Update Check: Be transparent that we are also transmitting the OpenMPT version as User-Agent string. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/UpdateCheck.cpp Modified: branches/OpenMPT-1.31/mptrack/UpdateCheck.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/UpdateCheck.cpp Wed Jan 1 11:38:18 2025 (r22678) +++ branches/OpenMPT-1.31/mptrack/UpdateCheck.cpp Wed Jan 1 11:38:42 2025 (r22679) @@ -1641,6 +1641,8 @@ statistics += UL_("\n"); { + statistics += U_("User-Agent: ") + Version::Current().GetOpenMPTVersionString() + UL_("\n"); + statistics += UL_("\n"); statistics += U_("GET ") + settings.apiURL + MPT_UFORMAT("update/{}")(GetChannelName(static_cast<UpdateChannel>(settings.channel))) + UL_("\n"); statistics += UL_("\n"); std::vector<mpt::ustring> keyAnchors = TrackerSettings::Instance().UpdateSigningKeysRootAnchors; @@ -1655,6 +1657,8 @@ { statistics += U_("Statistics:") + UL_("\n"); statistics += UL_("\n"); + statistics += U_("User-Agent: ") + Version::Current().GetOpenMPTVersionString() + UL_("\n"); + statistics += UL_("\n"); if(settings.statisticsUUID.IsValid()) { statistics += U_("PUT ") + settings.apiURL + MPT_UFORMAT("statistics/{}")(settings.statisticsUUID) + UL_("\n"); |
From: <sv...@op...> - 2025-01-01 10:38:30
|
Author: manx Date: Wed Jan 1 11:38:18 2025 New Revision: 22678 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22678 Log: [Imp] Update Check: Be transparent that we are also transmitting the OpenMPT version as User-Agent string. Modified: trunk/OpenMPT/mptrack/UpdateCheck.cpp Modified: trunk/OpenMPT/mptrack/UpdateCheck.cpp ============================================================================== --- trunk/OpenMPT/mptrack/UpdateCheck.cpp Wed Jan 1 02:37:29 2025 (r22677) +++ trunk/OpenMPT/mptrack/UpdateCheck.cpp Wed Jan 1 11:38:18 2025 (r22678) @@ -1644,6 +1644,8 @@ statistics += UL_("\n"); { + statistics += U_("User-Agent: ") + Version::Current().GetOpenMPTVersionString() + UL_("\n"); + statistics += UL_("\n"); statistics += U_("GET ") + settings.apiURL + MPT_UFORMAT("update/{}")(GetChannelName(static_cast<UpdateChannel>(settings.channel))) + UL_("\n"); statistics += UL_("\n"); std::vector<mpt::ustring> keyAnchors = TrackerSettings::Instance().UpdateSigningKeysRootAnchors; @@ -1658,6 +1660,8 @@ { statistics += U_("Statistics:") + UL_("\n"); statistics += UL_("\n"); + statistics += U_("User-Agent: ") + Version::Current().GetOpenMPTVersionString() + UL_("\n"); + statistics += UL_("\n"); if(settings.statisticsUUID.IsValid()) { statistics += U_("PUT ") + settings.apiURL + MPT_UFORMAT("statistics/{}")(settings.statisticsUUID) + UL_("\n"); |
From: <sv...@op...> - 2025-01-01 01:37:41
|
Author: sagamusix Date: Wed Jan 1 02:37:29 2025 New Revision: 22677 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22677 Log: Merged revision(s) 22670 from trunk/OpenMPT: [Imp] XM: When tracker ID is "*Converted from FOO-File*", set "made with" version info for Digitrakker accordingly. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Load_xm.cpp Modified: branches/OpenMPT-1.31/soundlib/Load_xm.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Load_xm.cpp Wed Jan 1 02:32:31 2025 (r22676) +++ branches/OpenMPT-1.31/soundlib/Load_xm.cpp Wed Jan 1 02:37:29 2025 (r22677) @@ -679,9 +679,10 @@ m_playBehaviour.reset(kFT2ST3OffsetOutOfRange); // Fix arpeggios in KAPTENFL.XM m_playBehaviour.reset(kFT2Arpeggio); - } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11)) + } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11) && !memcmp(fileHeader.trackerName + 14, "-File*", 6)) { - madeWith = verDigiTrakker; + madeWith = verDigiTrakker | verConfirmed; + madeWithTracker = UL_("Digitrakker"); } } |
From: <sv...@op...> - 2025-01-01 01:32:44
|
Author: sagamusix Date: Wed Jan 1 02:32:31 2025 New Revision: 22676 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22676 Log: Merged revision(s) 22630-22631 from trunk/OpenMPT: [Fix] Config Dialog: Browsing for a template file used the wrong base path. ........ [Ref] Add CTrackApp::GetUserTemplatesPath and CTrackApp::GetExampleSongsPath. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/GeneralConfigDlg.cpp branches/OpenMPT-1.31/mptrack/MainFrm.cpp branches/OpenMPT-1.31/mptrack/Moddoc.cpp branches/OpenMPT-1.31/mptrack/Mptrack.cpp branches/OpenMPT-1.31/mptrack/Mptrack.h branches/OpenMPT-1.31/mptrack/TrackerSettings.cpp branches/OpenMPT-1.31/mptrack/TrackerSettings.h Modified: branches/OpenMPT-1.31/mptrack/GeneralConfigDlg.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/GeneralConfigDlg.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/GeneralConfigDlg.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -112,7 +112,7 @@ } } - const mpt::PathString basePath = theApp.GetConfigPath() + P_("TemplateModules\\"); + const mpt::PathString basePath = theApp.GetUserTemplatesPath(); FolderScanner scanner(basePath, FolderScanner::kOnlyFiles | FolderScanner::kFindInSubDirectories); mpt::PathString file; while(scanner.Next(file)) @@ -196,7 +196,7 @@ void COptionsGeneral::OnBrowseTemplate() { - mpt::PathString basePath = theApp.GetInstallPath() + P_("TemplateModules\\"); + mpt::PathString basePath = theApp.GetUserTemplatesPath(); mpt::PathString defaultFile = mpt::PathString::FromCString(GetWindowTextString(m_defaultTemplate)); if(defaultFile.empty()) defaultFile = TrackerSettings::Instance().defaultTemplateFile; Modified: branches/OpenMPT-1.31/mptrack/MainFrm.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/MainFrm.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/MainFrm.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -2245,7 +2245,7 @@ { MPT_ASSERT(nId == UINT(isTemplateFile ? ID_FILE_OPENTEMPLATE_LASTINRANGE : ID_EXAMPLE_MODULES_LASTINRANGE)); FileDialog::PathList files; - theApp.OpenModulesDialog(files, isTemplateFile ? theApp.GetConfigPath() + P_("TemplateModules") : theApp.GetInstallPath() + P_("ExampleSongs")); + theApp.OpenModulesDialog(files, isTemplateFile ? theApp.GetUserTemplatesPath() : theApp.GetExampleSongsPath()); for(const auto &file : files) { theApp.OpenDocumentFile(file.ToCString()); Modified: branches/OpenMPT-1.31/mptrack/Moddoc.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/Moddoc.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/Moddoc.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -3114,7 +3114,7 @@ void CModDoc::OnSaveTemplateModule() { // Create template folder if doesn't exist already. - const mpt::PathString templateFolder = TrackerSettings::Instance().PathUserTemplates.GetDefaultDir(); + const mpt::PathString templateFolder = theApp.GetUserTemplatesPath(); if (!mpt::native_fs{}.is_directory(templateFolder)) { if (!CreateDirectory(templateFolder.AsNative().c_str(), nullptr)) Modified: branches/OpenMPT-1.31/mptrack/Mptrack.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/Mptrack.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/Mptrack.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -983,7 +983,7 @@ void CTrackApp::CreatePaths() { - // Create missing diretories + // Create missing directories if(!IsPortableMode()) { if(!mpt::native_fs{}.is_directory(m_ConfigPath)) @@ -1028,7 +1028,18 @@ RemoveDirectory(oldTunings.AsNative().c_str()); } } +} + +mpt::PathString CTrackApp::GetUserTemplatesPath() const +{ + return GetConfigPath() + P_("TemplateModules\\"); +} + + +mpt::PathString CTrackApp::GetExampleSongsPath() const +{ + return GetInstallPath() + P_("ExampleSongs\\"); } @@ -1687,7 +1698,7 @@ if(TrackerSettings::Instance().defaultNewFileAction == nfDefaultTemplate && !templateFile.empty()) { // Template file can be either a filename inside one of the preset and user TemplateModules folders, or a full path. - const mpt::PathString dirs[] = { GetConfigPath() + P_("TemplateModules\\"), GetInstallPath() + P_("TemplateModules\\"), mpt::PathString() }; + const mpt::PathString dirs[] = { GetUserTemplatesPath(), GetInstallPath() + P_("TemplateModules\\"), mpt::PathString() }; for(const auto &dir : dirs) { if(mpt::native_fs{}.is_file(dir + templateFile)) Modified: branches/OpenMPT-1.31/mptrack/Mptrack.h ============================================================================== --- branches/OpenMPT-1.31/mptrack/Mptrack.h Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/Mptrack.h Wed Jan 1 02:32:31 2025 (r22676) @@ -302,6 +302,8 @@ /// Returns path to config folder including trailing '\'. mpt::PathString GetConfigPath() const { return m_ConfigPath; } + mpt::PathString GetUserTemplatesPath() const; + mpt::PathString GetExampleSongsPath() const; void SetupPaths(bool overridePortable); void CreatePaths(); Modified: branches/OpenMPT-1.31/mptrack/TrackerSettings.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/TrackerSettings.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/TrackerSettings.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -313,7 +313,6 @@ , PathPluginPresets(conf, U_("Paths"), U_("Plugin_Presets_Directory"), mpt::PathString()) , PathExport(conf, U_("Paths"), U_("Export_Directory"), mpt::PathString()) , PathTunings(theApp.GetConfigPath() + P_("tunings\\")) - , PathUserTemplates(theApp.GetConfigPath() + P_("TemplateModules\\")) // Default template , defaultTemplateFile(conf, U_("Paths"), U_("DefaultTemplate"), mpt::PathString()) , defaultArtist(conf, U_("Misc"), U_("DefaultArtist"), mpt::getenv(U_("USERNAME")).value_or(U_(""))) Modified: branches/OpenMPT-1.31/mptrack/TrackerSettings.h ============================================================================== --- branches/OpenMPT-1.31/mptrack/TrackerSettings.h Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/TrackerSettings.h Wed Jan 1 02:32:31 2025 (r22676) @@ -865,7 +865,6 @@ ConfigurableDirectory PathPluginPresets; ConfigurableDirectory PathExport; DefaultAndWorkingDirectory PathTunings; - DefaultAndWorkingDirectory PathUserTemplates; mpt::PathString m_szKbdFile; // Default template |
From: <sv...@op...> - 2025-01-01 01:19:05
|
Author: sagamusix Date: Wed Jan 1 02:18:59 2025 New Revision: 22675 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22675 Log: Merged revision(s) 22529 from trunk/OpenMPT: [Fix] Reset tempo mode when initializing module. Since only few formats use a tempo mode other than classic, and their loaders don't return false after the tempo mode has been set, this does not make a difference in practice right now. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Sndfile.cpp Modified: branches/OpenMPT-1.31/soundlib/Sndfile.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Sndfile.cpp Wed Jan 1 02:15:46 2025 (r22674) +++ branches/OpenMPT-1.31/soundlib/Sndfile.cpp Wed Jan 1 02:18:59 2025 (r22675) @@ -212,6 +212,7 @@ m_nResampling = SRCMODE_DEFAULT; m_dwLastSavedWithVersion = Version(0); m_dwCreatedWithVersion = Version(0); + m_nTempoMode = TempoMode::Classic; SetMixLevels(MixLevels::Compatible); |
From: <sv...@op...> - 2025-01-01 01:16:01
|
Author: sagamusix Date: Wed Jan 1 02:15:46 2025 New Revision: 22674 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22674 Log: Merged revision(s) 22479-22480 from trunk/OpenMPT: [Var] Update to unrar 7.1.2. ........ [Ref] UnRAR: Silence Clang warning. ........ Added: branches/OpenMPT-1.31/include/unrar/largepage.cpp - copied unchanged from r22480, trunk/OpenMPT/include/unrar/largepage.cpp branches/OpenMPT-1.31/include/unrar/largepage.hpp - copied unchanged from r22480, trunk/OpenMPT/include/unrar/largepage.hpp branches/OpenMPT-1.31/include/unrar/motw.cpp - copied unchanged from r22480, trunk/OpenMPT/include/unrar/motw.cpp branches/OpenMPT-1.31/include/unrar/motw.hpp - copied unchanged from r22480, trunk/OpenMPT/include/unrar/motw.hpp Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/build/premake/ext-UnRAR.lua branches/OpenMPT-1.31/build/vs2017winxp/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2017winxpansi/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2019win10/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2019win7/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2019win81/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2022win10/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2022win10clang/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2022win7/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2022win81/ext/UnRAR.vcxproj branches/OpenMPT-1.31/include/unrar/OpenMPT.txt branches/OpenMPT-1.31/include/unrar/arccmt.cpp branches/OpenMPT-1.31/include/unrar/archive.cpp branches/OpenMPT-1.31/include/unrar/archive.hpp branches/OpenMPT-1.31/include/unrar/arcread.cpp branches/OpenMPT-1.31/include/unrar/blake2s.hpp branches/OpenMPT-1.31/include/unrar/cmddata.cpp branches/OpenMPT-1.31/include/unrar/cmddata.hpp branches/OpenMPT-1.31/include/unrar/cmdmix.cpp branches/OpenMPT-1.31/include/unrar/consio.cpp branches/OpenMPT-1.31/include/unrar/consio.hpp branches/OpenMPT-1.31/include/unrar/crypt.hpp branches/OpenMPT-1.31/include/unrar/dll.cpp branches/OpenMPT-1.31/include/unrar/dll.hpp branches/OpenMPT-1.31/include/unrar/errhnd.hpp branches/OpenMPT-1.31/include/unrar/extinfo.hpp branches/OpenMPT-1.31/include/unrar/extract.cpp branches/OpenMPT-1.31/include/unrar/extract.hpp branches/OpenMPT-1.31/include/unrar/filefn.cpp branches/OpenMPT-1.31/include/unrar/filefn.hpp branches/OpenMPT-1.31/include/unrar/hash.cpp branches/OpenMPT-1.31/include/unrar/hash.hpp branches/OpenMPT-1.31/include/unrar/list.cpp branches/OpenMPT-1.31/include/unrar/loclang.hpp branches/OpenMPT-1.31/include/unrar/options.hpp branches/OpenMPT-1.31/include/unrar/os.hpp branches/OpenMPT-1.31/include/unrar/rar.hpp branches/OpenMPT-1.31/include/unrar/rardefs.hpp branches/OpenMPT-1.31/include/unrar/smallfn.cpp branches/OpenMPT-1.31/include/unrar/smallfn.hpp branches/OpenMPT-1.31/include/unrar/system.cpp branches/OpenMPT-1.31/include/unrar/system.hpp branches/OpenMPT-1.31/include/unrar/timefn.hpp branches/OpenMPT-1.31/include/unrar/ui.hpp branches/OpenMPT-1.31/include/unrar/uiconsole.cpp branches/OpenMPT-1.31/include/unrar/unicode.cpp branches/OpenMPT-1.31/include/unrar/unpack.cpp branches/OpenMPT-1.31/include/unrar/unpack.hpp branches/OpenMPT-1.31/include/unrar/version.hpp branches/OpenMPT-1.31/include/unrar/volume.cpp branches/OpenMPT-1.31/include/unrar/win32acl.cpp branches/OpenMPT-1.31/include/unrar/win32stm.cpp Modified: branches/OpenMPT-1.31/build/premake/ext-UnRAR.lua ============================================================================== --- branches/OpenMPT-1.31/build/premake/ext-UnRAR.lua Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/premake/ext-UnRAR.lua Wed Jan 1 02:15:46 2025 (r22674) @@ -38,6 +38,7 @@ "../../include/unrar/hash.cpp", "../../include/unrar/headers.cpp", "../../include/unrar/isnt.cpp", + "../../include/unrar/largepage.cpp", "../../include/unrar/list.cpp", "../../include/unrar/match.cpp", "../../include/unrar/options.cpp", @@ -91,6 +92,7 @@ "../../include/unrar/headers.hpp", "../../include/unrar/headers5.hpp", "../../include/unrar/isnt.hpp", + "../../include/unrar/largepage.hpp", "../../include/unrar/list.hpp", "../../include/unrar/loclang.hpp", "../../include/unrar/log.hpp", Modified: branches/OpenMPT-1.31/build/vs2017winxp/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2017winxp/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2017winxp/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -614,6 +614,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -677,6 +678,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2017winxpansi/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2017winxpansi/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2017winxpansi/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -614,6 +614,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -677,6 +678,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2019win10/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2019win10/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2019win10/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -1211,6 +1211,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -1274,6 +1275,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2019win7/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2019win7/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2019win7/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -623,6 +623,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -686,6 +687,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2019win81/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2019win81/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2019win81/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -623,6 +623,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -686,6 +687,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2022win10/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2022win10/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2022win10/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -1235,6 +1235,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -1298,6 +1299,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2022win10clang/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2022win10clang/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2022win10clang/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -1169,6 +1169,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -1232,6 +1233,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2022win7/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2022win7/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2022win7/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -635,6 +635,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -698,6 +699,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2022win81/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2022win81/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2022win81/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -635,6 +635,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -698,6 +699,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/include/unrar/OpenMPT.txt ============================================================================== --- branches/OpenMPT-1.31/include/unrar/OpenMPT.txt Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/OpenMPT.txt Wed Jan 1 02:15:46 2025 (r22674) @@ -1,4 +1,4 @@ -This folder is based on https://rarlab.com/rar/unrarsrc-7.0.9.tar.gz +This folder is based on https://rarlab.com/rar/unrarsrc-7.1.2.tar.gz All modifications to existing files have been done in a manner so that no existing lines were edited; only new lines were added. @@ -10,9 +10,9 @@ never be used in OpenMPT's context. The following files have been modified: -extract.cpp, filcreat.cpp, file.cpp, filefn.cpp, find.cpp, match.cpp, -os.hpp, pathfn.cpp, rdwrfn.cpp, secpassword.cpp, volume.cpp, -win32acl.cpp, win32lnk.cpp +extract.cpp, filcreat.cpp, file.cpp, filefn.cpp, find.cpp, largepage.hpp, +match.cpp, os.hpp, pathfn.cpp, rardefs.hpp, rdwrfn.cpp, secpassword.cpp, +volume.cpp, win32acl.cpp, win32lnk.cpp For building, premake is used to generate Visual Studio project files. See ../build/premake/ for details. Modified: branches/OpenMPT-1.31/include/unrar/arccmt.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/arccmt.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/arccmt.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -36,7 +36,12 @@ { // Current (RAR 3.0+) version of archive comment. Seek(GetStartPos(),SEEK_SET); - return SearchSubBlock(SUBHEAD_TYPE_CMT)!=0 && ReadCommentData(CmtData); + if (SearchSubBlock(SUBHEAD_TYPE_CMT)!=0) + if (ReadCommentData(CmtData)) + return true; + else + uiMsg(UIERROR_CMTBROKEN,FileName); + return false; } #ifndef SFX_MODULE // Old style (RAR 2.9) comment header embedded into the main Modified: branches/OpenMPT-1.31/include/unrar/archive.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/archive.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/archive.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -67,7 +67,7 @@ // password is incorrect. if (!FailedHeaderDecryption) uiMsg(UIERROR_BADARCHIVE,FileName); - ErrHandler.Exit(RARX_FATAL); + ErrHandler.Exit(RARX_BADARC); } } @@ -109,9 +109,11 @@ // We check the last signature byte, so we can return a sensible // warning in case we'll want to change the archive format // sometimes in the future. +#ifndef SFX_MODULE if (D[6]==0) Type=RARFMT15; else +#endif if (D[6]==1) Type=RARFMT50; else Modified: branches/OpenMPT-1.31/include/unrar/archive.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/archive.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/archive.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -58,7 +58,7 @@ bool ProhibitQOpen; #endif public: - Archive(CommandData *InitCmd=NULL); + Archive(CommandData *InitCmd=nullptr); ~Archive(); static RARFORMAT IsSignature(const byte *D,size_t Size); bool IsArchive(bool EnableBroken); @@ -147,6 +147,9 @@ bool NewArchive; std::wstring FirstVolumeName; +#ifdef PROPAGATE_MOTW + MarkOfTheWeb Motw; +#endif }; Modified: branches/OpenMPT-1.31/include/unrar/arcread.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/arcread.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/arcread.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -20,10 +20,10 @@ case RARFMT14: ReadSize=ReadHeader14(); break; -#endif case RARFMT15: ReadSize=ReadHeader15(); break; +#endif case RARFMT50: ReadSize=ReadHeader50(); break; @@ -106,6 +106,9 @@ if (CurBlockPos!=ArcSize || NextBlockPos!=ArcSize) { uiMsg(UIERROR_UNEXPEOF,FileName); + if (CurHeaderType!=HEAD_FILE) + uiMsg(UIERROR_TRUNCSERVICE,FileName,SubHead.FileName); + ErrHandler.SetErrorCode(RARX_WARNING); } } @@ -137,6 +140,7 @@ } +#ifndef SFX_MODULE size_t Archive::ReadHeader15() { RawRead Raw(this); @@ -145,7 +149,7 @@ if (Decrypt) { -#ifdef RAR_NOCRYPT // For rarext.dll and unrar_nocrypt.dll. +#ifdef RAR_NOCRYPT // For rarext.dll, Setup.SFX and unrar_nocrypt.dll. return 0; #else RequestArcPassword(NULL); @@ -545,6 +549,7 @@ return Raw.Size(); } +#endif // #ifndef SFX_MODULE size_t Archive::ReadHeader50() @@ -740,10 +745,15 @@ byte csum[SIZE_PSWCHECK_CSUM]; Raw.GetB(csum,SIZE_PSWCHECK_CSUM); +// Exclude this code for rarext.dll, Setup.SFX and unrar_nocrypt.dll linked +// without sha256. But still set Encrypted=true for rarext.dll here, +// so it can recognize encrypted header archives in archive properties. +#ifndef RAR_NOCRYPT byte Digest[SHA256_DIGEST_SIZE]; sha256_get(CryptHead.PswCheck, SIZE_PSWCHECK, Digest); CryptHead.UsePswCheck=memcmp(csum,Digest,SIZE_PSWCHECK_CSUM)==0; +#endif } Encrypted=true; } @@ -1036,22 +1046,30 @@ FileHeader *hd=(FileHeader *)bb; switch(FieldType) { +#ifndef RAR_NOCRYPT // Except rarext.dll, Setup.SFX and unrar_nocrypt.dll. case FHEXTRA_CRYPT: { FileHeader *hd=(FileHeader *)bb; uint EncVersion=(uint)Raw->GetV(); if (EncVersion>CRYPT_VERSION) + { UnkEncVerMsg(hd->FileName,L"x" + std::to_wstring(EncVersion)); + hd->CryptMethod=CRYPT_UNKNOWN; + } else { uint Flags=(uint)Raw->GetV(); - hd->UsePswCheck=(Flags & FHEXTRA_CRYPT_PSWCHECK)!=0; - hd->UseHashKey=(Flags & FHEXTRA_CRYPT_HASHMAC)!=0; hd->Lg2Count=Raw->Get1(); if (hd->Lg2Count>CRYPT5_KDF_LG2_COUNT_MAX) + { UnkEncVerMsg(hd->FileName,L"xc" + std::to_wstring(hd->Lg2Count)); + hd->CryptMethod=CRYPT_UNKNOWN; + } else { + hd->UsePswCheck=(Flags & FHEXTRA_CRYPT_PSWCHECK)!=0; + hd->UseHashKey=(Flags & FHEXTRA_CRYPT_HASHMAC)!=0; + Raw->GetB(hd->Salt,SIZE_SALT50); Raw->GetB(hd->InitV,SIZE_INITV); if (hd->UsePswCheck) @@ -1085,6 +1103,7 @@ } } break; +#endif case FHEXTRA_HASH: { FileHeader *hd=(FileHeader *)bb; Modified: branches/OpenMPT-1.31/include/unrar/blake2s.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/blake2s.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/blake2s.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -5,12 +5,9 @@ #define BLAKE2_DIGEST_SIZE 32 #define BLAKE2_THREADS_NUMBER 8 -enum blake2s_constant -{ - BLAKE2S_BLOCKBYTES = 64, - BLAKE2S_OUTBYTES = 32 -}; - +// Use constexpr instead of enums for -std=c++20 compatibility. +constexpr size_t BLAKE2S_BLOCKBYTES = 64; +constexpr size_t BLAKE2S_OUTBYTES = 32; // Alignment to 64 improves performance of both SSE and non-SSE versions. // Alignment to n*16 is required for SSE version, so we selected 64. Modified: branches/OpenMPT-1.31/include/unrar/cmddata.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/cmddata.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/cmddata.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -38,6 +38,9 @@ InclArgs.Reset(); ArcNames.Reset(); StoreArgs.Reset(); +#ifdef PROPAGATE_MOTW + MotwList.Reset(); +#endif Password.Clean(); NextVolSizes.clear(); #ifdef RARDLL @@ -189,7 +192,7 @@ #if !defined(SFX_MODULE) void CommandData::ParseEnvVar() { - char *EnvVar=getenv("RAR"); + char *EnvVar=getenv("RARINISWITCHES"); if (EnvVar!=NULL) { std::wstring EnvStr; @@ -293,6 +296,9 @@ void CommandData::ProcessSwitch(const wchar *Switch) { + if (LargePageAlloc::ProcessSwitch(this,Switch)) + return; + switch(toupperw(Switch[0])) { case '@': @@ -619,8 +625,6 @@ } } break; - case 'M': - break; case 'D': { bool SetDictLimit=toupperw(Switch[2])=='X'; @@ -665,33 +669,30 @@ if (toupperw(Switch[2])=='S' && Switch[3]==0) SkipEncrypted=true; break; - case 'S': + case 'L': + if (toupperw(Switch[2])=='P') { - std::wstring StoreNames=(Switch[2]==0 ? DefaultStoreList:Switch+2); - size_t Pos=0; - while (Pos<StoreNames.size()) + UseLargePages=true; + if (!LargePageAlloc::IsPrivilegeAssigned() && LargePageAlloc::AssignConfirmation()) { - if (StoreNames[Pos]=='.') - Pos++; - size_t EndPos=StoreNames.find(';',Pos); - std::wstring Mask=StoreNames.substr(Pos,EndPos==std::wstring::npos ? EndPos:EndPos-Pos); - if (Mask.find_first_of(L"*?.")==std::wstring::npos) - Mask.insert(0,L"*."); - StoreArgs.AddString(Mask); - if (EndPos==std::wstring::npos) - break; - Pos=EndPos+1; + LargePageAlloc::AssignPrivilege(); + + // Quit immediately. We do not want to interrupt the current copy + // archive processing with reboot after assigning privilege. + SetupComplete=true; } } break; + case 'M': + break; + case 'S': + GetBriefMaskList(Switch[2]==0 ? DefaultStoreList:Switch+2,StoreArgs); + break; #ifdef RAR_SMP case 'T': Threads=atoiw(Switch+2); if (Threads>MaxPoolThreads || Threads<1) BadSwitch(Switch); - else - { - } break; #endif default: @@ -752,6 +753,18 @@ } break; #endif +#ifdef PROPAGATE_MOTW + case 'M': + { + MotwAllFields=Switch[2]=='1'; + const wchar *Sep=wcschr(Switch+2,'='); + if (Switch[2]=='-') + MotwList.Reset(); + else + GetBriefMaskList(Sep==nullptr ? L"*":Sep+1,MotwList); + } + break; +#endif #ifdef _WIN_ALL case 'N': if (toupperw(Switch[2])=='I') @@ -1033,6 +1046,11 @@ #ifndef SFX_MODULE const wchar *SingleCharCommands=L"FUADPXETK"; + + // RAR -mlp command is the legitimate way to assign the required privilege. + if (Command.empty() && UseLargePages || SetupComplete) + return; + if (Command[0]!=0 && Command[1]!=0 && wcschr(SingleCharCommands,Command[0])!=NULL || ArcName.empty()) OutHelp(Command.empty() ? RARX_SUCCESS:RARX_USERERROR); // Return 'success' for 'rar' without parameters. @@ -1231,5 +1249,25 @@ } +// Treat the list like rar;zip as *.rar;*.zip for -ms and similar switches. +void CommandData::GetBriefMaskList(const std::wstring &Masks,StringList &Args) +{ + size_t Pos=0; + while (Pos<Masks.size()) + { + if (Masks[Pos]=='.') + Pos++; + size_t EndPos=Masks.find(';',Pos); + std::wstring Mask=Masks.substr(Pos,EndPos==std::wstring::npos ? EndPos:EndPos-Pos); + if (Mask.find_first_of(L"*?.")==std::wstring::npos) + Mask.insert(0,L"*."); + Args.AddString(Mask); + if (EndPos==std::wstring::npos) + break; + Pos=EndPos+1; + } +} + + Modified: branches/OpenMPT-1.31/include/unrar/cmddata.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/cmddata.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/cmddata.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -1,6 +1,12 @@ #ifndef _RAR_CMDDATA_ #define _RAR_CMDDATA_ +#if defined(_WIN_ALL) && !defined(SFX_MODULE) +// In Windows we implement our own command line parser to avoid replacing +// \" by " in standard parser. Such replacing corrupts destination paths +// like "dest path\" in extraction commands. +#define CUSTOM_CMDLINE_PARSER +#endif #define DefaultStoreList L"7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lz;lzh;mp3;rar;taz;tbz;tbz2;tgz;txz;xz;z;zip;zipx;zst;tzst" @@ -56,6 +62,8 @@ void ReportWrongSwitches(RARFORMAT Format); #endif + void GetBriefMaskList(const std::wstring &Masks,StringList &Args); + std::wstring Command; std::wstring ArcName; @@ -78,6 +86,9 @@ StringList InclArgs; StringList ArcNames; StringList StoreArgs; +#ifdef PROPAGATE_MOTW + StringList MotwList; // Extensions to assign the mark of the web. +#endif SecPassword Password; Modified: branches/OpenMPT-1.31/include/unrar/cmdmix.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/cmdmix.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/cmdmix.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -63,12 +63,12 @@ MCHelpSwAT,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG,MCHelpSwAI,MCHelpSwAP, MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,MCHelpSwDH,MCHelpSwEP, MCHelpSwEP3,MCHelpSwEP4,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, - MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwME,MCHelpSwN,MCHelpSwNa, - MCHelpSwNal,MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOP,MCHelpSwOR, - MCHelpSwOW,MCHelpSwP,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSI, - MCHelpSwSL,MCHelpSwSM,MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO, - MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX, - MCHelpSwXa,MCHelpSwXal,MCHelpSwY + MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwME,MCHelpSwMLP, + MCHelpSwN,MCHelpSwNa,MCHelpSwNal,MCHelpSwO,MCHelpSwOC,MCHelpSwOL, + MCHelpSwOM,MCHelpSwOP,MCHelpSwOR,MCHelpSwOW,MCHelpSwP,MCHelpSwR, + MCHelpSwRI,MCHelpSwSC,MCHelpSwSI,MCHelpSwSL,MCHelpSwSM,MCHelpSwTA, + MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr, + MCHelpSwVER,MCHelpSwVP,MCHelpSwX,MCHelpSwXa,MCHelpSwXal,MCHelpSwY #endif }; @@ -80,7 +80,7 @@ #ifndef _WIN_ALL static MSGID Win32Only[]={ MCHelpSwIEML,MCHelpSwVD,MCHelpSwAO,MCHelpSwOS,MCHelpSwIOFF, - MCHelpSwEP2,MCHelpSwOC,MCHelpSwONI,MCHelpSwDR,MCHelpSwRI + MCHelpSwEP2,MCHelpSwMLP,MCHelpSwOC,MCHelpSwONI,MCHelpSwDR,MCHelpSwRI }; bool Found=false; for (uint J=0;J<ASIZE(Win32Only);J++) Modified: branches/OpenMPT-1.31/include/unrar/consio.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/consio.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/consio.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -255,7 +255,7 @@ #ifndef SILENT -bool getwstr(std::wstring &str) +void getwstr(std::wstring &str) { // Print buffered prompt title function before waiting for input. fflush(stderr); @@ -281,8 +281,8 @@ if (ReadSize<=0) { // Looks like stdin is a null device. We can enter to infinite loop - // calling Ask(), so let's better exit. - ErrHandler.Exit(RARX_USERBREAK); + // calling Ask() or set an empty password, so let's better exit. + ErrHandler.ReadError(L"stdin"); } StrA[ReadSize]=0; @@ -297,20 +297,26 @@ else { std::vector<wchar> Buf(MaxRead); // Up to 4 UTF-8 characters per wchar_t. + DWORD SizeToRead=(DWORD)Buf.size()-1; + + // ReadConsole fails in Windows 7 for requested input exceeding 30 KB. + // Not certain about Windows 8, so check for Windows 10 here. + if (WinNT()<=WNT_W10) + SizeToRead=Min(SizeToRead,0x4000); + DWORD ReadSize=0; - if (ReadConsole(GetStdHandle(STD_INPUT_HANDLE),&Buf[0],(DWORD)Buf.size()-1,&ReadSize,NULL)==0) - return false; + if (ReadConsole(GetStdHandle(STD_INPUT_HANDLE),&Buf[0],SizeToRead,&ReadSize,NULL)==0) + ErrHandler.ReadError(L"stdin"); // Unknown user input, safer to abort. Buf[ReadSize]=0; str=Buf.data(); } #else std::vector<wchar> Buf(MaxRead); // Up to 4 UTF-8 characters per wchar_t. if (fgetws(&Buf[0],Buf.size(),stdin)==NULL) - ErrHandler.Exit(RARX_USERBREAK); // Avoid infinite Ask() loop. + ErrHandler.ReadError(L"stdin"); // Avoid infinite Ask() loop. str=Buf.data(); #endif RemoveLF(str); - return true; } #endif @@ -324,22 +330,22 @@ { uiAlarm(UIALARM_QUESTION); - const int MaxItems=10; + const uint MaxItems=10; wchar Item[MaxItems][40]; - int ItemKeyPos[MaxItems],NumItems=0; + uint ItemKeyPos[MaxItems],NumItems=0; - for (const wchar *NextItem=AskStr;NextItem!=NULL;NextItem=wcschr(NextItem+1,'_')) + for (const wchar *NextItem=AskStr;NextItem!=nullptr;NextItem=wcschr(NextItem+1,'_')) { wchar *CurItem=Item[NumItems]; wcsncpyz(CurItem,NextItem+1,ASIZE(Item[0])); wchar *EndItem=wcschr(CurItem,'_'); - if (EndItem!=NULL) + if (EndItem!=nullptr) *EndItem=0; - int KeyPos=0,CurKey; + uint KeyPos=0,CurKey; while ((CurKey=CurItem[KeyPos])!=0) { bool Found=false; - for (int I=0;I<NumItems && !Found;I++) + for (uint I=0;I<NumItems && !Found;I++) if (toupperw(Item[I][ItemKeyPos[I]])==toupperw(CurKey)) Found=true; if (!Found && CurKey!=' ') @@ -350,11 +356,11 @@ NumItems++; } - for (int I=0;I<NumItems;I++) + for (uint I=0;I<NumItems;I++) { eprintf(I==0 ? (NumItems>3 ? L"\n":L" "):L", "); - int KeyPos=ItemKeyPos[I]; - for (int J=0;J<KeyPos;J++) + uint KeyPos=ItemKeyPos[I]; + for (uint J=0;J<KeyPos;J++) eprintf(L"%c",Item[I][J]); eprintf(L"[%c]%ls",Item[I][KeyPos],&Item[I][KeyPos+1]); } @@ -362,7 +368,7 @@ std::wstring Str; getwstr(Str); wchar Ch=toupperw(Str[0]); - for (int I=0;I<NumItems;I++) + for (uint I=0;I<NumItems;I++) if (Ch==Item[I][ItemKeyPos[I]]) return I+1; return 0; Modified: branches/OpenMPT-1.31/include/unrar/consio.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/consio.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/consio.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -16,13 +16,13 @@ inline void eprintf(const wchar *fmt,...) {} inline void Alarm() {} inline int Ask(const wchar *AskStr) {return 0;} - inline bool getwstr(std::wstring &str) {return false;} + inline void getwstr(std::wstring &str) {} #else void mprintf(const wchar *fmt,...); void eprintf(const wchar *fmt,...); void Alarm(); int Ask(const wchar *AskStr); - bool getwstr(std::wstring &str); + void getwstr(std::wstring &str); #endif #endif Modified: branches/OpenMPT-1.31/include/unrar/crypt.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/crypt.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/crypt.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -3,7 +3,8 @@ enum CRYPT_METHOD { - CRYPT_NONE,CRYPT_RAR13,CRYPT_RAR15,CRYPT_RAR20,CRYPT_RAR30,CRYPT_RAR50 + CRYPT_NONE,CRYPT_RAR13,CRYPT_RAR15,CRYPT_RAR20,CRYPT_RAR30,CRYPT_RAR50, + CRYPT_UNKNOWN }; #define SIZE_SALT50 16 Modified: branches/OpenMPT-1.31/include/unrar/dll.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/dll.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/dll.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -16,8 +16,7 @@ HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *r) { - RAROpenArchiveDataEx rx; - memset(&rx,0,sizeof(rx)); + RAROpenArchiveDataEx rx{}; rx.ArcName=r->ArcName; rx.OpenMode=r->OpenMode; rx.CmtBuf=r->CmtBuf; @@ -32,7 +31,7 @@ HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *r) { - DataSet *Data=NULL; + DataSet *Data=nullptr; try { ErrHandler.Clean(); @@ -74,7 +73,7 @@ { r->OpenResult=ERAR_EOPEN; delete Data; - return NULL; + return nullptr; } if (!Data->Arc.IsArchive(true)) { @@ -89,7 +88,7 @@ r->OpenResult=ERAR_BAD_ARCHIVE; } delete Data; - return NULL; + return nullptr; } r->Flags=0; @@ -115,7 +114,7 @@ std::wstring CmtDataW; if (r->CmtBufSize!=0 && Data->Arc.GetComment(CmtDataW)) { - if (r->CmtBufW!=NULL) + if (r->CmtBufW!=nullptr) { // CmtDataW.push_back(0); size_t Size=wcslen(CmtDataW.data())+1; @@ -141,6 +140,18 @@ else r->CmtState=r->CmtSize=0; +#ifdef PROPAGATE_MOTW + if (r->MarkOfTheWeb!=nullptr) + { + Data->Cmd.MotwAllFields=r->MarkOfTheWeb[0]=='1'; + const wchar *Sep=wcschr(r->MarkOfTheWeb,'='); + if (r->MarkOfTheWeb[0]=='-') + Data->Cmd.MotwList.Reset(); + else + Data->Cmd.GetBriefMaskList(Sep==nullptr ? L"*":Sep+1,Data->Cmd.MotwList); + } +#endif + Data->Extract.ExtractArchiveInit(Data->Arc); return (HANDLE)Data; } @@ -494,6 +505,8 @@ return ERAR_BAD_PASSWORD; case RARX_SUCCESS: return ERAR_SUCCESS; // 0. + case RARX_BADARC: + return ERAR_BAD_ARCHIVE; default: return ERAR_UNKNOWN; } Modified: branches/OpenMPT-1.31/include/unrar/dll.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/dll.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/dll.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -157,7 +157,8 @@ LPARAM UserData; unsigned int OpFlags; wchar_t *CmtBufW; - unsigned int Reserved[25]; + wchar_t *MarkOfTheWeb; + unsigned int Reserved[23]; }; enum UNRARCALLBACK_MESSAGES { Modified: branches/OpenMPT-1.31/include/unrar/errhnd.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/errhnd.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/errhnd.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -16,6 +16,7 @@ RARX_NOFILES = 10, RARX_BADPWD = 11, RARX_READ = 12, + RARX_BADARC = 13, RARX_USERBREAK = 255 }; Modified: branches/OpenMPT-1.31/include/unrar/extinfo.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/extinfo.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/extinfo.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -11,10 +11,6 @@ std::wstring GetStreamNameNTFS(Archive &Arc); -#ifdef _WIN_ALL -bool SetPrivilege(LPCTSTR PrivName); -#endif - void SetExtraInfo20(CommandData *Cmd,Archive &Arc,const std::wstring &Name); void SetExtraInfo(CommandData *Cmd,Archive &Arc,const std::wstring &Name); void SetFileHeaderExtra(CommandData *Cmd,Archive &Arc,const std::wstring &Name); Modified: branches/OpenMPT-1.31/include/unrar/extract.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/extract.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/extract.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -25,6 +25,7 @@ #ifdef RAR_SMP Unp->SetThreads(Cmd->Threads); #endif + Unp->AllowLargePages(Cmd->UseLargePages); } @@ -112,6 +113,15 @@ void CmdExtract::ExtractArchiveInit(Archive &Arc) { + if (Cmd->Command[0]=='T' || Cmd->Command[0]=='I') + Cmd->Test=true; + +#ifdef PROPAGATE_MOTW + // Invoke here, so it is also supported by unrar.dll. + if (!Cmd->Test && Cmd->MotwList.ItemsCount()>0) + Arc.Motw.ReadZoneIdStream(Arc.FileName,Cmd->MotwAllFields); +#endif + DataIO.AdjustTotalArcSize(&Arc); FileCount=0; @@ -178,12 +188,18 @@ } #endif - mprintf(St(MNotRAR),ArcName.c_str()); - + bool RarExt=false; #ifndef SFX_MODULE - if (CmpExt(ArcName,L"rar")) + RarExt=CmpExt(ArcName,L"rar"); #endif - ErrHandler.SetErrorCode(RARX_WARNING); + + if (RarExt) + uiMsg(UIERROR_BADARCHIVE,ArcName); // Non-archive .rar file. + else + mprintf(St(MNotRAR),ArcName.c_str()); // Non-archive not .rar file, likely in "rar x *.*". + + if (RarExt) + ErrHandler.SetErrorCode(RARX_BADARC); return EXTRACT_ARC_NEXT; } @@ -254,9 +270,6 @@ ExtractArchiveInit(Arc); - if (Cmd->Command[0]=='T' || Cmd->Command[0]=='I') - Cmd->Test=true; - if (Cmd->Command[0]=='I') { @@ -494,7 +507,7 @@ DestFileName=!Cmd->TempPath.empty() ? Cmd->TempPath:Cmd->ExtrPath; AddEndSlash(DestFileName); DestFileName+=L"__tmp_reference_source_"; - MkTemp(DestFileName); + MkTemp(DestFileName,nullptr); MatchedRef.TmpName=DestFileName; } RefTarget=true; // Need it even for 't' to test the reference source. @@ -555,6 +568,7 @@ return !Arc.Solid; // Can try extracting next file only in non-solid archive. } +#ifndef RAR_NOCRYPT // For rarext.dll, Setup.SFX and unrar_nocrypt.dll. if (Arc.FileHead.Encrypted) { RarCheckPassword CheckPwd; @@ -581,9 +595,9 @@ // Set a password before creating the file, so we can skip creating // in case of wrong password. SecPassword FilePassword=Cmd->Password; - #if defined(_WIN_ALL) && !defined(SFX_MODULE) +#if defined(_WIN_ALL) && !defined(SFX_MODULE) ConvertDosPassword(Arc,FilePassword); - #endif +#endif byte PswCheck[SIZE_PSWCHECK]; bool EncSet=DataIO.SetEncryption(false,Arc.FileHead.CryptMethod, @@ -611,16 +625,16 @@ // Avoid new requests for unrar.dll to prevent the infinite loop // if app always returns the same password. - #ifndef RARDLL +#ifndef RARDLL continue; // Request a password again. - #endif +#endif } - #ifdef RARDLL +#ifdef RARDLL // If we already have ERAR_EOPEN as result of missing volume, // we should not replace it with less precise ERAR_BAD_PASSWORD. if (Cmd->DllError!=ERAR_EOPEN) Cmd->DllError=ERAR_BAD_PASSWORD; - #endif +#endif ErrHandler.SetErrorCode(RARX_BADPWD); ExtrFile=false; } @@ -629,6 +643,7 @@ } else DataIO.SetEncryption(false,CRYPT_NONE,NULL,NULL,NULL,0,NULL,NULL); +#endif // RAR_NOCRYPT // Per file symlink conversion flag. Can be turned off in unrar.dll. bool CurConvertSymlinkPaths=ConvertSymlinkPaths; @@ -690,7 +705,29 @@ // any overwrite prompts. if (!CheckWinLimit(Arc,ArcFileName)) return false; - ExtrFile=ExtrCreateFile(Arc,CurFile); + + // Read+write mode is required to set "Compressed" attribute. + // Other than that prefer the write only mode to avoid + // OpenIndiana NAS problem with SetFileTime and read+write files. +#if defined(_WIN_ALL) && !defined(SFX_MODULE) + bool Compressed=Cmd->SetCompressedAttr && + (Arc.FileHead.FileAttr & FILE_ATTRIBUTE_COMPRESSED)!=0; + bool WriteOnly=!Compressed; +#else + bool WriteOnly=true; +#endif + + ExtrFile=ExtrCreateFile(Arc,CurFile,WriteOnly); + +#if defined(_WIN_ALL) && !defined(SFX_MODULE) + // 2024.03.12: Set early to compress written data immediately. + // For 10 GB text file it was ~1.5x faster than when set after close. + + if (ExtrFile && Compressed) + SetFileCompression(CurFile.GetHandle(),true); + +#endif + } if (!ExtrFile && Arc.Solid) @@ -973,6 +1010,9 @@ if (Preallocated>0 && (BrokenFile || DataIO.CurUnpWrite!=Preallocated)) CurFile.Truncate(); +#ifdef PROPAGATE_MOTW + Arc.Motw.CreateZoneIdStream(DestFileName,Cmd->MotwList); +#endif CurFile.SetOpenFileTime( Cmd->xmtime==EXTTIME_NONE ? NULL:&Arc.FileHead.mtime, @@ -992,9 +1032,6 @@ if (SetAttr) { #if defined(_WIN_ALL) && !defined(SFX_MODULE) - if (Cmd->SetCompressedAttr && - (Arc.FileHead.FileAttr & FILE_ATTRIBUTE_COMPRESSED)!=0) - SetFileCompression(DestFileName,true); if (Cmd->ClearArc) Arc.FileHead.FileAttr&=~FILE_ATTRIBUTE_ARCHIVE; #endif @@ -1416,7 +1453,7 @@ } -bool CmdExtract::ExtrCreateFile(Archive &Arc,File &CurFile) +bool CmdExtract::ExtrCreateFile(Archive &Arc,File &CurFile,bool WriteOnly) { return true; // OPENMPT ADDITION bool Success=true; @@ -1428,9 +1465,7 @@ if ((Command=='E' || Command=='X') && !Cmd->Test) { bool UserReject; - // Specify "write only" mode to avoid OpenIndiana NAS problems - // with SetFileTime and read+write files. - if (!FileCreate(Cmd,&CurFile,DestFileName,&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime,true)) + if (!FileCreate(Cmd,&CurFile,DestFileName,&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime,WriteOnly)) { Success=false; if (!UserReject) @@ -1490,10 +1525,16 @@ if (Arc.FileHead.Method==0) WrongVer=false; + // Can't unpack the unknown encryption even for stored files. + if (Arc.FileHead.CryptMethod==CRYPT_UNKNOWN) + WrongVer=true; + if (WrongVer) { ErrHandler.UnknownMethodMsg(Arc.FileName,ArcFileName); - uiMsg(UIERROR_NEWERRAR,Arc.FileName); + // No need to suggest a new version if it is just a broken archive. + if (!Arc.BrokenHeader) + uiMsg(UIERROR_NEWERRAR,Arc.FileName); } return !WrongVer; } Modified: branches/OpenMPT-1.31/include/unrar/extract.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/extract.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/extract.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -37,7 +37,7 @@ void ConvertDosPassword(Archive &Arc,SecPassword &DestPwd); #endif void ExtrCreateDir(Archive &Arc,const std::wstring &ArcFileName); - bool ExtrCreateFile(Archive &Arc,File &CurFile); + bool ExtrCreateFile(Archive &Arc,File &CurFile,bool WriteOnly); bool CheckUnpVer(Archive &Arc,const std::wstring &ArcFileName); #ifndef SFX_MODULE void AnalyzeArchive(const std::wstring &ArcName,bool Volume,bool NewNumbering); Modified: branches/OpenMPT-1.31/include/unrar/filefn.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/filefn.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/filefn.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -132,6 +132,8 @@ } + + bool IsRemovable(const std::wstring &Name) { return false; // OPENMPT ADDITION @@ -330,10 +332,10 @@ } -wchar* MkTemp(wchar *Name,size_t MaxSize) +// Ext is the extension with the leading dot, like L".bat", or nullptr to use +// the default extension. +bool MkTemp(std::wstring &Name,const wchar *Ext) { - size_t Length=wcslen(Name); - RarTime CurTime; CurTime.SetCurrentTime(); @@ -352,47 +354,20 @@ for (uint Attempt=0;;Attempt++) { - uint Ext=Random%50000+Attempt; - wchar RndText[50]; + uint RandomExt=Random%50000+Attempt; + if (Attempt==1000) + return false; + // User asked to specify the single extension for all temporary files, // so it can be added to server ransomware protection exceptions. // He wrote, this protection blocks temporary files when adding - // a file to RAR archive with drag and drop. - swprintf(RndText,ASIZE(RndText),L"%u.%03u.rartemp",PID,Ext); - if (Length+wcslen(RndText)>=MaxSize || Attempt==1000) - return NULL; - wcsncpyz(Name+Length,RndText,MaxSize-Length); - if (!FileExist(Name)) - break; - } - return Name; -} - - -bool MkTemp(std::wstring &Name) -{ - RarTime CurTime; - CurTime.SetCurrentTime(); - - // We cannot use CurTime.GetWin() as is, because its lowest bits can - // have low informational value, like being a zero or few fixed numbers. - uint Random=(uint)(CurTime.GetWin()/100000); - - // Using PID we guarantee that different RAR copies use different temp names - // even if started in exactly the same time. - uint PID=0; -#ifdef _WIN_ALL - PID=(uint)GetCurrentProcessId(); -#elif defined(_UNIX) - PID=(uint)getpid(); -#endif + // a file to RAR archive with drag and drop. So unless a calling code + // requires a specific extension, like .bat file when uninstalling, + // we set the uniform extension here. + if (Ext==nullptr) + Ext=L".rartemp"; - for (uint Attempt=0;;Attempt++) - { - uint Ext=Random%50000+Attempt; - if (Attempt==1000) - return false; - std::wstring NewName=Name + std::to_wstring(PID) + L"." + std::to_wstring(Ext) + L".rartemp"; + std::wstring NewName=Name + std::to_wstring(PID) + L"." + std::to_wstring(RandomExt) + Ext; if (!FileExist(NewName)) { Name=NewName; @@ -559,14 +534,21 @@ hFile=CreateFile(LongName.c_str(),FILE_READ_DATA|FILE_WRITE_DATA, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_SEQUENTIAL_SCAN,NULL); + if (hFile==INVALID_HANDLE_VALUE) + return false; } - if (hFile==INVALID_HANDLE_VALUE) - return false; + bool Success=SetFileCompression(hFile,State); + CloseHandle(hFile); + return Success; +} + + +bool SetFileCompression(HANDLE hFile,bool State) +{ SHORT NewState=State ? COMPRESSION_FORMAT_DEFAULT:COMPRESSION_FORMAT_NONE; DWORD Result; int RetCode=DeviceIoControl(hFile,FSCTL_SET_COMPRESSION,&NewState, sizeof(NewState),NULL,0,&Result,NULL); - CloseHandle(hFile); return RetCode!=0; } Modified: branches/OpenMPT-1.31/include/unrar/filefn.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/filefn.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/filefn.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -6,7 +6,10 @@ MKDIR_CODE MakeDir(const std::wstring &Name,bool SetAttr,uint Attr); bool CreateDir(const std::wstring &Name); bool CreatePath(const std::wstring &Path,bool SkipLastName,bool Silent); + void SetDirTime(const std::wstring &Name,RarTime *ftm,RarTime *ftc,RarTime *fta); + + bool IsRemovable(const std::wstring &Name); #ifndef SFX_MODULE @@ -28,8 +31,7 @@ void PrepareToDelete(const std::wstring &Name); uint GetFileAttr(const std::wstring &Name); bool SetFileAttr(const std::wstring &Name,uint Attr); -wchar* MkTemp(wchar *Name,size_t MaxSize); -bool MkTemp(std::wstring &Name); +bool MkTemp(std::wstring &Name,const wchar *Ext); enum CALCFSUM_FLAGS {CALCFSUM_SHOWTEXT=1,CALCFSUM_SHOWPERCENT=2,CALCFSUM_SHOWPROGRESS=4,CALCFSUM_CURPOS=8}; @@ -41,6 +43,7 @@ #if defined(_WIN_ALL) && !defined(SFX_MODULE) bool SetFileCompression(const std::wstring &Name,bool State); +bool SetFileCompression(HANDLE hFile,bool State); void ResetFileCache(const std::wstring &Name); #endif Modified: branches/OpenMPT-1.31/include/unrar/hash.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/hash.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/hash.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -275,7 +275,9 @@ { HashValue Final; Result(&Final); - if (Key!=NULL) +#ifndef RAR_NOCRYPT + if (Key!=nullptr) ConvertHashToMAC(&Final,Key); +#endif return Final==*CmpValue; } Modified: branches/OpenMPT-1.31/include/unrar/hash.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/hash.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/hash.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -13,6 +13,8 @@ bool operator == (const HashValue &cmp) const; // Not actually used now. Const member for same reason as operator == above. + // Can be removed after switching to C++20, which automatically provides "!=" + // if operator == is defined. bool operator != (const HashValue &cmp) const {return !(*this==cmp);} HASH_TYPE Type; Copied: branches/OpenMPT-1.31/include/unrar/largepage.cpp (from r22480, trunk/OpenMPT/include/unrar/largepage.cpp) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ branches/OpenMPT-1.31/include/unrar/largepage.cpp Wed Jan 1 02:15:46 2025 (r22674, copy of r22480, trunk/OpenMPT/include/unrar/largepage.cpp) @@ -0,0 +1,201 @@ +#include "rar.hpp" + +/* +To enable, disable or check Large Memory pages manually: +- open "Local Security Policy" from "Start Menu"; +- open "Lock Pages in Memory" in "Local Policies\User Rights Assignment"; +- add or remove the user and sign out and sign in or restart Windows. +*/ + +#if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(RARDLL) +#define ALLOW_LARGE_PAGES +#endif + +LargePageAlloc::LargePageAlloc() +{ + UseLargePages=false; +#ifdef ALLOW_LARGE_PAGES + PageSize=0; +#endif +} + + +void LargePageAlloc::AllowLargePages(bool Allow) +{ +#ifdef ALLOW_LARGE_PAGES + if (Allow && PageSize==0) + { + HMODULE hKernel=GetModuleHandle(L"kernel32.dll"); + if (hKernel!=nullptr) + { + typedef SIZE_T (*GETLARGEPAGEMINIMUM)(); + GETLARGEPAGEMINIMUM pGetLargePageMinimum=(GETLARGEPAGEMINIMUM)GetProcAddress(hKernel, "GetLargePageMinimum"); + if (pGetLargePageMinimum!=nullptr) + PageSize=pGetLargePageMinimum(); + } + if (PageSize==0 || !SetPrivilege(SE_LOCK_MEMORY_NAME)) + { + UseLargePages=false; + return; + } + } + + UseLargePages=Allow; +#endif +} + + +bool LargePageAlloc::IsPrivilegeAssigned() +{ +#ifdef ALLOW_LARGE_PAGES + return SetPrivilege(SE_LOCK_MEMORY_NAME); +#else + return true; +#endif +} + + +bool LargePageAlloc::AssignPrivilege() +{ +#ifdef ALLOW_LARGE_PAGES + HANDLE hToken = NULL; + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) + return false; + + // Get the required buffer size. + DWORD BufSize=0; + GetTokenInformation(hToken, TokenUser, NULL, 0, &BufSize); + if (BufSize==0 || BufSize>1000000) // Sanity check for returned value. + { + CloseHandle(hToken); + return false; + } + + TOKEN_USER *TokenInfo = (TOKEN_USER*)malloc(BufSize); + + // Get the current user token information. + if (GetTokenInformation(hToken,TokenUser,TokenInfo,BufSize,&BufSize)==0) + { + CloseHandle(hToken); + return false; + } + + // Get SID string for the current user. + LPWSTR ApiSidStr; + ConvertSidToStringSid(TokenInfo->User.Sid, &ApiSidStr); + + // Convert SID to C++ string and release API based buffer. + std::wstring SidStr=ApiSidStr; + LocalFree(ApiSidStr); + CloseHandle(hToken); + + if (IsUserAdmin()) + AssignPrivilegeBySid(SidStr); + else + { + // Define here, so they survive until ShellExecuteEx call. + std::wstring ExeName=GetModuleFileStr(); + std::wstring Param=std::wstring(L"-") + LOCKMEM_SWITCH + SidStr; + + SHELLEXECUTEINFO shExecInfo{}; + shExecInfo.cbSize = sizeof(shExecInfo); + + shExecInfo.hwnd = NULL; // Specifying WinRAR main window here does not work well in command line mode. + shExecInfo.lpVerb = L"runas"; + shExecInfo.lpFile = ExeName.c_str(); + shExecInfo.lpParameters = Param.c_str(); + shExecInfo.nShow = SW_SHOWNORMAL; + BOOL Result=ShellExecuteEx(&shExecInfo); + } +#endif + + return true; +} + + +bool LargePageAlloc::AssignPrivilegeBySid(const std::wstring &Sid) +{ +#ifdef ALLOW_LARGE_PAGES + LSA_HANDLE PolicyHandle; + LSA_OBJECT_ATTRIBUTES ObjectAttributes{}; // Docs require to zero initalize it. + +#ifndef STATUS_SUCCESS // Can be defined through WIL package in WinRAR. + // We define STATUS_SUCCESS here instead of including ntstatus.h to avoid + // macro redefinition warnings. We tried UMDF_USING_NTSTATUS define + // and other workarounds, but it didn't help. + const uint STATUS_SUCCESS=0; +#endif + + if (LsaOpenPolicy(NULL,&ObjectAttributes,POLICY_CREATE_ACCOUNT| + POLICY_LOOKUP_NAMES,&PolicyHandle)!=STATUS_SUCCESS) + return false; + + PSID UserSid; + ConvertStringSidToSid(Sid.c_str(),&UserSid); + + LSA_UNICODE_STRING LsaString; + LsaString.Buffer=(PWSTR)SE_LOCK_MEMORY_NAME; + // It must be in bytes, so multiple it to sizeof(wchar_t). + LsaString.Length=(USHORT)wcslen(LsaString.Buffer)*sizeof(LsaString.Buffer[0]); + LsaString.MaximumLength=LsaString.Length; + + bool Success=LsaAddAccountRights(PolicyHandle,UserSid,&LsaString,1)==STATUS_SUCCESS; + + LocalFree(UserSid); + LsaClose(PolicyHandle); + + mprintf(St(MPrivilegeAssigned)); + if (Ask(St(MYesNo)) == 1) + Shutdown(POWERMODE_RESTART); + + return Success; +#else + return true; +#endif +} + + +bool LargePageAlloc::AssignConfirmation() +{ +#ifdef ALLOW_LARGE_PAGES + mprintf(St(MLockInMemoryNeeded)); + return Ask(St(MYesNo)) == 1; +#else + return false; +#endif +} + + +void* LargePageAlloc::new_large(size_t Size) +{ + void *Allocated=nullptr; + +#ifdef ALLOW_LARGE_PAGES + if (UseLargePages && Size>=PageSize) + { + // VirtualAlloc fails if allocation size isn't multiple of page size. + SIZE_T AllocSize=Size%PageSize==0 ? Size:(Size/PageSize+1)*PageSize; + Allocated=VirtualAlloc(nullptr,AllocSize,MEM_COMMIT|MEM_RESERVE|MEM_LARGE_PAGES,PAGE_READWRITE); + if (Allocated!=nullptr) + LargeAlloc.push_back(Allocated); + } +#endif + return Allocated; +} + + +bool LargePageAlloc::delete_large(void *Addr) +{ +#ifdef ALLOW_LARGE_PAGES + if (Addr!=nullptr) + for (size_t I=0;I<LargeAlloc.size();I++) + if (LargeAlloc[I]==Addr) + { + LargeAlloc[I]=nullptr; + VirtualFree(Addr,0,MEM_RELEASE); + return true; + } +#endif + return false; +} Copied: branches/OpenMPT-1.31/include/unrar/largepage.hpp (from r22480, trunk/OpenMPT/include/unrar/largepage.hpp) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ branches/OpenMPT-1.31/include/unrar/largepage.hpp Wed Jan 1 02:15:46 2025 (r22674, copy of r22480, trunk/OpenMPT/include/unrar/largepage.hpp) @@ -0,0 +1,55 @@ +#ifndef _RAR_LARGEPAGE_ +#define _RAR_LARGEPAGE_ + +class LargePageAlloc +{ + private: + static constexpr const wchar *LOCKMEM_SWITCH=L"isetup_privilege_lockmem"; + + void* new_large(size_t Size); + bool delete_large(void *Addr); +#ifdef _WIN_ALL + std::vector<void*> LargeAlloc; + [[maybe_unused]] // OPENMPT ADDITION + SIZE_T PageSize; +#endif + bool UseLargePages; + public: + LargePageAlloc(); + void AllowLargePages(bool Allow); + static bool IsPrivilegeAssigned(); + static bool AssignPrivilege(); + static bool AssignPrivilegeBySid(const std::wstring &Sid); + static bool AssignConfirmation(); + + static bool ProcessSwitch(CommandData *Cmd,const wchar *Switch) + { + if (Switch[0]==LOCKMEM_SWITCH[0]) + { + size_t Length=wcslen(LOCKMEM_SWITCH); + if (wcsncmp(Switch,LOCKMEM_SWITCH,Length)==0) + { + LargePageAlloc::AssignPrivilegeBySid(Switch+Length); + return true; + } + } + return false; + } + + template <class T> T* new_l(size_t Size,bool Clear=false) + { + T *Allocated=(T*)new_large(Size*sizeof(T)); + if (Allocated==nullptr) + Allocated=Clear ? new T[Size]{} : new T[Size]; + return Allocated; + } + + template <class T> void delete_l(T *Addr) + { + if (!delete_large(Addr)) + delete[] Addr; + } +}; + + +#endif Modified: branches/OpenMPT-1.31/include/unrar/list.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/list.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/list.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -37,7 +37,7 @@ mprintf(L"\n%s: %s",St(MListArchive),Arc.FileName.c_str()); mprintf(L"\n%s: ",St(MListDetails)); - const wchar *Fmt=Arc.Format==RARFMT14 ? L"RAR 1.4":(Arc.Format==RARFMT15 ? L"RAR 4":L"RAR 5"); + const wchar *Fmt=Arc.Format==RARFMT14 ? L"RAR 1.4":(Arc.Format==RARFMT15 ? L"RAR 1.5":L"RAR 5"); mprintf(L"%s", Fmt... [truncated message content] |
From: <sv...@op...> - 2025-01-01 01:11:23
|
Author: sagamusix Date: Wed Jan 1 02:11:11 2025 New Revision: 22673 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22673 Log: Merged revision(s) 22478 from trunk/OpenMPT: [Fix] XM: In non-compatible linear slide mode, avoid shifting the period by arbitrary bit amounts if the period is extremely high. This caused the frequency to wrap around, which should not happen in non-compatible mode. Found with afl++ + ubsan. ........ 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 Wed Jan 1 02:02:08 2025 (r22672) +++ branches/OpenMPT-1.31/soundlib/Snd_fx.cpp Wed Jan 1 02:11:11 2025 (r22673) @@ -6302,6 +6302,8 @@ octave = ((14 - div) & 0x1F); } else { + if(period > 29 * 768) + return 0; octave = (period / 768) + 2; } return (XMLinearTable[period % 768] << (FREQ_FRACBITS + 2)) >> octave; |
From: <sv...@op...> - 2025-01-01 01:02:20
|
Author: sagamusix Date: Wed Jan 1 02:02:08 2025 New Revision: 22672 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22672 Log: [Mod] Rename cue point preview keyboard shortcuts. Modified: branches/OpenMPT-1.31/mptrack/CommandSet.cpp Modified: branches/OpenMPT-1.31/mptrack/CommandSet.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/CommandSet.cpp Wed Jan 1 02:01:02 2025 (r22671) +++ branches/OpenMPT-1.31/mptrack/CommandSet.cpp Wed Jan 1 02:02:08 2025 (r22672) @@ -1392,7 +1392,7 @@ for(int j = kcStartSampleCues; j <= kcEndSampleCues; j++) { - CString s = MPT_CFORMAT("Preview Sample Cue {}")(j - kcStartSampleCues + 1); + CString s = MPT_CFORMAT("Preview / Set Sample Cue {}")(j - kcStartSampleCues + 1); m_commands[j] = {static_cast<uint32>(1924 + j - kcStartSampleCues), s}; } static_assert(1924 + kcEndSampleCues - kcStartSampleCues < 1950); |
From: <sv...@op...> - 2025-01-01 01:01:09
|
Author: sagamusix Date: Wed Jan 1 02:01:02 2025 New Revision: 22671 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22671 Log: Merged revision(s) 22639 from trunk/OpenMPT: [Fix] Plugin notes played live were no longer cleaning their channel status correctly with the new plugin NNA logic, causing unused NNA channels to pile up (https://bugs.openmpt.org/view.php?id=1853). ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/Moddoc.cpp Modified: branches/OpenMPT-1.31/mptrack/Moddoc.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/Moddoc.cpp Wed Jan 1 00:28:24 2025 (r22670) +++ branches/OpenMPT-1.31/mptrack/Moddoc.cpp Wed Jan 1 02:01:02 2025 (r22671) @@ -1056,8 +1056,9 @@ // Set instrument (or sample if there are no instruments) chn.ResetEnvelopes(); m_SndFile.InstrumentChange(chn, params.m_instr); - } else if(params.m_sample > 0 && params.m_sample <= GetNumSamples()) // Or set sample explicitely + } else if(params.m_sample > 0 && params.m_sample <= GetNumSamples()) { + // Or set sample explicitly ModSample &sample = m_SndFile.GetSample(params.m_sample); chn.pCurrentSample = sample.samplev(); chn.pModInstrument = nullptr; @@ -1087,8 +1088,6 @@ if(params.m_volume >= 0) chn.nVolume = std::min(params.m_volume, 256); // Handle sample looping. - // Changed line to fix http://forum.openmpt.org/index.php?topic=1700.0 - //if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pchn.nLength)) if ((params.m_loopStart + 16 < params.m_loopEnd) && (params.m_loopStart >= 0) && (chn.pModSample != nullptr)) { chn.position.Set(params.m_loopStart); @@ -1169,13 +1168,15 @@ { CriticalSection cs; + const ModInstrument *pIns = nullptr; + IMixPlugin *pPlugin = nullptr; if(ins != INSTRUMENTINDEX_INVALID && ins <= m_SndFile.GetNumInstruments() && ModCommand::IsNote(ModCommand::NOTE(note))) { - const ModInstrument *pIns = m_SndFile.Instruments[ins]; - if(pIns && pIns->HasValidMIDIChannel()) // instro sends to a midi chan + pIns = m_SndFile.Instruments[ins]; + if(pIns && pIns->HasValidMIDIChannel()) { - PLUGINDEX plug = pIns->nMixPlug; // First try intrument VST - if((!plug || plug > MAX_MIXPLUGINS) // No good plug yet + PLUGINDEX plug = pIns->nMixPlug; // First try instrument VST + if((!plug || plug > MAX_MIXPLUGINS) // No good plug yet && currentChn < MAX_BASECHANNELS) // Chan OK { plug = m_SndFile.ChnSettings[currentChn].nMixPlugin;// Then try Channel VST @@ -1183,11 +1184,7 @@ if(plug && plug <= MAX_MIXPLUGINS) { - IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[plug - 1].pMixPlugin; - if(pPlugin) - { - pPlugin->MidiCommand(*pIns, pIns->NoteMap[note - NOTE_MIN] | IMixPlugin::MIDI_NOTE_OFF, 0, currentChn); - } + pPlugin = m_SndFile.m_MixPlugins[plug - 1].pMixPlugin; } } } @@ -1196,25 +1193,33 @@ const CHANNELINDEX startChn = currentChn != CHANNELINDEX_INVALID ? currentChn : m_SndFile.m_nChannels; const CHANNELINDEX endChn = currentChn != CHANNELINDEX_INVALID ? currentChn + 1 : MAX_CHANNELS; ModChannel *pChn = &m_SndFile.m_PlayState.Chn[startChn]; - for(CHANNELINDEX i = startChn; i < endChn; i++, pChn++) + bool found = false; + for(CHANNELINDEX i = startChn; i < endChn && !found; i++, pChn++) { // Fade all channels > m_nChannels which are playing this note and aren't NNA channels. + if(pPlugin && pChn->pModInstrument == pIns && (currentChn == CHANNELINDEX_INVALID || currentChn == i) && pChn->lastMidiNoteWithoutArp == pIns->NoteMap[note - NOTE_MIN]) + { + pPlugin->MidiCommand(*pIns, pIns->NoteMap[note - NOTE_MIN] | IMixPlugin::MIDI_NOTE_OFF, 0, currentChn); + pChn->lastMidiNoteWithoutArp = NOTE_NONE; + found = true; + } if((pChn->isPreviewNote || i < m_SndFile.GetNumChannels()) && !pChn->dwFlags[mask] && (pChn->nLength || pChn->dwFlags[CHN_ADLIB]) && (note == pChn->nNewNote || note == NOTE_NONE)) { m_SndFile.KeyOff(*pChn); - if (!m_SndFile.m_nInstruments) pChn->dwFlags.reset(CHN_LOOP | CHN_PINGPONGFLAG); - if (fade) pChn->dwFlags.set(CHN_NOTEFADE); + if(!m_SndFile.m_nInstruments) pChn->dwFlags.reset(CHN_LOOP | CHN_PINGPONGFLAG); + if(fade) pChn->dwFlags.set(CHN_NOTEFADE); // Instantly stop samples that would otherwise play forever - if (pChn->pModInstrument && !pChn->pModInstrument->nFadeOut) + if(pChn->pModInstrument && !pChn->pModInstrument->nFadeOut) pChn->nFadeOutVol = 0; if(pChn->dwFlags[CHN_ADLIB] && m_SndFile.m_opl) { m_SndFile.m_opl->NoteOff(i); } - if (note) break; + if(note) + found = true; } } |
From: <sv...@op...> - 2024-12-31 23:28:31
|
Author: sagamusix Date: Wed Jan 1 00:28:24 2025 New Revision: 22670 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22670 Log: [Imp] XM: When tracker ID is "*Converted from FOO-File*", set "made with" version info for Digitrakker accordingly. Modified: trunk/OpenMPT/soundlib/Load_xm.cpp Modified: trunk/OpenMPT/soundlib/Load_xm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp Tue Dec 31 23:37:32 2024 (r22669) +++ trunk/OpenMPT/soundlib/Load_xm.cpp Wed Jan 1 00:28:24 2025 (r22670) @@ -678,9 +678,10 @@ m_playBehaviour.reset(kFT2ST3OffsetOutOfRange); // Fix arpeggios in KAPTENFL.XM m_playBehaviour.reset(kFT2Arpeggio); - } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11)) + } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11) && !memcmp(fileHeader.trackerName + 14, "-File*", 6)) { - madeWith = verDigiTrakker; + madeWith = verDigiTrakker | verConfirmed; + madeWithTracker = UL_("Digitrakker"); } } |
From: <sv...@op...> - 2024-12-31 22:37:50
|
Author: sagamusix Date: Tue Dec 31 23:37:32 2024 New Revision: 22669 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22669 Log: [New] There is now a customizable metronome that can be enabled from the pattern tab or via keyboard shortcut (https://bugs.openmpt.org/view.php?id=689). [Mod] OpenMPT: Version is now 1.32.00.39 Modified: trunk/OpenMPT/common/versionNumber.h trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/DefaultKeyBindings.h trunk/OpenMPT/mptrack/ImageLists.h trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/WindowMessages.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/res/originals/pattern_toolbar.pfi trunk/OpenMPT/mptrack/res/pattern_toolbar.png trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/common/versionNumber.h ============================================================================== --- trunk/OpenMPT/common/versionNumber.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/common/versionNumber.h Tue Dec 31 23:37:32 2024 (r22669) @@ -16,4 +16,4 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 32 #define VER_MINOR 00 -#define VER_MINORMINOR 38 +#define VER_MINORMINOR 39 Modified: trunk/OpenMPT/mptrack/CommandSet.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/CommandSet.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -943,6 +943,7 @@ {2116, kcToggleRecordMIDIVelocity, _T("Toggle Record MIDI Velocity")}, {2117, kcToggleRecordMIDIPitchBend, _T("Toggle Record MIDI Pitch Bend")}, {2118, kcToggleRecordMIDICCs, _T("Toggle Record MIDI CCs")}, + {2119, kcToggleMetronome, _T("Toggle Metronome")}, }; // clang-format on Modified: trunk/OpenMPT/mptrack/CommandSet.h ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/CommandSet.h Tue Dec 31 23:37:32 2024 (r22669) @@ -309,6 +309,7 @@ kcPatternGoto, kcFindInstrument, kcPatternRecord, + kcToggleMetronome, kcSetSpacing, kcSetSpacing0, kcSetSpacing1, Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -131,7 +131,7 @@ void CCtrlComments::OnDPIChanged() { - UpdateView(GeneralHint().MPTOptions(), nullptr); + UpdateView(UpdateHint().MPTOptions(), nullptr); CModControlDlg::OnDPIChanged(); } Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -51,6 +51,8 @@ ON_COMMAND(IDC_PATTERN_PLAY, &CCtrlPatterns::OnPatternPlay) ON_COMMAND(IDC_PATTERN_PLAYFROMSTART, &CCtrlPatterns::OnPatternPlayFromStart) ON_COMMAND(IDC_PATTERN_RECORD, &CCtrlPatterns::OnPatternRecord) + ON_COMMAND(IDC_METRONOME, &CCtrlPatterns::OnToggleMetronome) + ON_COMMAND(ID_METRONOME_SETTINGS, &CCtrlPatterns::OnMetronomeSettings) ON_COMMAND(IDC_PATTERN_LOOP, &CCtrlPatterns::OnChangeLoopStatus) ON_COMMAND(ID_PATTERN_PLAYROW, &CCtrlPatterns::OnPatternPlayRow) ON_COMMAND(ID_PATTERN_CHANNELMANAGER, &CCtrlPatterns::OnChannelManager) @@ -153,6 +155,7 @@ m_ToolBar.AddButton(IDC_PATTERN_STOP, TIMAGE_PATTERN_STOP); m_ToolBar.AddButton(ID_PATTERN_PLAYROW, TIMAGE_PATTERN_PLAYROW); m_ToolBar.AddButton(IDC_PATTERN_RECORD, TIMAGE_PATTERN_RECORD, TBSTYLE_CHECK, (m_bRecord ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); + m_ToolBar.AddButton(IDC_METRONOME, TIMAGE_METRONOME, TBSTYLE_CHECK | TBSTYLE_DROPDOWN, (TrackerSettings::Instance().metronomeEnabled ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP); m_ToolBar.AddButton(ID_PATTERN_VUMETERS, TIMAGE_PATTERN_VUMETERS, TBSTYLE_CHECK, (m_bVUMeters ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); m_ToolBar.AddButton(ID_VIEWPLUGNAMES, TIMAGE_PATTERN_PLUGINS, TBSTYLE_CHECK, (m_bPluginNames ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); @@ -481,6 +484,11 @@ SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); break; + case CTRLMSG_TOGGLE_METRONOME: + m_ToolBar.CheckButton(IDC_METRONOME, m_ToolBar.IsButtonChecked(IDC_METRONOME) ? FALSE : TRUE); + OnToggleMetronome(); + break; + case CTRLMSG_TOGGLE_OVERFLOW_PASTE: m_ToolBar.CheckButton(ID_OVERFLOWPASTE, m_ToolBar.IsButtonChecked(ID_OVERFLOWPASTE) ? FALSE : TRUE); OnToggleOverflowPaste(); @@ -538,6 +546,7 @@ case CTRLMSG_PAT_UPDATE_TOOLBAR: m_ToolBar.CheckButton(ID_OVERFLOWPASTE, (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TRUE : FALSE); + m_ToolBar.CheckButton(IDC_METRONOME, TrackerSettings::Instance().metronomeEnabled ? TRUE : FALSE); break; default: @@ -1103,6 +1112,24 @@ } +void CCtrlPatterns::OnToggleMetronome() +{ + bool enableMetronome = m_ToolBar.IsButtonChecked(IDC_METRONOME) != 0; + TrackerSettings::Instance().metronomeEnabled = enableMetronome; + CMainFrame::GetMainFrame()->UpdateMetronomeSamples(); + theApp.PostMessageToAllViews(WM_MOD_CTRLMSG, CTRLMSG_PAT_UPDATE_TOOLBAR); + SwitchToView(); +} + + +void CCtrlPatterns::OnMetronomeSettings() +{ + MetronomeSettingsDlg dlg{this}; + dlg.DoModal(); + SwitchToView(); +} + + void CCtrlPatterns::OnPatternProperties() { SendViewMessage(VIEWMSG_PATTERNPROPERTIES, PATTERNINDEX_INVALID); @@ -1252,6 +1279,13 @@ menu.DestroyMenu(); break; + case IDC_METRONOME: + menu.CreatePopupMenu(); + menu.AppendMenu(MF_STRING, ID_METRONOME_SETTINGS, _T("&Metronome Settings")); + menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, this); + menu.DestroyMenu(); + break; + case ID_PATTERNDETAIL_DROPDOWN: menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING | (visibleColumns[PatternCursor::instrColumn] ? MF_CHECKED : 0), ID_PATTERNDETAIL_INSTR, ih->GetKeyTextFromCommand(kcToggleVisibilityInstrColumn, _T("Show &Instrument Column"))); @@ -1351,6 +1385,7 @@ case IDC_PATTERN_STOP: s = _T("Stop"); cmd = kcPauseSong; break; case ID_PATTERN_PLAYROW: s = _T("Play Row"); cmd = kcPatternPlayRow; break; case IDC_PATTERN_RECORD: s = _T("Record"); cmd = kcPatternRecord; break; + case IDC_METRONOME: s = _T("Metronome"); cmd = kcToggleMetronome; break; case ID_PATTERN_VUMETERS: s = _T("VU-Meters"); break; case ID_VIEWPLUGNAMES: s = _T("Show Plugins"); break; case ID_PATTERN_CHANNELMANAGER: s = _T("Channel Manager"); cmd = kcViewChannelManager; break; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h Tue Dec 31 23:37:32 2024 (r22669) @@ -252,6 +252,8 @@ afx_msg void OnPatternAmplify(); afx_msg void OnPatternCopy(); afx_msg void OnPatternPaste(); + afx_msg void OnToggleMetronome(); + afx_msg void OnMetronomeSettings(); afx_msg void OnFollowSong(); afx_msg void OnChangeLoopStatus(); // cppcheck-suppress duplInheritedMember Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -1214,80 +1214,13 @@ } -static constexpr std::pair<const mpt::uchar *, const mpt::uchar *> SampleFormats[] -{ - { UL_("Wave Files (*.wav)"), UL_("*.wav") }, -#ifdef MPT_WITH_FLAC - { UL_("FLAC Files (*.flac,*.oga)"), UL_("*.flac;*.oga") }, -#endif // MPT_WITH_FLAC -#if defined(MPT_WITH_OPUSFILE) - { UL_("Opus Files (*.opus,*.oga)"), UL_("*.opus;*.oga") }, -#endif // MPT_WITH_OPUSFILE -#if defined(MPT_WITH_VORBISFILE) || defined(MPT_WITH_STBVORBIS) - { UL_("Ogg Vorbis Files (*.ogg,*.oga)"), UL_("*.ogg;*.oga") }, -#endif // VORBIS -#if defined(MPT_ENABLE_MP3_SAMPLES) - { UL_("MPEG Files (*.mp1,*.mp2,*.mp3)"), UL_("*.mp1;*.mp2;*.mp3") }, -#endif // MPT_ENABLE_MP3_SAMPLES - { UL_("XI Samples (*.xi)"), UL_("*.xi") }, - { UL_("Impulse Tracker Samples (*.its)"), UL_("*.its") }, - { UL_("Scream Tracker Samples (*.s3i,*.smp)"), UL_("*.s3i;*.smp") }, - { UL_("OPL Instruments (*.sb0,*.sb2,*.sbi)"), UL_("*.sb0;*.sb2;*.sbi") }, - { UL_("GF1 Patches (*.pat)"), UL_("*.pat") }, - { UL_("Wave64 Files (*.w64)"), UL_("*.w64") }, - { UL_("CAF Files (*.wav)"), UL_("*.caf") }, - { UL_("AIFF Files (*.aiff,*.8svx)"), UL_("*.aif;*.aiff;*.iff;*.8sv;*.8svx;*.svx") }, - { UL_("Sun Audio (*.au,*.snd)"), UL_("*.au;*.snd") }, - { UL_("SNES BRR Files (*.brr)"), UL_("*.brr") }, -}; - - -static mpt::ustring ConstructFileFilter(bool includeRaw) -{ - mpt::ustring s = U_("All Samples (*.wav,*.flac,*.xi,*.its,*.s3i,*.sbi,...)|"); - bool first = true; - for(const auto &[name, exts] : SampleFormats) - { - if(!first) - s += U_(";"); - else - first = false; - s += exts; - } -#if defined(MPT_WITH_MEDIAFOUNDATION) - std::vector<FileType> mediaFoundationTypes = CSoundFile::GetMediaFoundationFileTypes(); - s += ToFilterOnlyString(mediaFoundationTypes, true).ToUnicode(); -#endif - if(includeRaw) - { - s += U_(";*.raw;*.snd;*.pcm;*.sam"); - } - s += U_("|"); - for(const auto &[name, exts] : SampleFormats) - { - s += name + U_("|"); - s += exts + U_("|"); - } -#if defined(MPT_WITH_MEDIAFOUNDATION) - s += ToFilterString(mediaFoundationTypes, FileTypeFormatShowExtensions).ToUnicode(); -#endif - if(includeRaw) - { - s += U_("Raw Samples (*.raw,*.snd,*.pcm,*.sam)|*.raw;*.snd;*.pcm;*.sam|"); - } - s += U_("All Files (*.*)|*.*||"); - return s; -} - - void CCtrlSamples::OnSampleOpen() { static int nLastIndex = 0; - std::vector<FileType> mediaFoundationTypes = CSoundFile::GetMediaFoundationFileTypes(); FileDialog dlg = OpenFileDialog() .AllowMultiSelect() .EnableAudioPreview() - .ExtensionFilter(ConstructFileFilter(true)) + .ExtensionFilter(ConstructSampleFormatFileFilter(true)) .WorkingDirectory(TrackerSettings::Instance().PathSamples.GetWorkingDir()) .FilterIndex(&nLastIndex); if(!dlg.Show(this)) return; @@ -1302,11 +1235,10 @@ void CCtrlSamples::OnSampleOpenKnown() { static int nLastIndex = 0; - std::vector<FileType> mediaFoundationTypes = CSoundFile::GetMediaFoundationFileTypes(); FileDialog dlg = OpenFileDialog() .AllowMultiSelect() .EnableAudioPreview() - .ExtensionFilter(ConstructFileFilter(false)) + .ExtensionFilter(ConstructSampleFormatFileFilter(false)) .WorkingDirectory(TrackerSettings::Instance().PathSamples.GetWorkingDir()) .FilterIndex(&nLastIndex); if(!dlg.Show(this)) return; Modified: trunk/OpenMPT/mptrack/DefaultKeyBindings.h ============================================================================== --- trunk/OpenMPT/mptrack/DefaultKeyBindings.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/DefaultKeyBindings.h Tue Dec 31 23:37:32 2024 (r22669) @@ -10,6 +10,8 @@ #include "openmpt/all/BuildSettings.hpp" +#pragma once + #include "CommandSet.h" @@ -114,6 +116,7 @@ {kcCursorCopy, VK_RETURN, ModNone, kKeyEventDown, MPT_V("1.31")}, {kcCursorPaste, VK_SPACE, ModNone, kKeyEventDown | kKeyEventRepeat, MPT_V("1.31")}, {kcPatternRecord, VK_SPACE, ModCtrl, kKeyEventDown, MPT_V("1.31")}, + {kcToggleMetronome, 'M', ModAlt, kKeyEventDown, MPT_V("1.32.00.39")}, {kcPatternPlayRow, VK_RETURN, ModCtrl, kKeyEventDown | kKeyEventRepeat, MPT_V("1.31")}, {kcSetSpacing, VK_MENU, ModAlt, kKeyEventDown, MPT_V("1.31")}, {kcSwitchToOrderList, VK_TAB, ModCtrl, kKeyEventDown, MPT_V("1.31")}, Modified: trunk/OpenMPT/mptrack/ImageLists.h ============================================================================== --- trunk/OpenMPT/mptrack/ImageLists.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/ImageLists.h Tue Dec 31 23:37:32 2024 (r22669) @@ -84,7 +84,7 @@ TIMAGE_SAMPLE_DOWNSAMPLE, TIMAGE_PATTERN_DETAIL, TIMAGE_MODULE_FILE, - TIMAGE_PATTERN_DETAIL_HI, // unused + TIMAGE_METRONOME, TIMAGE_PATTERN_PLUGINS, TIMAGE_CHANNELMANAGER, TIMAGE_SAMPLE_INVERT, Modified: trunk/OpenMPT/mptrack/MainFrm.cpp ============================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/MainFrm.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -48,6 +48,7 @@ #include "../common/Profiler.h" #include "../common/version.h" #include "../soundlib/AudioReadTarget.h" +#include "../soundlib/Tables.h" #include "../test/PlaybackTest.h" #include "mpt/audio/span.hpp" #include "mpt/base/alloc.hpp" @@ -263,6 +264,8 @@ m_InputHandler->UpdateMainMenu(); + LoadMetronomeSamples(); + #ifdef MPT_ENABLE_PLAYBACK_TEST_MENU CMenu debugMenu; debugMenu.CreatePopupMenu(); @@ -277,6 +280,8 @@ CMainFrame::~CMainFrame() { CChannelManagerDlg::DestroySharedInstance(); + m_metronomeMeasure.FreeSample(); + m_metronomeBeat.FreeSample(); } @@ -1531,6 +1536,8 @@ m_VUMeterInput = VUMeter(); m_VUMeterOutput = VUMeter(); + UpdateMetronomeSamples(); + if(!StartPlayback()) { UnsetPlaybackSoundFile(); @@ -3139,6 +3146,80 @@ } +void CMainFrame::LoadMetronomeSamples() +{ + const std::tuple<mpt::PathString, ModSample &, const int, const int> metronomeSamples[] = + { + {TrackerSettings::Instance().metronomeSampleMeasure, m_metronomeMeasure, 4, 256}, + {TrackerSettings::Instance().metronomeSampleBeat, m_metronomeBeat, 2, 192}, + }; + CriticalSection cs; + for(auto &[path, sample, speed, amp] : metronomeSamples) + { + sample.FreeSample(); + if(path.empty()) + continue; + if(path != TrackerSettings::GetDefaultMetronomeSample()) + { + mpt::IO::InputFile inputFile(path, TrackerSettings::Instance().MiscCacheCompleteFileBeforeLoading); + if(inputFile.IsValid()) + { + FileReader file = GetFileReader(inputFile); + SAMPLEINDEX srcSmp = m_WaveFile.GetNextFreeSample(); + if(srcSmp == SAMPLEINDEX_INVALID) + srcSmp = 1; + if(m_WaveFile.ReadSampleFromFile(srcSmp, file)) + { + std::swap(sample, m_WaveFile.GetSample(srcSmp)); + sample.Convert(m_WaveFile.GetType(), MOD_TYPE_MPT); + } + } + } + if(!sample.HasSampleData()) + { + sample.Initialize(MOD_TYPE_MPT); + sample.nC5Speed = 8363 * 16; + sample.nLength = 4096; + sample.uFlags.set(CHN_16BIT); + if(sample.AllocateSample()) + { + int16_t *sampleData = sample.sample16(); + for(SmpLength i = 0; i < sample.nLength; i++) + { + sampleData[i] = static_cast<int16>(Util::muldiv(ITSinusTable[(i * speed) % std::size(ITSinusTable)] * amp, 4096 * 4096 - i * i, 4096 * 4096)); + } + } + } + } + UpdateMetronomeVolume(); + UpdateMetronomeSamples(); +} + + +void CMainFrame::UpdateMetronomeSamples() +{ + if(!m_pSndFile) + return; + ModSample *measure = nullptr, *beat = nullptr; + if(TrackerSettings::Instance().metronomeEnabled) + { + measure = &m_metronomeMeasure; + beat = &m_metronomeBeat; + } + CriticalSection cs; + m_pSndFile->SetMetronomeSamples(measure, beat); +} + + +void CMainFrame::UpdateMetronomeVolume() +{ + const float linear = std::pow(10.0f, TrackerSettings::Instance().metronomeVolume / 20.0f); + const uint16 volume = std::clamp(mpt::saturate_round<uint16>(linear * 256.0f), uint16(0), uint16(256)); + CriticalSection cs; + m_metronomeBeat.nVolume = m_metronomeMeasure.nVolume = volume; +} + + HMENU CMainFrame::CreateFileMenu(const size_t maxCount, std::vector<mpt::PathString>& paths, const mpt::PathString &folderName, const uint16 idRangeBegin) { paths.clear(); Modified: trunk/OpenMPT/mptrack/Mainfrm.h ============================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Mainfrm.h Tue Dec 31 23:37:32 2024 (r22669) @@ -206,6 +206,7 @@ // Instrument preview in tree view CSoundFile m_WaveFile; + ModSample m_metronomeMeasure{}, m_metronomeBeat{}; TCHAR m_szUserText[512], m_szInfoText[512], m_szXInfoText[512]; @@ -255,6 +256,9 @@ void midiCloseDevice(); void SetMidiRecordWnd(HWND hwnd) { m_hWndMidi = hwnd; } HWND GetMidiRecordWnd() const { return m_hWndMidi; } + void LoadMetronomeSamples(); + void UpdateMetronomeSamples(); + void UpdateMetronomeVolume(); static int ApplyVolumeRelatedSettings(const DWORD &dwParam1, const uint8 midivolume); Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -2641,4 +2641,71 @@ } +static constexpr std::pair<const mpt::uchar*, const mpt::uchar*> SampleFormats[] +{ + { UL_("Wave Files (*.wav)"), UL_("*.wav") }, +#ifdef MPT_WITH_FLAC + { UL_("FLAC Files (*.flac,*.oga)"), UL_("*.flac;*.oga") }, +#endif // MPT_WITH_FLAC +#if defined(MPT_WITH_OPUSFILE) + { UL_("Opus Files (*.opus,*.oga)"), UL_("*.opus;*.oga") }, +#endif // MPT_WITH_OPUSFILE +#if defined(MPT_WITH_VORBISFILE) || defined(MPT_WITH_STBVORBIS) + { UL_("Ogg Vorbis Files (*.ogg,*.oga)"), UL_("*.ogg;*.oga") }, +#endif // VORBIS +#if defined(MPT_ENABLE_MP3_SAMPLES) + { UL_("MPEG Files (*.mp1,*.mp2,*.mp3)"), UL_("*.mp1;*.mp2;*.mp3") }, +#endif // MPT_ENABLE_MP3_SAMPLES + { UL_("XI Samples (*.xi)"), UL_("*.xi") }, + { UL_("Impulse Tracker Samples (*.its)"), UL_("*.its") }, + { UL_("Scream Tracker Samples (*.s3i,*.smp)"), UL_("*.s3i;*.smp") }, + { UL_("OPL Instruments (*.sb0,*.sb2,*.sbi)"), UL_("*.sb0;*.sb2;*.sbi") }, + { UL_("GF1 Patches (*.pat)"), UL_("*.pat") }, + { UL_("Wave64 Files (*.w64)"), UL_("*.w64") }, + { UL_("CAF Files (*.wav)"), UL_("*.caf") }, + { UL_("AIFF Files (*.aiff,*.8svx)"), UL_("*.aif;*.aiff;*.iff;*.8sv;*.8svx;*.svx") }, + { UL_("Sun Audio (*.au,*.snd)"), UL_("*.au;*.snd") }, + { UL_("SNES BRR Files (*.brr)"), UL_("*.brr") }, +}; + + +mpt::ustring ConstructSampleFormatFileFilter(bool includeRaw) +{ + mpt::ustring s = U_("All Samples (*.wav,*.flac,*.xi,*.its,*.s3i,*.sbi,...)|"); + bool first = true; + for (const auto& [name, exts] : SampleFormats) + { + if (!first) + s += U_(";"); + else + first = false; + s += exts; + } +#if defined(MPT_WITH_MEDIAFOUNDATION) + std::vector<FileType> mediaFoundationTypes = CSoundFile::GetMediaFoundationFileTypes(); + s += ToFilterOnlyString(mediaFoundationTypes, true).ToUnicode(); +#endif + if (includeRaw) + { + s += U_(";*.raw;*.snd;*.pcm;*.sam"); + } + s += U_("|"); + for (const auto& [name, exts] : SampleFormats) + { + s += name + U_("|"); + s += exts + U_("|"); + } +#if defined(MPT_WITH_MEDIAFOUNDATION) + s += ToFilterString(mediaFoundationTypes, FileTypeFormatShowExtensions).ToUnicode(); +#endif + if (includeRaw) + { + s += U_("Raw Samples (*.raw,*.snd,*.pcm,*.sam)|*.raw;*.snd;*.pcm;*.sam|"); + } + s += U_("All Files (*.*)|*.*||"); + return s; +} + + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/Mptrack.h ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Mptrack.h Tue Dec 31 23:37:32 2024 (r22669) @@ -446,6 +446,8 @@ bool ValidateMacroString(CEdit &wnd, const std::string_view prevMacro, bool isParametric, bool allowVariables, bool allowMultiline); +mpt::ustring ConstructSampleFormatFileFilter(bool includeRaw); + /////////////////////////////////////////////////// // Tables Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -11,6 +11,7 @@ #include "stdafx.h" #include "PatternEditorDialogs.h" +#include "FileDialog.h" #include "InputHandler.h" #include "Mainfrm.h" #include "Moddoc.h" @@ -1724,6 +1725,213 @@ *pResult = 0; // bring the tooltip window above other popup windows + ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); + + return TRUE; // message was handled +} + + +///////////////////////////////////////////////////////////////////////// +// Metronome settings + +static constexpr float METRONOME_VOLUME_SCALE = 0.2f; + +BEGIN_MESSAGE_MAP(MetronomeSettingsDlg, DialogBase) + ON_WM_HSCROLL() + + ON_COMMAND(IDC_CHECK1, &MetronomeSettingsDlg::OnToggleMetronome) + ON_COMMAND(IDC_BUTTON1, &MetronomeSettingsDlg::OnBrowseMeasure) + ON_COMMAND(IDC_BUTTON2, &MetronomeSettingsDlg::OnBrowseBeat) + ON_CBN_SELCHANGE(IDC_COMBO1, &MetronomeSettingsDlg::OnSampleChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, &MetronomeSettingsDlg::OnSampleChanged) + ON_EN_KILLFOCUS(IDC_EDIT1, &MetronomeSettingsDlg::OnSampleChanged) + ON_EN_KILLFOCUS(IDC_EDIT2, &MetronomeSettingsDlg::OnSampleChanged) + + ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &MetronomeSettingsDlg::OnToolTipText) +END_MESSAGE_MAP() + + +void MetronomeSettingsDlg::DoDataExchange(CDataExchange* pDX) +{ + DDX_Control(pDX, IDC_SLIDER1, m_volumeSlider); + DDX_Control(pDX, IDC_COMBO1, m_measureCombo); + DDX_Control(pDX, IDC_COMBO2, m_beatCombo); + DDX_Control(pDX, IDC_EDIT1, m_measureEdit); + DDX_Control(pDX, IDC_EDIT2, m_beatEdit); + DDX_Control(pDX, IDC_BUTTON1, m_measureButton); + DDX_Control(pDX, IDC_BUTTON2, m_beatButton); +} + + +MetronomeSettingsDlg::MetronomeSettingsDlg(CWnd *parent) + : DialogBase{IDD_METRONOME_SETTINGS, parent} +{ } + + +void MetronomeSettingsDlg::SetSampleInfo(const mpt::PathString &path, CComboBox &combo, CEdit &edit, CButton &browseButton) +{ + BOOL enable = FALSE; + if(path.empty()) + { + combo.SetCurSel(0); + } else if(path == TrackerSettings::GetDefaultMetronomeSample()) + { + combo.SetCurSel(1); + } else + { + combo.SetCurSel(2); + edit.SetWindowText(path.AsNative().c_str()); + enable = TRUE; + } + edit.EnableWindow(enable); + browseButton.EnableWindow(enable); +} + + +BOOL MetronomeSettingsDlg::OnInitDialog() +{ + DialogBase::OnInitDialog(); + EnableToolTips(); + CheckDlgButton(IDC_CHECK1, TrackerSettings::Instance().metronomeEnabled ? BST_CHECKED : BST_UNCHECKED); + m_volumeSlider.SetRange(static_cast<int>(-48 / METRONOME_VOLUME_SCALE), 0, TRUE); + m_volumeSlider.SetPos(mpt::saturate_round<int>(TrackerSettings::Instance().metronomeVolume / METRONOME_VOLUME_SCALE)); + m_volumeSlider.SetTicFreq(static_cast<int>(3 / METRONOME_VOLUME_SCALE)); + static const TCHAR *Options[] = {_T("Off"), _T("Default (Sine)"), _T("Custom Sample")}; + for(const TCHAR *option : Options) + { + m_measureCombo.AddString(option); + m_beatCombo.AddString(option); + } + SetSampleInfo(TrackerSettings::Instance().metronomeSampleMeasure, m_measureCombo, m_measureEdit, m_measureButton); + SetSampleInfo(TrackerSettings::Instance().metronomeSampleBeat, m_beatCombo, m_beatEdit, m_beatButton); + return TRUE; +} + + +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(); + } +} + + +void MetronomeSettingsDlg::OnToggleMetronome() +{ + TrackerSettings::Instance().metronomeEnabled = IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED; + CMainFrame::GetMainFrame()->UpdateMetronomeSamples(); +} + + +bool MetronomeSettingsDlg::GetSampleInfo(Setting<mpt::PathString> &path, CComboBox &combo, CEdit &edit, CButton &browseButton) +{ + CString s; + bool modified = false; + BOOL enable = FALSE; + switch(combo.GetCurSel()) + { + case 0: + if(path != mpt::PathString{}) + { + modified = true; + path = {}; + } + break; + case 1: + if(path != TrackerSettings::GetDefaultMetronomeSample()) + { + modified = true; + path = TrackerSettings::GetDefaultMetronomeSample(); + } + break; + case 2: + edit.GetWindowText(s); + if(auto newPath = mpt::PathString::FromCString(s); path != newPath) + { + path = newPath; + modified = true; + } + enable = TRUE; + break; + } + edit.EnableWindow(enable); + browseButton.EnableWindow(enable); + return modified; +} + + +void MetronomeSettingsDlg::OnSampleChanged() +{ + bool modified = GetSampleInfo(TrackerSettings::Instance().metronomeSampleMeasure, m_measureCombo, m_measureEdit, m_measureButton); + modified |= GetSampleInfo(TrackerSettings::Instance().metronomeSampleBeat, m_beatCombo, m_beatEdit, m_beatButton); + if(modified) + CMainFrame::GetMainFrame()->LoadMetronomeSamples(); +} + + +mpt::PathString MetronomeSettingsDlg::BrowseForSample(const mpt::PathString &path) +{ + static int lastIndex = 0; + FileDialog dlg = OpenFileDialog() + .EnableAudioPreview() + .ExtensionFilter(ConstructSampleFormatFileFilter(false)) + .WorkingDirectory(path.empty() ? TrackerSettings::Instance().PathSamples.GetWorkingDir() : path.GetDirectoryWithDrive()) + .DefaultFilename(path.GetFilename()) + .FilterIndex(&lastIndex); + if(!dlg.Show(this)) + return {}; + TrackerSettings::Instance().PathSamples.SetWorkingDir(dlg.GetWorkingDirectory()); + return dlg.GetFirstFile(); +} + + +void MetronomeSettingsDlg::OnBrowseMeasure() +{ + auto newPath = BrowseForSample(TrackerSettings::Instance().metronomeSampleMeasure); + if(newPath.empty()) + return; + m_measureEdit.SetWindowText(newPath.ToCString()); + OnSampleChanged(); +} + + +void MetronomeSettingsDlg::OnBrowseBeat() +{ + auto newPath = BrowseForSample(TrackerSettings::Instance().metronomeSampleBeat); + if(newPath.empty()) + return; + m_beatEdit.SetWindowText(newPath.ToCString()); + OnSampleChanged(); +} + + +BOOL MetronomeSettingsDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +{ + auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); + UINT_PTR id = pNMHDR->idFrom; + if(pTTT->uFlags & TTF_IDISHWND) + { + // idFrom is actually the HWND of the tool + id = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(id))); + } + + CString s; + switch(id) + { + case IDC_SLIDER1: + s = (m_volumeSlider.GetPos() >= 0) ? _T("+") : _T(""); + s.AppendFormat(_T("%.2f dB"), m_volumeSlider.GetPos() * METRONOME_VOLUME_SCALE); + break; + default: + return FALSE; + } + + mpt::String::WriteCStringBuf(pTTT->szText) = s; + *pResult = 0; + + // bring the tooltip window above other popup windows ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); return TRUE; // message was handled Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h Tue Dec 31 23:37:32 2024 (r22669) @@ -218,4 +218,35 @@ DECLARE_MESSAGE_MAP(); }; + +class MetronomeSettingsDlg : public DialogBase +{ +public: + MetronomeSettingsDlg(CWnd *parent = nullptr); + +protected: + void DoDataExchange(CDataExchange *pDX) override; + BOOL OnInitDialog() override; + + 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); + + afx_msg void OnHScroll(UINT, UINT, CScrollBar *); + afx_msg void OnToggleMetronome(); + afx_msg void OnSampleChanged(); + afx_msg void OnBrowseMeasure(); + afx_msg void OnBrowseBeat(); + BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); + + DECLARE_MESSAGE_MAP(); + +protected: + CSliderCtrl m_volumeSlider; + CComboBox m_measureCombo, m_beatCombo; + CEdit m_measureEdit, m_beatEdit; + CButton m_measureButton, m_beatButton; +}; + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -291,6 +291,10 @@ , patternAlwaysDrawWholePatternOnScrollSlow(conf, UL_("Pattern Editor"), UL_("AlwaysDrawWholePatternOnScrollSlow"), false) , orderListOldDropBehaviour(conf, UL_("Pattern Editor"), UL_("OrderListOldDropBehaviour"), false) , autoHideVolumeColumnForMOD(conf, UL_("Pattern Editor"), UL_("AutoHideVolumeColumnForMOD"), false) + , metronomeEnabled(conf, UL_("Pattern Editor"), UL_("MetronomeEnabled"), false) + , metronomeVolume(conf, UL_("Pattern Editor"), UL_("MetronomeVolume"), -3.0f) + , metronomeSampleMeasure(conf, UL_("Pattern Editor"), UL_("MetronomeSampleMeasure"), GetDefaultMetronomeSample()) + , metronomeSampleBeat(conf, UL_("Pattern Editor"), UL_("MetronomeSampleBeat"), GetDefaultMetronomeSample()) // Sample Editor , m_SampleUndoBufferSize(conf, UL_("Sample Editor"), UL_("UndoBufferSize"), SampleUndoBufferSize()) , sampleEditorKeyBehaviour(conf, UL_("Sample Editor"), UL_("KeyBehaviour"), seNoteOffOnNewKey) Modified: trunk/OpenMPT/mptrack/TrackerSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/TrackerSettings.h Tue Dec 31 23:37:32 2024 (r22669) @@ -838,6 +838,10 @@ CachedSetting<bool> patternAlwaysDrawWholePatternOnScrollSlow; CachedSetting<bool> orderListOldDropBehaviour; Setting<bool> autoHideVolumeColumnForMOD; + Setting<bool> metronomeEnabled; + Setting<float> metronomeVolume; + Setting<mpt::PathString> metronomeSampleMeasure; + Setting<mpt::PathString> metronomeSampleBeat; // Sample Editor @@ -1005,6 +1009,8 @@ static mpt::PathString GetDefaultAutosavePath(); + static mpt::PathString GetDefaultMetronomeSample() { return P_("*sine"); } + protected: static std::vector<uint32> GetDefaultSampleRates(); Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -4414,6 +4414,7 @@ case kcPatternPlayRow: OnPatternStep(); return wParam; case kcPatternRecord: OnPatternRecord(); return wParam; case kcToggleOverflowPaste: PostCtrlMessage(CTRLMSG_TOGGLE_OVERFLOW_PASTE); return wParam; + case kcToggleMetronome: PostCtrlMessage(CTRLMSG_TOGGLE_METRONOME); return wParam; case kcCursorCopy: OnCursorCopy(); return wParam; case kcCursorPaste: OnCursorPaste(); return wParam; case kcChannelMute: Modified: trunk/OpenMPT/mptrack/WindowMessages.h ============================================================================== --- trunk/OpenMPT/mptrack/WindowMessages.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/WindowMessages.h Tue Dec 31 23:37:32 2024 (r22669) @@ -77,6 +77,7 @@ CTRLMSG_PREVORDER, CTRLMSG_NEXTORDER, CTRLMSG_SETRECORD, + CTRLMSG_TOGGLE_METRONOME, CTRLMSG_TOGGLE_OVERFLOW_PASTE, CTRLMSG_PAT_DUPPATTERN, CTRLMSG_PAT_UPDATE_TOOLBAR, Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/mptrack.rc Tue Dec 31 23:37:32 2024 (r22669) @@ -660,6 +660,28 @@ CONTROL "",IDC_PROGRESS1,"msctls_progress32",NOT WS_VISIBLE | WS_BORDER,6,138,144,14 END +IDD_METRONOME_SETTINGS DIALOGEX 0, 0, 279, 207 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Metronome Settings" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "&Close",IDOK,222,186,50,14 + 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 + 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 + LTEXT "Custom &Sample:",IDC_STATIC,12,98,54,8 + EDITTEXT IDC_EDIT1,72,96,134,12,ES_AUTOHSCROLL + PUSHBUTTON "&Browse...",IDC_BUTTON1,210,96,50,12 + GROUPBOX "Beat",IDC_STATIC,6,124,264,55 + COMBOBOX IDC_COMBO2,12,138,192,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Custom &Sample:",IDC_STATIC,12,158,54,8 + EDITTEXT IDC_EDIT2,72,156,134,12,ES_AUTOHSCROLL + PUSHBUTTON "&Browse...",IDC_BUTTON2,210,156,50,12 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -915,6 +937,14 @@ TOPMARGIN, 7 BOTTOMMARGIN, 151 END + + IDD_METRONOME_SETTINGS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 272 + TOPMARGIN, 7 + BOTTOMMARGIN, 200 + END END #endif // APSTUDIO_INVOKED @@ -1108,6 +1138,11 @@ 0 END +IDD_METRONOME_SETTINGS AFX_DIALOG_LAYOUT +BEGIN + 0 +END + #endif // German (Germany) resources ///////////////////////////////////////////////////////////////////////////// @@ -1484,30 +1519,30 @@ LTEXT "Song Message:",IDC_STATIC,4,2,76,8 END -IDD_CONTROL_PATTERNS DIALOGEX 0, 0, 560, 86 +IDD_CONTROL_PATTERNS DIALOGEX 0, 0, 566, 86 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | WS_TABSTOP | 0x4d,2,4,370,18 + CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | WS_TABSTOP | 0x4d,2,4,382,18 CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",0x0,6,31,11,12 - COMBOBOX IDC_COMBO_INSTRUMENT,18,31,120,137,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,144,30,33,13,0,WS_EX_STATICEDGE - RTEXT "Edit Step",IDC_STATIC,180,33,30,8,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_SPACING,216,31,28,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,236,31,11,11 - CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,252,33,57,8 - CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,312,33,55,8 - LTEXT "Pattern Name",IDC_STATIC_PATTERNNAME,384,33,48,8,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_PATTERNNAME,438,31,109,12,ES_AUTOHSCROLL - LTEXT "Sequence",IDC_STATIC_SEQUENCE_NAME,384,10,36,8 - EDITTEXT IDC_EDIT_SEQNUM,420,8,28,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_SPIN_SEQNUM,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,438,6,11,11 - EDITTEXT IDC_EDIT_SEQUENCE_NAME,450,8,97,12,ES_AUTOHSCROLL - PUSHBUTTON "<<",IDC_BUTTON2,3,51,14,15,0,WS_EX_STATICEDGE - PUSHBUTTON ">>",IDC_BUTTON1,15,51,14,15,0,WS_EX_STATICEDGE - GROUPBOX "",IDC_STATIC,3,23,369,24 - GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,378,0,174,24 - GROUPBOX "",IDC_STATIC,378,23,174,24 + COMBOBOX IDC_COMBO_INSTRUMENT,18,31,132,137,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,156,30,33,13 + RTEXT "Edit Step",IDC_STATIC,192,33,30,8,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_SPACING,228,31,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,31,11,11 + CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,264,33,57,8 + CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,324,33,55,8 + LTEXT "Pattern Name",IDC_STATIC_PATTERNNAME,396,33,48,8,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_PATTERNNAME,450,31,109,12,ES_AUTOHSCROLL + LTEXT "Sequence",IDC_STATIC_SEQUENCE_NAME,396,10,36,8 + EDITTEXT IDC_EDIT_SEQNUM,432,8,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN_SEQNUM,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,450,6,11,11 + EDITTEXT IDC_EDIT_SEQUENCE_NAME,462,8,97,12,ES_AUTOHSCROLL + PUSHBUTTON "<<",IDC_BUTTON2,3,51,14,15 + PUSHBUTTON ">>",IDC_BUTTON1,15,51,14,15 + GROUPBOX "",IDC_STATIC,3,23,381,24 + GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,390,0,174,24 + GROUPBOX "",IDC_STATIC,390,23,174,24 END IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 560, 106 @@ -2427,7 +2462,7 @@ IDD_CONTROL_PATTERNS, DIALOG BEGIN - RIGHTMARGIN, 548 + RIGHTMARGIN, 554 VERTGUIDE, 39 VERTGUIDE, 134 BOTTOMMARGIN, 76 Modified: trunk/OpenMPT/mptrack/res/originals/pattern_toolbar.pfi ============================================================================== Binary file (source and/or target). No diff available. Modified: trunk/OpenMPT/mptrack/res/pattern_toolbar.png ============================================================================== Binary file (source and/or target). No diff available. Modified: trunk/OpenMPT/mptrack/resource.h ============================================================================== --- trunk/OpenMPT/mptrack/resource.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/resource.h Tue Dec 31 23:37:32 2024 (r22669) @@ -100,6 +100,7 @@ #define IDD_MIDIPARAMCONTROL 515 #define IDD_ADDSILENCE 517 #define IDD_OPLEXPORT 518 +#define IDD_METRONOME_SETTINGS 519 #define IDD_OPL_PARAMS 520 #define IDD_CLEANUP_SONG 521 #define IDD_CHANNELSETTINGS 522 @@ -849,6 +850,7 @@ #define IDC_SPIN_ADDSILENCE 2382 #define IDC_SAMPLE_INITOPL 2383 #define IDC_RADIO_RESIZETO 2384 +#define IDC_METRONOME 2385 #define IDC_CHECK_PATRECORD 2386 #define IDC_LOAD_COLORSCHEME 2387 #define IDC_SAVE_COLORSCHEME 2388 @@ -1149,6 +1151,7 @@ #define ID_VSTMACRO_INFO 36002 #define ID_VSTINPUT_INFO 36003 #define ID_FILE_NEWMOD_PC 36004 +#define ID_METRONOME_SETTINGS 36005 #define ID_APPROX_BPM 36007 #define ID_FACTORY_MENU 36008 #define ID_PLUG_BYPASS 36009 Modified: trunk/OpenMPT/soundlib/Fastmix.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/soundlib/Fastmix.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -305,8 +305,6 @@ // Render count * number of channels samples void CSoundFile::CreateStereoMix(int count) { - mixsample_t *pOfsL, *pOfsR; - if(!count) return; @@ -315,17 +313,24 @@ if(m_MixerSettings.gnChannels > 2) StereoFill(MixRearBuffer, count, m_surroundROfsVol, m_surroundLOfsVol); - CHANNELINDEX nchmixed = 0; + // Channels that are actually mixed and not skipped (because they are paused or muted) + CHANNELINDEX numChannelsMixed = 0; for(uint32 nChn = 0; nChn < m_nMixChannels; nChn++) { - ModChannel &chn = m_PlayState.Chn[m_PlayState.ChnMix[nChn]]; + if(MixChannel(count, m_PlayState.Chn[m_PlayState.ChnMix[nChn]], m_PlayState.ChnMix[nChn], numChannelsMixed < m_MixerSettings.m_nMaxMixChannels)) + numChannelsMixed++; + } + m_nMixStat = std::max(m_nMixStat, numChannelsMixed); +} - if(!chn.pCurrentSample && !chn.nLOfs && !chn.nROfs) - continue; - pOfsR = &m_dryROfsVol; - pOfsL = &m_dryLOfsVol; +bool CSoundFile::MixChannel(int count, ModChannel &chn, CHANNELINDEX channel, bool doMix) +{ + if(chn.pCurrentSample || chn.nLOfs || chn.nROfs) + { + mixsample_t *pOfsR = &m_dryROfsVol; + mixsample_t *pOfsL = &m_dryLOfsVol; uint32 functionNdx = MixFuncTable::ResamplingModeToMixFlags(static_cast<ResamplingMode>(chn.resamplingMode)); if(chn.dwFlags[CHN_16BIT]) functionNdx |= MixFuncTable::ndx16Bit; @@ -351,14 +356,13 @@ pOfsL = &m_surroundLOfsVol; } - //Look for plugins associated with this implicit tracker channel. + // Look for plugins associated with this implicit tracker channel. #ifndef NO_PLUGINS - PLUGINDEX nMixPlugin = GetBestPlugin(chn, m_PlayState.ChnMix[nChn], PrioritiseInstrument, RespectMutes); - - if ((nMixPlugin > 0) && (nMixPlugin <= MAX_MIXPLUGINS) && m_MixPlugins[nMixPlugin - 1].pMixPlugin != nullptr) + const PLUGINDEX mixPlugin = GetBestPlugin(chn, channel, PrioritiseInstrument, RespectMutes); + if((mixPlugin > 0) && (mixPlugin <= MAX_MIXPLUGINS) && m_MixPlugins[mixPlugin - 1].pMixPlugin != nullptr) { // Render into plugin buffer instead of global buffer - SNDMIXPLUGINSTATE &mixState = m_MixPlugins[nMixPlugin - 1].pMixPlugin->m_MixState; + SNDMIXPLUGINSTATE &mixState = m_MixPlugins[mixPlugin - 1].pMixPlugin->m_MixState; if (mixState.pMixBuffer) { pbuffer = mixState.pMixBuffer; @@ -379,13 +383,13 @@ *pOfsR += chn.nROfs; *pOfsL += chn.nLOfs; chn.nROfs = chn.nLOfs = 0; - continue; + return false; } MixLoopState mixLoopState(*this, chn); //////////////////////////////////////////////////// - CHANNELINDEX naddmix = 0; + bool addToMix = false; int nsamples = count; // Keep mixing this sample until the buffer is filled. do @@ -412,14 +416,14 @@ break; } - // Should we mix this channel ? - if((nchmixed >= m_MixerSettings.m_nMaxMixChannels) // Too many channels - || (!chn.nRampLength && !(chn.leftVol | chn.rightVol))) // Channel is completely silent + // Should we mix this channel? + if(!doMix // Too many channels + || (!chn.nRampLength && !(chn.leftVol | chn.rightVol))) // Channel is completely silent { chn.position += chn.increment * nSmpCount; chn.nROfs = chn.nLOfs = 0; pbuffer += nSmpCount * 2; - naddmix = 0; + addToMix = false; } #ifdef MODPLUG_TRACKER else if(m_SamplePlayLengths != nullptr) @@ -456,7 +460,7 @@ chn.nROfs += *(pbufmax - 2); chn.nLOfs += *(pbufmax - 1); pbuffer = pbufmax; - naddmix = 1; + addToMix = true; } nsamples -= nSmpCount; @@ -525,16 +529,16 @@ // Restore sample pointer in case it got changed through loop wrap-around chn.pCurrentSample = mixLoopState.samplePointer; - nchmixed += naddmix; #ifndef NO_PLUGINS - if(naddmix && nMixPlugin > 0 && nMixPlugin <= MAX_MIXPLUGINS && m_MixPlugins[nMixPlugin - 1].pMixPlugin) + if(addToMix && mixPlugin > 0 && mixPlugin <= MAX_MIXPLUGINS && m_MixPlugins[mixPlugin - 1].pMixPlugin) { - m_MixPlugins[nMixPlugin - 1].pMixPlugin->ResetSilence(); + m_MixPlugins[mixPlugin - 1].pMixPlugin->ResetSilence(); } #endif // NO_PLUGINS + return addToMix; } - m_nMixStat = std::max(m_nMixStat, nchmixed); + return false; } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -6723,6 +6723,33 @@ } } } + + // Metronome + if(IsMetronomeEnabled() && !IsRenderingToDisc() && !m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]) + { + const ROWINDEX rpm = m_PlayState.m_nCurrentRowsPerMeasure ? m_PlayState.m_nCurrentRowsPerMeasure : DEFAULT_ROWS_PER_MEASURE; + const ROWINDEX rpb = m_PlayState.m_nCurrentRowsPerBeat ? m_PlayState.m_nCurrentRowsPerBeat : DEFAULT_ROWS_PER_BEAT; + const ModSample *sample = nullptr; + if(!m_PlayState.m_lTotalSampleCount || !(m_PlayState.m_nRow % rpm)) + sample = m_metronomeMeasure; + else if(!(m_PlayState.m_nRow % rpm % rpb)) + sample = m_metronomeBeat; + if(sample) + { + m_metronomeChn.pModSample = sample; + m_metronomeChn.pCurrentSample = sample->samplev(); + m_metronomeChn.dwFlags = (sample->uFlags & CHN_SAMPLEFLAGS) | CHN_NOREVERB; + m_metronomeChn.position.Set(0); + m_metronomeChn.increment = SamplePosition::Ratio(sample->nC5Speed, m_MixerSettings.gdwMixingFreq); + m_metronomeChn.rampLeftVol = m_metronomeChn.rampRightVol = m_metronomeChn.leftVol = m_metronomeChn.rightVol = sample->nVolume * 16; + m_metronomeChn.leftRamp = m_metronomeChn.rightRamp = 0; + m_metronomeChn.nLength = m_metronomeChn.pModSample->nLength; + m_metronomeChn.resamplingMode = m_Resampler.m_Settings.SrcMode; + } + } else + { + m_metronomeChn.pCurrentSample = nullptr; + } } #endif // MODPLUG_TRACKER Modified: trunk/OpenMPT/soundlib/Sndfile.h ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/soundlib/Sndfile.h Tue Dec 31 23:37:32 2024 (r22669) @@ -734,6 +734,20 @@ protected: void HandleRowTransitionEvents(bool nextPattern); + + const ModSample *m_metronomeMeasure = nullptr; + const ModSample *m_metronomeBeat = nullptr; + ModChannel m_metronomeChn{}; + +public: + void SetMetronomeSamples(const ModSample *measure, const ModSample *beat) + { + m_metronomeMeasure = measure; + m_metronomeBeat = beat; + m_metronomeChn.pModSample = nullptr; + m_metronomeChn.pCurrentSample = nullptr; + } + constexpr bool IsMetronomeEnabled() const noexcept { return m_metronomeMeasure || m_metronomeBeat; } #endif // MODPLUG_TRACKER public: @@ -974,6 +988,7 @@ samplecount_t ReadOneTick(); private: void CreateStereoMix(int count); + bool MixChannel(int count, ModChannel &chn, CHANNELINDEX channel, bool doMix); public: bool FadeSong(uint32 msec); private: Modified: trunk/OpenMPT/soundlib/Sndmix.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/soundlib/Sndmix.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -99,6 +99,9 @@ #ifndef NO_DSP m_BitCrush.Initialize(bReset, m_MixerSettings.gdwMixingFreq); #endif +#ifdef MODPLUG_TRACKER + m_metronomeChn.pCurrentSample = nullptr; +#endif if(m_opl) { m_opl->Initialize(m_MixerSettings.gdwMixingFreq); @@ -339,6 +342,15 @@ ProcessDSP(countChunk); } +#ifdef MODPLUG_TRACKER + // Metronome needs to be mixed last, so that it is not affected by global volume, plugins, DSP effects, etc... + // It will still be visible on VU Meters though, which is not optimal. + if(IsMetronomeEnabled()) + { + MixChannel(countChunk, m_metronomeChn, CHANNELINDEX_INVALID, true); + } +#endif // MODPLUG_TRACKER + if(m_MixerSettings.gnChannels == 4) { InterleaveFrontRear(MixSoundBuffer, MixRearBuffer, countChunk); @@ -448,8 +460,6 @@ { m_PlayState.m_nCurrentOrder = m_lockOrderStart; } -#else - MPT_UNUSED_VARIABLE(patternTransition); #endif // MODPLUG_TRACKER m_PlayState.UpdatePPQ(patternTransition); @@ -2732,7 +2742,7 @@ break; default: break; - } + } } } |
From: <sv...@op...> - 2024-12-31 22:04:57
|
Author: sagamusix Date: Tue Dec 31 23:04:45 2024 New Revision: 22668 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22668 Log: [Fix] Pattern tab: Using the Toggle Overflow Paste shortcut didn't cause any visual updates at all. [Fix] Pattern tab: Checking or unchecking Overflow Paste in one pattern editor didn't update the display in other pattern editors. Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/WindowMessages.h Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Tue Dec 31 23:04:45 2024 (r22668) @@ -180,7 +180,7 @@ m_SpinInstrument.SetPos(0); SetDlgItemInt(IDC_EDIT_SPACING, TrackerSettings::Instance().gnPatternSpacing); - CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); + CheckDlgButton(IDC_PATTERN_FOLLOWSONG, (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FOLLOWSONGOFF) ? BST_UNCHECKED : BST_CHECKED); m_SpinSequence.SetRange32(1, m_sndFile.Order.GetNumSequences()); m_SpinSequence.SetPos(m_sndFile.Order.GetCurrentSequenceIndex() + 1); @@ -188,7 +188,7 @@ m_OrderList.SetFocus(); - UpdateView(PatternHint().Names().ModType(), NULL); + UpdateView(PatternHint().Names().ModType(), nullptr); RecalcLayout(); m_initialized = true; @@ -229,7 +229,7 @@ cx += 2; if((cx > 0) && (cy > 0)) { - m_OrderList.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME); + m_OrderList.SetWindowPos(nullptr, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME); } } } @@ -279,7 +279,6 @@ if(hintType[HINT_MPTOPTIONS]) { m_ToolBar.UpdateStyle(); - m_ToolBar.SetState(ID_OVERFLOWPASTE, ((TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); } bool instrPluginsChanged = false; @@ -442,7 +441,7 @@ case CTRLMSG_FORCEREFRESH: //refresh GUI - m_OrderList.InvalidateRect(NULL, FALSE); + m_OrderList.InvalidateRect(nullptr, FALSE); break; case CTRLMSG_GETCURRENTORDER: @@ -473,12 +472,20 @@ break; case CTRLMSG_SETRECORD: - if (lParam >= 0) m_bRecord = (BOOL)(lParam); else m_bRecord = !m_bRecord; - m_ToolBar.SetState(IDC_PATTERN_RECORD, ((m_bRecord) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED); - TrackerSettings::Instance().gbPatternRecord = (m_bRecord != 0); + if(lParam >= 0) + m_bRecord = lParam != 0; + else + m_bRecord = !m_bRecord; + m_ToolBar.CheckButton(IDC_PATTERN_RECORD, m_bRecord ? TRUE : FALSE); + TrackerSettings::Instance().gbPatternRecord = m_bRecord; SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); break; + case CTRLMSG_TOGGLE_OVERFLOW_PASTE: + m_ToolBar.CheckButton(ID_OVERFLOWPASTE, m_ToolBar.IsButtonChecked(ID_OVERFLOWPASTE) ? FALSE : TRUE); + OnToggleOverflowPaste(); + break; + case CTRLMSG_PREVORDER: m_OrderList.SetCurSel(Order().GetPreviousOrderIgnoringSkips(m_OrderList.GetCurSel(true).firstOrd), true); break; @@ -487,14 +494,13 @@ m_OrderList.SetCurSel(Order().GetNextOrderIgnoringSkips(m_OrderList.GetCurSel(true).firstOrd), true); break; - //rewbs.customKeys case CTRLMSG_PAT_FOLLOWSONG: // parameters: 0 = turn off, 1 = toggle { UINT state = FALSE; if(lParam == 1) // toggle { - state = !IsDlgButtonChecked(IDC_PATTERN_FOLLOWSONG); + state = IsDlgButtonChecked(IDC_PATTERN_FOLLOWSONG) != BST_UNCHECKED; } CheckDlgButton(IDC_PATTERN_FOLLOWSONG, state); OnFollowSong(); @@ -530,6 +536,10 @@ UpdateView(SequenceHint(static_cast<SEQUENCEINDEX>(lParam)).Names(), nullptr); break; + case CTRLMSG_PAT_UPDATE_TOOLBAR: + m_ToolBar.CheckButton(ID_OVERFLOWPASTE, (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TRUE : FALSE); + break; + default: return CModControlDlg::OnModCtrlMsg(wParam, lParam); } @@ -811,8 +821,8 @@ m_OrderList.Invalidate(FALSE); SetCurrentPattern(newPat); m_modDoc.SetModified(); - m_modDoc.UpdateAllViews(NULL, PatternHint(newPat).Names(), this); - m_modDoc.UpdateAllViews(NULL, SequenceHint().Data(), this); + m_modDoc.UpdateAllViews(nullptr, PatternHint(newPat).Names(), this); + m_modDoc.UpdateAllViews(nullptr, SequenceHint().Data(), this); SwitchToView(); } } @@ -1060,9 +1070,8 @@ void CCtrlPatterns::OnPatternRecord() { - UINT nState = m_ToolBar.GetState(IDC_PATTERN_RECORD); - m_bRecord = ((nState & TBSTATE_CHECKED) != 0); - TrackerSettings::Instance().gbPatternRecord = (m_bRecord != 0); + m_bRecord = m_ToolBar.IsButtonChecked(IDC_PATTERN_RECORD) != 0; + TrackerSettings::Instance().gbPatternRecord = m_bRecord; SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); SwitchToView(); } @@ -1070,23 +1079,29 @@ void CCtrlPatterns::OnPatternVUMeters() { - UINT nState = m_ToolBar.GetState(ID_PATTERN_VUMETERS); - m_bVUMeters = ((nState & TBSTATE_CHECKED) != 0); + m_bVUMeters = m_ToolBar.IsButtonChecked(ID_PATTERN_VUMETERS) != 0; TrackerSettings::Instance().gbPatternVUMeters = (m_bVUMeters != 0); SendViewMessage(VIEWMSG_SETVUMETERS, m_bVUMeters); SwitchToView(); } -//rewbs.patPlugName + void CCtrlPatterns::OnPatternViewPlugNames() { - UINT nState = m_ToolBar.GetState(ID_VIEWPLUGNAMES); - m_bPluginNames = ((nState & TBSTATE_CHECKED) != 0); + m_bPluginNames = m_ToolBar.IsButtonChecked(ID_VIEWPLUGNAMES) != 0; TrackerSettings::Instance().gbPatternPluginNames = (m_bPluginNames != 0); SendViewMessage(VIEWMSG_SETPLUGINNAMES, m_bPluginNames); SwitchToView(); } -//end rewbs.patPlugName + + +void CCtrlPatterns::OnToggleOverflowPaste() +{ + TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; + theApp.PostMessageToAllViews(WM_MOD_CTRLMSG, CTRLMSG_PAT_UPDATE_TOOLBAR); + SwitchToView(); +} + void CCtrlPatterns::OnPatternProperties() { @@ -1189,7 +1204,7 @@ { if(m_sndFile.GetType() & (MOD_TYPE_XM | MOD_TYPE_IT | MOD_TYPE_MPT)) m_modDoc.SetModified(); - m_modDoc.UpdateAllViews(NULL, PatternHint(nPat).Names(), this); + m_modDoc.UpdateAllViews(nullptr, PatternHint(nPat).Names(), this); } } } @@ -1223,7 +1238,7 @@ { CInputHandler *ih = CMainFrame::GetInputHandler(); NMTOOLBAR *pToolBar = reinterpret_cast<NMTOOLBAR *>(pNMHDR); - ClientToScreen(&(pToolBar->rcButton)); // TrackPopupMenu uses screen coords + ClientToScreen(&(pToolBar->rcButton)); const int offset = HighDPISupport::ScalePixels(4, m_hWnd); // Compared to the main toolbar, the offset seems to be a bit wrong here...? int x = pToolBar->rcButton.left + offset, y = pToolBar->rcButton.bottom + offset; const auto visibleColumns = std::bitset<PatternCursor::numColumns>{static_cast<unsigned long>(SendViewMessage(VIEWMSG_GETDETAIL))}; @@ -1288,14 +1303,6 @@ SwitchToView(); } - -void CCtrlPatterns::OnToggleOverflowPaste() -{ - TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; - UpdateView(UpdateHint().MPTOptions()); - SwitchToView(); -} - void CCtrlPatterns::TogglePluginEditor() { Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Tue Dec 31 23:04:45 2024 (r22668) @@ -302,6 +302,18 @@ } +void CTrackApp::PostMessageToAllViews(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if(auto *pDocTmpl = GetModDocTemplate()) + { + for(auto &doc : *pDocTmpl) + { + doc->PostMessageToAllViews(uMsg, wParam, lParam); + } + } +} + + ///////////////////////////////////////////////////////////////////////////// // Command Line options Modified: trunk/OpenMPT/mptrack/Mptrack.h ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/Mptrack.h Tue Dec 31 23:04:45 2024 (r22668) @@ -219,6 +219,7 @@ CString GetFriendlyMIDIPortName(const CString &deviceName, bool isInputPort, bool addDeviceName = true); void UpdateAllViews(UpdateHint hint, CObject *pHint = nullptr); + void PostMessageToAllViews(UINT uMsg, WPARAM wParam = 0, LPARAM lParam = 0); public: inline mpt::recursive_mutex_with_lock_count &GetGlobalMutexRef() { return m_GlobalMutex; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 23:04:45 2024 (r22668) @@ -4413,6 +4413,7 @@ case kcNextOrderAtRowEnd: GotoNextOrder(OrderTransitionMode::AtRowEnd); return wParam; case kcPatternPlayRow: OnPatternStep(); return wParam; case kcPatternRecord: OnPatternRecord(); return wParam; + case kcToggleOverflowPaste: PostCtrlMessage(CTRLMSG_TOGGLE_OVERFLOW_PASTE); return wParam; case kcCursorCopy: OnCursorCopy(); return wParam; case kcCursorPaste: OnCursorPaste(); return wParam; case kcChannelMute: @@ -4755,7 +4756,6 @@ case kcDuplicatePattern: SendCtrlMessage(CTRLMSG_PAT_DUPPATTERN); return wParam; case kcSwitchToOrderList: OnSwitchToOrderList(); return wParam; - case kcToggleOverflowPaste: ToggleFlag(TrackerSettings::Instance().m_dwPatternSetup, PATTERN_OVERFLOWPASTE, _T("Overflow Paste")); return wParam; case kcToggleNoteOffRecordPC: ToggleFlag(TrackerSettings::Instance().m_dwPatternSetup, PATTERN_KBDNOTEOFF, _T("Record Note Off")); return wParam; case kcToggleNoteOffRecordMIDI: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_RECORDNOTEOFF, _T("Record MIDI Note Off")); return wParam; case kcToggleOctaveTransposeMIDI: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_TRANSPOSEKEYBOARD, _T("Apply Octave Transpose")); return wParam; Modified: trunk/OpenMPT/mptrack/WindowMessages.h ============================================================================== --- trunk/OpenMPT/mptrack/WindowMessages.h Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/WindowMessages.h Tue Dec 31 23:04:45 2024 (r22668) @@ -77,7 +77,9 @@ CTRLMSG_PREVORDER, CTRLMSG_NEXTORDER, CTRLMSG_SETRECORD, + CTRLMSG_TOGGLE_OVERFLOW_PASTE, CTRLMSG_PAT_DUPPATTERN, + CTRLMSG_PAT_UPDATE_TOOLBAR, // Sample-Specific CTRLMSG_SMP_PREVINSTRUMENT, CTRLMSG_SMP_NEXTINSTRUMENT, |
From: <sv...@op...> - 2024-12-31 21:14:30
|
Author: sagamusix Date: Tue Dec 31 22:14:16 2024 New Revision: 22667 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22667 Log: [New] Pattern tab: Added keyboard shortcuts for toggling various MIDI recording options (https://bugs.openmpt.org/view.php?id=500). [Imp] Pattern tab: Toggle shortcuts (existing and new ones) now show the new toggle status in the status bar (https://bugs.openmpt.org/view.php?id=500). Modified: trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp Tue Dec 31 16:17:05 2024 (r22666) +++ trunk/OpenMPT/mptrack/CommandSet.cpp Tue Dec 31 22:14:16 2024 (r22667) @@ -937,6 +937,12 @@ {2110, kcSetVolumeD, _T("Set volume digit D")}, {2111, kcSetVolumeE, _T("Set volume digit E")}, {2112, kcSetVolumeF, _T("Set volume digit F")}, + {2113, kcToggleOctaveTransposeMIDI, _T("Toggle Apply Octave Transpose to incoming MIDI Notes")}, + {2114, kcToggleContinueSongOnMIDINote, _T("Toggle Continue Song when MIDI Note is received")}, + {2115, kcToggleContinueSongOnMIDIPlayEvents, _T("Toggle Respond to Play / Continue / Stop Song MIDI messages")}, + {2116, kcToggleRecordMIDIVelocity, _T("Toggle Record MIDI Velocity")}, + {2117, kcToggleRecordMIDIPitchBend, _T("Toggle Record MIDI Pitch Bend")}, + {2118, kcToggleRecordMIDICCs, _T("Toggle Record MIDI CCs")}, }; // clang-format on @@ -951,7 +957,7 @@ for(int j = kcStartSampleCues; j <= kcEndSampleCues; j++) { - CString s = MPT_CFORMAT("Preview Sample Cue {}")(j - kcStartSampleCues + 1); + CString s = MPT_CFORMAT("Preview / Set Sample Cue {}")(j - kcStartSampleCues + 1); m_commands[j] = {static_cast<uint32>(1924 + j - kcStartSampleCues), s}; } static_assert(1924 + kcEndSampleCues - kcStartSampleCues < 1950); Modified: trunk/OpenMPT/mptrack/CommandSet.h ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h Tue Dec 31 16:17:05 2024 (r22666) +++ trunk/OpenMPT/mptrack/CommandSet.h Tue Dec 31 22:14:16 2024 (r22667) @@ -65,7 +65,7 @@ DECLARE_FLAGSET(KeyEventType) -enum CommandID +enum CommandID : int { kcCommandSetNumNotes = 59, // kcVPEndNotes - kcVPStartNotes @@ -341,6 +341,12 @@ kcToggleOverflowPaste, kcToggleNoteOffRecordPC, kcToggleNoteOffRecordMIDI, + kcToggleOctaveTransposeMIDI, + kcToggleContinueSongOnMIDINote, + kcToggleContinueSongOnMIDIPlayEvents, + kcToggleRecordMIDIVelocity, + kcToggleRecordMIDIPitchBend, + kcToggleRecordMIDICCs, kcToggleVisibilityInstrColumn, kcToggleVisibilityVolumeColumn, kcToggleVisibilityEffectColumn, Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 16:17:05 2024 (r22666) +++ trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 22:14:16 2024 (r22667) @@ -186,7 +186,6 @@ m_nXScroll = m_nYScroll = 0; m_nPattern = 0; m_nSpacing = 0; - m_nAccelChar = 0; PatternFont::UpdateFont(m_hWnd); UpdateSizes(); UpdateScrollSize(); @@ -1864,7 +1863,7 @@ // When trying to solo a channel that is already the only unmuted channel, // this will result in unmuting all channels, in order to satisfy user habits. -// In all other cases, soloing a channel unsoloes all and mutes all except this channel +// In all other cases, soloing a channel unsolos all and mutes all except this channel void CViewPattern::OnSoloChannel(CHANNELINDEX first, CHANNELINDEX last) { CModDoc *pModDoc = GetDocument(); @@ -4226,7 +4225,7 @@ break; case VIEWMSG_SETSPACING: - m_nSpacing = static_cast<UINT>(lParam); + m_nSpacing = static_cast<uint32>(lParam); break; case VIEWMSG_PATTERNPROPERTIES: @@ -4378,6 +4377,18 @@ } +static void ToggleFlag(CachedSetting<uint32> &flagSet, uint32 flag, const TCHAR *description) +{ + flagSet ^= flag; + CString text = description; + if(flagSet & flag) + text += _T(" is now On"); + else + text += _T(" is now Off"); + CMainFrame::GetMainFrame()->SetHelpText(text); +} + + LRESULT CViewPattern::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) { CModDoc *pModDoc = GetDocument(); @@ -4744,10 +4755,16 @@ case kcDuplicatePattern: SendCtrlMessage(CTRLMSG_PAT_DUPPATTERN); return wParam; case kcSwitchToOrderList: OnSwitchToOrderList(); return wParam; - case kcToggleOverflowPaste: TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; return wParam; - case kcToggleNoteOffRecordPC: TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_KBDNOTEOFF; return wParam; - case kcToggleNoteOffRecordMIDI: TrackerSettings::Instance().m_dwMidiSetup ^= MIDISETUP_RECORDNOTEOFF; return wParam; - + case kcToggleOverflowPaste: ToggleFlag(TrackerSettings::Instance().m_dwPatternSetup, PATTERN_OVERFLOWPASTE, _T("Overflow Paste")); return wParam; + case kcToggleNoteOffRecordPC: ToggleFlag(TrackerSettings::Instance().m_dwPatternSetup, PATTERN_KBDNOTEOFF, _T("Record Note Off")); return wParam; + case kcToggleNoteOffRecordMIDI: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_RECORDNOTEOFF, _T("Record MIDI Note Off")); return wParam; + case kcToggleOctaveTransposeMIDI: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_TRANSPOSEKEYBOARD, _T("Apply Octave Transpose")); return wParam; + case kcToggleContinueSongOnMIDINote: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_PLAYPATTERNONMIDIIN, _T("Continue Song when MIDI Note is received")); return wParam; + case kcToggleContinueSongOnMIDIPlayEvents: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_RESPONDTOPLAYCONTROLMSGS, _T("Respond to Play / Continue Song MIDI messages")); return wParam; + case kcToggleRecordMIDIVelocity: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_RECORDVELOCITY, _T("Record MIDI Velocity")); return wParam; + case kcToggleRecordMIDIPitchBend: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_MIDIMACROPITCHBEND, _T("Record MIDI Pitch Bend")); return wParam; + case kcToggleRecordMIDICCs: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_MIDIMACROCONTROL, _T("Record MIDI CCs")); return wParam; + case kcToggleVisibilityInstrColumn: UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::instrColumn)); return wParam; case kcToggleVisibilityVolumeColumn: UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::volumeColumn)); return wParam; case kcToggleVisibilityEffectColumn : UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::effectColumn)); return wParam; @@ -4871,7 +4888,7 @@ if(wParam >= kcSetSpacing0 && wParam <= kcSetSpacing9) { - SetSpacing(static_cast<int>(wParam) - kcSetSpacing0); + SetSpacing(static_cast<uint32>(wParam - kcSetSpacing0)); return wParam; } @@ -4898,7 +4915,7 @@ if(wParam >= kcSetVolumeStart && wParam <= kcSetVolumeEnd) { if(IsEditingEnabled_bmsg()) - TempEnterVol(static_cast<int>(wParam) - kcSetVolumeStart); + TempEnterVol(static_cast<CommandID>(wParam)); return wParam; } @@ -4979,7 +4996,7 @@ // Enter volume effect / number in the pattern. -void CViewPattern::TempEnterVol(int v) +void CViewPattern::TempEnterVol(CommandID cmd) { CSoundFile *pSndFile = GetSoundFile(); @@ -4989,7 +5006,8 @@ ModCommand &target = GetCursorCommand(); ModCommand m = target; // This is the command we are about to overwrite const bool isHex = TrackerSettings::Instance().patternVolColHex; - const bool isDigit = (v >= 0x00) && (v <= 0x0F); + const bool isDigit = (cmd >= kcStartVolumeDigits) && (cmd <= kcEndVolumeDigits); + const int v = static_cast<int>(cmd) - kcStartVolumeDigits; if(m.IsPcNote()) { @@ -5009,7 +5027,7 @@ volcmd = VOLCMD_VOLUME; } else { - switch(v + kcSetVolumeStart) + switch(cmd) { case kcSetVolumeVol: volcmd = VOLCMD_VOLUME; break; case kcSetVolumePan: volcmd = VOLCMD_PANNING; break; @@ -5025,6 +5043,8 @@ case kcSetVolumeITPortaUp: volcmd = VOLCMD_PORTAUP; break; case kcSetVolumeITPortaDown: volcmd = VOLCMD_PORTADOWN; break; case kcSetVolumeITOffset: volcmd = VOLCMD_OFFSET; break; + default: + break; } if(m.volcmd == VOLCMD_NONE && volcmd == m_cmdOld.volcmd) { @@ -5078,11 +5098,11 @@ } -void CViewPattern::SetSpacing(int n) +void CViewPattern::SetSpacing(uint32 n) { - if(static_cast<UINT>(n) != m_nSpacing) + if(n != m_nSpacing) { - m_nSpacing = static_cast<UINT>(n); + m_nSpacing = n; PostCtrlMessage(CTRLMSG_SETSPACING, m_nSpacing); } } @@ -5092,11 +5112,8 @@ void CViewPattern::TempEnterFX(ModCommand::COMMAND c, int v) { CSoundFile *pSndFile = GetSoundFile(); - if(pSndFile == nullptr || !IsEditingEnabled_bmsg()) - { return; - } ModCommand &target = GetCursorCommand(); ModCommand m = target; @@ -5154,7 +5171,7 @@ } -// Enter an effect param in the pattenr +// Enter an effect param in the pattern void CViewPattern::TempEnterFXparam(int v) { CSoundFile *pSndFile = GetSoundFile(); Modified: trunk/OpenMPT/mptrack/View_pat.h ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.h Tue Dec 31 16:17:05 2024 (r22666) +++ trunk/OpenMPT/mptrack/View_pat.h Tue Dec 31 22:14:16 2024 (r22667) @@ -23,6 +23,8 @@ OPENMPT_NAMESPACE_BEGIN +enum CommandID : int; + class CModDoc; class CEditCommand; class CEffectVis; @@ -118,7 +120,7 @@ CEditCommand *m_pEditWnd = nullptr; CSize m_szHeader, m_szPluginHeader, m_szCell; CRect m_oldClient; - UINT m_nMidRow, m_nSpacing, m_nAccelChar, m_nLastPlayedRow, m_nLastPlayedOrder; + uint32 m_nMidRow, m_nSpacing, m_nLastPlayedRow, m_nLastPlayedOrder; FlagSet<PatternStatus> m_Status; ROWINDEX m_nPlayRow, m_nNextPlayRow; uint32 m_nPlayTick, m_nTicksOnRow; @@ -312,7 +314,7 @@ void TempEnterIns(int val); void TempEnterOctave(int val); void TempStopOctave(int val); - void TempEnterVol(int v); + void TempEnterVol(CommandID cmd); void TempEnterFX(ModCommand::COMMAND c, int v = -1); void TempEnterFXparam(int v); void EnterAftertouch(ModCommand::NOTE note, int atValue); @@ -328,7 +330,7 @@ PATTERNINDEX GetPrevPattern() const; PATTERNINDEX GetNextPattern() const; - void SetSpacing(int n); + void SetSpacing(uint32 n); void OnClearField(const std::bitset<PatternCursor::numColumns> mask, bool step, bool ITStyle = false); void SetSelectionInstrument(const INSTRUMENTINDEX instr, bool setEmptyInstrument); |
From: <sv...@op...> - 2024-12-31 15:18:02
|
Author: sagamusix Revision: 22666 Property Name: svn:log Action: modified Property diff: --- old property value +++ new property value @@ -1,3 +1,3 @@ -Merged revision(s) 22604 from trunk/OpenMPT: +Reverted revision(s) 22604 from trunk/OpenMPT: [Mod] XMPlay input plugin: Prefer using the default output format requested by XMPlay by default. ........ |
From: <sv...@op...> - 2024-12-31 15:17:16
|
Author: sagamusix Date: Tue Dec 31 16:17:05 2024 New Revision: 22666 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22666 Log: Merged revision(s) 22604 from trunk/OpenMPT: [Mod] XMPlay input plugin: Prefer using the default output format requested by XMPlay by default. ........ Modified: trunk/OpenMPT/libopenmpt/plugin-common/libopenmpt_plugin_settings.hpp Modified: trunk/OpenMPT/libopenmpt/plugin-common/libopenmpt_plugin_settings.hpp ============================================================================== --- trunk/OpenMPT/libopenmpt/plugin-common/libopenmpt_plugin_settings.hpp Tue Dec 31 11:23:20 2024 (r22665) +++ trunk/OpenMPT/libopenmpt/plugin-common/libopenmpt_plugin_settings.hpp Tue Dec 31 16:17:05 2024 (r22666) @@ -77,10 +77,6 @@ { no_default_format = no_default_format_; player_setting_name = player_setting_name_; - if (!no_default_format) { - samplerate = 0; - channels = 0; - } } void load() { |
From: <sv...@op...> - 2024-12-31 10:23:32
|
Author: manx Date: Tue Dec 31 11:23:20 2024 New Revision: 22665 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22665 Log: Merged revision(s) 22657 from trunk/OpenMPT: [Mod] mpg123: We do not need <sys/signal.h>. ........ Modified: branches/OpenMPT-1.29/ (props changed) branches/OpenMPT-1.29/include/mpg123/ports/makefile/config.h Modified: branches/OpenMPT-1.29/include/mpg123/ports/makefile/config.h ============================================================================== --- branches/OpenMPT-1.29/include/mpg123/ports/makefile/config.h Tue Dec 31 11:22:21 2024 (r22664) +++ branches/OpenMPT-1.29/include/mpg123/ports/makefile/config.h Tue Dec 31 11:23:20 2024 (r22665) @@ -13,7 +13,6 @@ /* POSIX headers */ #define HAVE_STRINGS_H 1 -#define HAVE_SYS_SIGNAL_H 1 #define HAVE_SYS_STAT_H 1 #define HAVE_SYS_TIME_H 1 #define HAVE_SYS_TYPES_H 1 |
From: <sv...@op...> - 2024-12-31 10:22:32
|
Author: manx Date: Tue Dec 31 11:22:21 2024 New Revision: 22664 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22664 Log: Merged revision(s) 22657 from trunk/OpenMPT: [Mod] mpg123: We do not need <sys/signal.h>. ........ Modified: branches/OpenMPT-1.30/ (props changed) branches/OpenMPT-1.30/include/mpg123/ports/makefile/config.h Modified: branches/OpenMPT-1.30/include/mpg123/ports/makefile/config.h ============================================================================== --- branches/OpenMPT-1.30/include/mpg123/ports/makefile/config.h Tue Dec 31 11:21:59 2024 (r22663) +++ branches/OpenMPT-1.30/include/mpg123/ports/makefile/config.h Tue Dec 31 11:22:21 2024 (r22664) @@ -13,9 +13,6 @@ /* POSIX headers */ #define HAVE_STRINGS_H 1 -#if !defined(__DJGPP__) -#define HAVE_SYS_SIGNAL_H 1 -#endif #define HAVE_SYS_STAT_H 1 #define HAVE_SYS_TIME_H 1 #define HAVE_SYS_TYPES_H 1 |
From: <sv...@op...> - 2024-12-31 10:22:06
|
Author: manx Date: Tue Dec 31 11:21:59 2024 New Revision: 22663 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22663 Log: Merged revision(s) 22657 from trunk/OpenMPT: [Mod] mpg123: We do not need <sys/signal.h>. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/include/mpg123/ports/makefile/config.h Modified: branches/OpenMPT-1.31/include/mpg123/ports/makefile/config.h ============================================================================== --- branches/OpenMPT-1.31/include/mpg123/ports/makefile/config.h Tue Dec 31 11:21:31 2024 (r22662) +++ branches/OpenMPT-1.31/include/mpg123/ports/makefile/config.h Tue Dec 31 11:21:59 2024 (r22663) @@ -13,9 +13,6 @@ /* POSIX headers */ #define HAVE_STRINGS_H 1 -#if !defined(__DJGPP__) -#define HAVE_SYS_SIGNAL_H 1 -#endif #define HAVE_SYS_STAT_H 1 #define HAVE_SYS_TIME_H 1 #define HAVE_SYS_TYPES_H 1 |
From: <sv...@op...> - 2024-12-31 10:21:38
|
Author: manx Date: Tue Dec 31 11:21:31 2024 New Revision: 22662 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22662 Log: Merged revision(s) 22661 from branches/OpenMPT-1.29: [Var] It's 2025 now (on Kiritimati). ........ Modified: branches/OpenMPT-1.28/ (props changed) branches/OpenMPT-1.28/LICENSE branches/OpenMPT-1.28/common/version.cpp branches/OpenMPT-1.28/libopenmpt/ (props changed) branches/OpenMPT-1.28/libopenmpt/in_openmpt.cpp branches/OpenMPT-1.28/libopenmpt/libopenmpt_version.rc branches/OpenMPT-1.28/libopenmpt/xmp-openmpt.cpp branches/OpenMPT-1.28/mptrack/res/MPTRACK.RC2 branches/OpenMPT-1.28/openmpt123/openmpt123.cpp Modified: branches/OpenMPT-1.28/LICENSE ============================================================================== --- branches/OpenMPT-1.28/LICENSE Tue Dec 31 11:20:23 2024 (r22661) +++ branches/OpenMPT-1.28/LICENSE Tue Dec 31 11:21:31 2024 (r22662) @@ -1,4 +1,4 @@ -Copyright (c) 2004-2024, OpenMPT contributors +Copyright (c) 2004-2025, OpenMPT contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. Modified: branches/OpenMPT-1.28/common/version.cpp ============================================================================== --- branches/OpenMPT-1.28/common/version.cpp Tue Dec 31 11:20:23 2024 (r22661) +++ branches/OpenMPT-1.28/common/version.cpp Tue Dec 31 11:21:31 2024 (r22662) @@ -595,12 +595,12 @@ "libopenmpt (based on OpenMPT / ModPlug Tracker)\n" #endif "\n" - "Copyright \xC2\xA9 2004-2024 Contributors\n" + "Copyright \xC2\xA9 2004-2025 Contributors\n" "Copyright \xC2\xA9 1997-2003 Olivier Lapicque\n" "\n" "Contributors:\n" - "Johannes Schultz (2008-2024)\n" - "J\xC3\xB6rn Heusipp (2012-2024)\n" + "Johannes Schultz (2008-2025)\n" + "J\xC3\xB6rn Heusipp (2012-2025)\n" "Ahti Lepp\xC3\xA4nen (2005-2011)\n" "Robin Fernandes (2004-2007)\n" "Sergiy Pylypenko (2007)\n" @@ -786,7 +786,7 @@ mpt::ustring GetLicenseString() { return MPT_UTF8( - "Copyright (c) 2004-2024, OpenMPT contributors" "\n" + "Copyright (c) 2004-2025, OpenMPT contributors" "\n" "Copyright (c) 1997-2003, Olivier Lapicque" "\n" "All rights reserved." "\n" "" "\n" Modified: branches/OpenMPT-1.28/libopenmpt/in_openmpt.cpp ============================================================================== --- branches/OpenMPT-1.28/libopenmpt/in_openmpt.cpp Tue Dec 31 11:20:23 2024 (r22661) +++ branches/OpenMPT-1.28/libopenmpt/in_openmpt.cpp Tue Dec 31 11:21:31 2024 (r22662) @@ -200,7 +200,7 @@ static void about( HWND hwndParent ) { std::ostringstream about; about << SHORT_TITLE << " version " << openmpt::string::get( "library_version" ) << " " << "(built " << openmpt::string::get( "build" ) << ")" << std::endl; - about << " Copyright (c) 2013-2024 OpenMPT developers (https://lib.openmpt.org/)" << std::endl; + about << " Copyright (c) 2013-2025 OpenMPT developers (https://lib.openmpt.org/)" << std::endl; about << " OpenMPT version " << openmpt::string::get( "core_version" ) << std::endl; about << std::endl; about << openmpt::string::get( "contact" ) << std::endl; Modified: branches/OpenMPT-1.28/libopenmpt/libopenmpt_version.rc ============================================================================== --- branches/OpenMPT-1.28/libopenmpt/libopenmpt_version.rc Tue Dec 31 11:20:23 2024 (r22661) +++ branches/OpenMPT-1.28/libopenmpt/libopenmpt_version.rc Tue Dec 31 11:21:31 2024 (r22662) @@ -192,7 +192,7 @@ VALUE "FileDescription", VER_FILEDESC_STR VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", VER_FILENAME_STR - VALUE "LegalCopyright", "Copyright 2004-2024 OpenMPT contributors, Copyright 1997-2003 Olivier Lapicque" + VALUE "LegalCopyright", "Copyright 2004-2025 OpenMPT contributors, Copyright 1997-2003 Olivier Lapicque" VALUE "OriginalFilename", VER_FILENAME_STR VALUE "ProductName", "libopenmpt" VALUE "ProductVersion", VER_FILEVERSION_STR Modified: branches/OpenMPT-1.28/libopenmpt/xmp-openmpt.cpp ============================================================================== --- branches/OpenMPT-1.28/libopenmpt/xmp-openmpt.cpp Tue Dec 31 11:20:23 2024 (r22661) +++ branches/OpenMPT-1.28/libopenmpt/xmp-openmpt.cpp Tue Dec 31 11:21:31 2024 (r22662) @@ -452,7 +452,7 @@ static void WINAPI openmpt_About( HWND win ) { std::ostringstream about; about << SHORT_TITLE << " version " << openmpt::string::get( "library_version" ) << " " << "(built " << openmpt::string::get( "build" ) << ")" << std::endl; - about << " Copyright (c) 2013-2024 OpenMPT developers (https://lib.openmpt.org/)" << std::endl; + about << " Copyright (c) 2013-2025 OpenMPT developers (https://lib.openmpt.org/)" << std::endl; about << " OpenMPT version " << openmpt::string::get( "core_version" ) << std::endl; about << std::endl; about << openmpt::string::get( "contact" ) << std::endl; Modified: branches/OpenMPT-1.28/mptrack/res/MPTRACK.RC2 ============================================================================== --- branches/OpenMPT-1.28/mptrack/res/MPTRACK.RC2 Tue Dec 31 11:20:23 2024 (r22661) +++ branches/OpenMPT-1.28/mptrack/res/MPTRACK.RC2 Tue Dec 31 11:21:31 2024 (r22662) @@ -52,7 +52,7 @@ VALUE "FileDescription", "OpenMPT / ModPlug Tracker" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "ModPlug Tracker" - VALUE "LegalCopyright", "Copyright 1997-2003 Olivier Lapicque; 2004-2024 contributors." + VALUE "LegalCopyright", "Copyright 1997-2003 Olivier Lapicque; 2004-2025 contributors." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" VALUE "OriginalFilename", "mptrack.exe" VALUE "ProductName", "OpenMPT / ModPlug Tracker" Modified: branches/OpenMPT-1.28/openmpt123/openmpt123.cpp ============================================================================== --- branches/OpenMPT-1.28/openmpt123/openmpt123.cpp Tue Dec 31 11:20:23 2024 (r22661) +++ branches/OpenMPT-1.28/openmpt123/openmpt123.cpp Tue Dec 31 11:21:31 2024 (r22662) @@ -8,7 +8,7 @@ */ static const char * const license = -"Copyright (c) 2004-2024, OpenMPT contributors" "\n" +"Copyright (c) 2004-2025, OpenMPT contributors" "\n" "Copyright (c) 1997-2003, Olivier Lapicque" "\n" "All rights reserved." "\n" "" "\n" @@ -444,7 +444,7 @@ static void show_info( std::ostream & log, bool verbose ) { log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << ", libopenmpt " << openmpt::string::get( "library_version" ) << " (" << "OpenMPT " << openmpt::string::get( "core_version" ) << ")" << std::endl; - log << "Copyright (c) 2013-2024 OpenMPT developers <https://lib.openmpt.org/>" << std::endl; + log << "Copyright (c) 2013-2025 OpenMPT developers <https://lib.openmpt.org/>" << std::endl; if ( !verbose ) { log << std::endl; return; @@ -533,7 +533,7 @@ static void show_man_version( textout & log ) { log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << std::endl; log << std::endl; - log << "Copyright (c) 2013-2024 OpenMPT developers <https://lib.openmpt.org/>" << std::endl; + log << "Copyright (c) 2013-2025 OpenMPT developers <https://lib.openmpt.org/>" << std::endl; } static void show_short_version( textout & log ) { |
From: <sv...@op...> - 2024-12-31 10:20:35
|
Author: manx Date: Tue Dec 31 11:20:23 2024 New Revision: 22661 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22661 Log: [Var] It's 2025 now (on Kiritimati). Modified: branches/OpenMPT-1.29/LICENSE branches/OpenMPT-1.29/common/version.cpp branches/OpenMPT-1.29/contrib/libmodplug-0.8.8.5/LICENSE branches/OpenMPT-1.29/contrib/libmodplug-0.8.9.0/LICENSE branches/OpenMPT-1.29/libopenmpt/in_openmpt.cpp branches/OpenMPT-1.29/libopenmpt/libopenmpt_version.rc branches/OpenMPT-1.29/libopenmpt/xmp-openmpt.cpp branches/OpenMPT-1.29/mptrack/res/MPTRACK.RC2 branches/OpenMPT-1.29/openmpt123/openmpt123.cpp Modified: branches/OpenMPT-1.29/LICENSE ============================================================================== --- branches/OpenMPT-1.29/LICENSE Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/LICENSE Tue Dec 31 11:20:23 2024 (r22661) @@ -1,4 +1,4 @@ -Copyright (c) 2004-2024, OpenMPT contributors +Copyright (c) 2004-2025, OpenMPT contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. Modified: branches/OpenMPT-1.29/common/version.cpp ============================================================================== --- branches/OpenMPT-1.29/common/version.cpp Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/common/version.cpp Tue Dec 31 11:20:23 2024 (r22661) @@ -565,12 +565,12 @@ "libopenmpt (based on OpenMPT / ModPlug Tracker)\n" #endif "\n" - "Copyright \xC2\xA9 2004-2024 Contributors\n" + "Copyright \xC2\xA9 2004-2025 Contributors\n" "Copyright \xC2\xA9 1997-2003 Olivier Lapicque\n" "\n" "Contributors:\n" - "Johannes Schultz (2008-2024)\n" - "J\xC3\xB6rn Heusipp (2012-2024)\n" + "Johannes Schultz (2008-2025)\n" + "J\xC3\xB6rn Heusipp (2012-2025)\n" "Ahti Lepp\xC3\xA4nen (2005-2011)\n" "Robin Fernandes (2004-2007)\n" "Sergiy Pylypenko (2007)\n" @@ -760,7 +760,7 @@ mpt::ustring GetLicenseString() { return MPT_UTF8( - "Copyright (c) 2004-2024, OpenMPT contributors" "\n" + "Copyright (c) 2004-2025, OpenMPT contributors" "\n" "Copyright (c) 1997-2003, Olivier Lapicque" "\n" "All rights reserved." "\n" "" "\n" Modified: branches/OpenMPT-1.29/contrib/libmodplug-0.8.8.5/LICENSE ============================================================================== --- branches/OpenMPT-1.29/contrib/libmodplug-0.8.8.5/LICENSE Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/contrib/libmodplug-0.8.8.5/LICENSE Tue Dec 31 11:20:23 2024 (r22661) @@ -1,4 +1,4 @@ -Copyright (c) 2004-2024, OpenMPT contributors +Copyright (c) 2004-2025, OpenMPT contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. Modified: branches/OpenMPT-1.29/contrib/libmodplug-0.8.9.0/LICENSE ============================================================================== --- branches/OpenMPT-1.29/contrib/libmodplug-0.8.9.0/LICENSE Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/contrib/libmodplug-0.8.9.0/LICENSE Tue Dec 31 11:20:23 2024 (r22661) @@ -1,4 +1,4 @@ -Copyright (c) 2004-2024, OpenMPT contributors +Copyright (c) 2004-2025, OpenMPT contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. Modified: branches/OpenMPT-1.29/libopenmpt/in_openmpt.cpp ============================================================================== --- branches/OpenMPT-1.29/libopenmpt/in_openmpt.cpp Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/libopenmpt/in_openmpt.cpp Tue Dec 31 11:20:23 2024 (r22661) @@ -214,7 +214,7 @@ static void about( HWND hwndParent ) { std::ostringstream about; about << SHORT_TITLE << " version " << openmpt::string::get( "library_version" ) << " " << "(built " << openmpt::string::get( "build" ) << ")" << std::endl; - about << " Copyright (c) 2013-2024 OpenMPT developers (https://lib.openmpt.org/)" << std::endl; + about << " Copyright (c) 2013-2025 OpenMPT developers (https://lib.openmpt.org/)" << std::endl; about << " OpenMPT version " << openmpt::string::get( "core_version" ) << std::endl; about << std::endl; about << openmpt::string::get( "contact" ) << std::endl; Modified: branches/OpenMPT-1.29/libopenmpt/libopenmpt_version.rc ============================================================================== --- branches/OpenMPT-1.29/libopenmpt/libopenmpt_version.rc Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/libopenmpt/libopenmpt_version.rc Tue Dec 31 11:20:23 2024 (r22661) @@ -192,7 +192,7 @@ VALUE "FileDescription", VER_FILEDESC_STR VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", VER_FILENAME_STR - VALUE "LegalCopyright", "Copyright 2004-2024 OpenMPT contributors, Copyright 1997-2003 Olivier Lapicque" + VALUE "LegalCopyright", "Copyright 2004-2025 OpenMPT contributors, Copyright 1997-2003 Olivier Lapicque" VALUE "OriginalFilename", VER_FILENAME_STR VALUE "ProductName", "libopenmpt" VALUE "ProductVersion", VER_FILEVERSION_STR Modified: branches/OpenMPT-1.29/libopenmpt/xmp-openmpt.cpp ============================================================================== --- branches/OpenMPT-1.29/libopenmpt/xmp-openmpt.cpp Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/libopenmpt/xmp-openmpt.cpp Tue Dec 31 11:20:23 2024 (r22661) @@ -468,7 +468,7 @@ static void WINAPI openmpt_About( HWND win ) { std::ostringstream about; about << SHORT_TITLE << " version " << openmpt::string::get( "library_version" ) << " " << "(built " << openmpt::string::get( "build" ) << ")" << std::endl; - about << " Copyright (c) 2013-2024 OpenMPT developers (https://lib.openmpt.org/)" << std::endl; + about << " Copyright (c) 2013-2025 OpenMPT developers (https://lib.openmpt.org/)" << std::endl; about << " OpenMPT version " << openmpt::string::get( "core_version" ) << std::endl; about << std::endl; about << openmpt::string::get( "contact" ) << std::endl; Modified: branches/OpenMPT-1.29/mptrack/res/MPTRACK.RC2 ============================================================================== --- branches/OpenMPT-1.29/mptrack/res/MPTRACK.RC2 Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/mptrack/res/MPTRACK.RC2 Tue Dec 31 11:20:23 2024 (r22661) @@ -55,7 +55,7 @@ VALUE "FileDescription", "OpenMPT / ModPlug Tracker" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "ModPlug Tracker" - VALUE "LegalCopyright", "Copyright 1997-2003 Olivier Lapicque; 2004-2024 contributors." + VALUE "LegalCopyright", "Copyright 1997-2003 Olivier Lapicque; 2004-2025 contributors." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" VALUE "OriginalFilename", "OpenMPT.exe" VALUE "ProductName", "OpenMPT / ModPlug Tracker" Modified: branches/OpenMPT-1.29/openmpt123/openmpt123.cpp ============================================================================== --- branches/OpenMPT-1.29/openmpt123/openmpt123.cpp Tue Dec 31 11:14:44 2024 (r22660) +++ branches/OpenMPT-1.29/openmpt123/openmpt123.cpp Tue Dec 31 11:20:23 2024 (r22661) @@ -8,7 +8,7 @@ */ static const char * const license = -"Copyright (c) 2004-2024, OpenMPT contributors" "\n" +"Copyright (c) 2004-2025, OpenMPT contributors" "\n" "Copyright (c) 1997-2003, Olivier Lapicque" "\n" "All rights reserved." "\n" "" "\n" @@ -463,7 +463,7 @@ static void show_info( std::ostream & log, bool verbose ) { log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << ", libopenmpt " << openmpt::string::get( "library_version" ) << " (" << "OpenMPT " << openmpt::string::get( "core_version" ) << ")" << std::endl; - log << "Copyright (c) 2013-2024 OpenMPT developers <https://lib.openmpt.org/>" << std::endl; + log << "Copyright (c) 2013-2025 OpenMPT developers <https://lib.openmpt.org/>" << std::endl; if ( !verbose ) { log << std::endl; return; @@ -540,7 +540,7 @@ static void show_man_version( textout & log ) { log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << std::endl; log << std::endl; - log << "Copyright (c) 2013-2024 OpenMPT developers <https://lib.openmpt.org/>" << std::endl; + log << "Copyright (c) 2013-2025 OpenMPT developers <https://lib.openmpt.org/>" << std::endl; } static void show_short_version( textout & log ) { |
Author: manx Date: Tue Dec 31 11:14:44 2024 New Revision: 22660 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22660 Log: Merged revision(s) 22658 from trunk/OpenMPT: [Var] It's 2025 now (on Kiritimati). ........ Modified: branches/OpenMPT-1.30/ (props changed) branches/OpenMPT-1.30/LICENSE branches/OpenMPT-1.30/common/version.cpp branches/OpenMPT-1.30/contrib/libmodplug-0.8.8.5/LICENSE branches/OpenMPT-1.30/contrib/libmodplug-0.8.9.0/LICENSE branches/OpenMPT-1.30/installer/install-multi-arch.iss branches/OpenMPT-1.30/libopenmpt/ (props changed) branches/OpenMPT-1.30/libopenmpt/in_openmpt.cpp branches/OpenMPT-1.30/libopenmpt/libopenmpt_version.rc branches/OpenMPT-1.30/libopenmpt/xmp-openmpt.cpp branches/OpenMPT-1.30/mptrack/res/MPTRACK.RC2 branches/OpenMPT-1.30/openmpt123/openmpt123.cpp branches/OpenMPT-1.30/pluginBridge/PluginBridge.rc branches/OpenMPT-1.30/src/mpt/LICENSE.BSD-3-Clause.txt Modified: branches/OpenMPT-1.30/LICENSE ============================================================================== --- branches/OpenMPT-1.30/LICENSE Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/LICENSE Tue Dec 31 11:14:44 2024 (r22660) @@ -1,4 +1,4 @@ -Copyright (c) 2004-2024, OpenMPT Project Developers and Contributors +Copyright (c) 2004-2025, OpenMPT Project Developers and Contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. Modified: branches/OpenMPT-1.30/common/version.cpp ============================================================================== --- branches/OpenMPT-1.30/common/version.cpp Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/common/version.cpp Tue Dec 31 11:14:44 2024 (r22660) @@ -592,12 +592,12 @@ "libopenmpt (based on OpenMPT / Open ModPlug Tracker)\n" #endif "\n" - "Copyright \xC2\xA9 2004-2024 OpenMPT Project Developers and Contributors\n" + "Copyright \xC2\xA9 2004-2025 OpenMPT Project Developers and Contributors\n" "Copyright \xC2\xA9 1997-2003 Olivier Lapicque\n" "\n" "Developers:\n" - "Johannes Schultz (2008-2024)\n" - "J\xC3\xB6rn Heusipp (2012-2024)\n" + "Johannes Schultz (2008-2025)\n" + "J\xC3\xB6rn Heusipp (2012-2025)\n" "Ahti Lepp\xC3\xA4nen (2005-2011)\n" "Robin Fernandes (2004-2007)\n" "Sergiy Pylypenko (2007)\n" @@ -792,7 +792,7 @@ mpt::ustring GetLicenseString() { return MPT_UTF8( - "Copyright (c) 2004-2024, OpenMPT Project Developers and Contributors" "\n" + "Copyright (c) 2004-2025, OpenMPT Project Developers and Contributors" "\n" "Copyright (c) 1997-2003, Olivier Lapicque" "\n" "All rights reserved." "\n" "" "\n" Modified: branches/OpenMPT-1.30/contrib/libmodplug-0.8.8.5/LICENSE ============================================================================== --- branches/OpenMPT-1.30/contrib/libmodplug-0.8.8.5/LICENSE Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/contrib/libmodplug-0.8.8.5/LICENSE Tue Dec 31 11:14:44 2024 (r22660) @@ -1,4 +1,4 @@ -Copyright (c) 2004-2024, OpenMPT Project Developers and Contributors +Copyright (c) 2004-2025, OpenMPT Project Developers and Contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. Modified: branches/OpenMPT-1.30/contrib/libmodplug-0.8.9.0/LICENSE ============================================================================== --- branches/OpenMPT-1.30/contrib/libmodplug-0.8.9.0/LICENSE Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/contrib/libmodplug-0.8.9.0/LICENSE Tue Dec 31 11:14:44 2024 (r22660) @@ -1,4 +1,4 @@ -Copyright (c) 2004-2024, OpenMPT Project Developers and Contributors +Copyright (c) 2004-2025, OpenMPT Project Developers and Contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. Modified: branches/OpenMPT-1.30/installer/install-multi-arch.iss ============================================================================== --- branches/OpenMPT-1.30/installer/install-multi-arch.iss Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/installer/install-multi-arch.iss Tue Dec 31 11:14:44 2024 (r22660) @@ -47,7 +47,7 @@ SolidCompression=yes TimeStampsInUTC=yes UninstallDisplayIcon={app}\OpenMPT App Icon.ico -VersionInfoCopyright=Copyright © 2004-2024 OpenMPT Project Developers and Contributors, Copyright © 1997-2003 Olivier Lapicque +VersionInfoCopyright=Copyright © 2004-2025 OpenMPT Project Developers and Contributors, Copyright © 1997-2003 Olivier Lapicque VersionInfoProductTextVersion={#GetAppVersion} VersionInfoProductVersion={#GetAppVersion} VersionInfoTextVersion={#GetAppVersion} Modified: branches/OpenMPT-1.30/libopenmpt/in_openmpt.cpp ============================================================================== --- branches/OpenMPT-1.30/libopenmpt/in_openmpt.cpp Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/libopenmpt/in_openmpt.cpp Tue Dec 31 11:14:44 2024 (r22660) @@ -262,7 +262,7 @@ static void about( HWND hwndParent ) { std::ostringstream about; about << SHORT_TITLE << " version " << openmpt::string::get( "library_version" ) << " " << "(built " << openmpt::string::get( "build" ) << ")" << std::endl; - about << " Copyright (c) 2013-2024 OpenMPT Project Developers and Contributors (https://lib.openmpt.org/)" << std::endl; + about << " Copyright (c) 2013-2025 OpenMPT Project Developers and Contributors (https://lib.openmpt.org/)" << std::endl; about << " OpenMPT version " << openmpt::string::get( "core_version" ) << std::endl; about << std::endl; about << openmpt::string::get( "contact" ) << std::endl; Modified: branches/OpenMPT-1.30/libopenmpt/libopenmpt_version.rc ============================================================================== --- branches/OpenMPT-1.30/libopenmpt/libopenmpt_version.rc Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/libopenmpt/libopenmpt_version.rc Tue Dec 31 11:14:44 2024 (r22660) @@ -192,7 +192,7 @@ VALUE "FileDescription", VER_FILEDESC_STR VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", VER_FILENAME_STR - VALUE "LegalCopyright", "Copyright 2004-2024 OpenMPT Project Developers and Contributors, Copyright 1997-2003 Olivier Lapicque" + VALUE "LegalCopyright", "Copyright 2004-2025 OpenMPT Project Developers and Contributors, Copyright 1997-2003 Olivier Lapicque" VALUE "OriginalFilename", VER_FILENAME_STR VALUE "ProductName", "libopenmpt" VALUE "ProductVersion", VER_FILEVERSION_STR Modified: branches/OpenMPT-1.30/libopenmpt/xmp-openmpt.cpp ============================================================================== --- branches/OpenMPT-1.30/libopenmpt/xmp-openmpt.cpp Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/libopenmpt/xmp-openmpt.cpp Tue Dec 31 11:14:44 2024 (r22660) @@ -519,7 +519,7 @@ static void WINAPI openmpt_About( HWND win ) { std::ostringstream about; about << SHORT_TITLE << " version " << openmpt::string::get( "library_version" ) << " " << "(built " << openmpt::string::get( "build" ) << ")" << std::endl; - about << " Copyright (c) 2013-2024 OpenMPT Project Developers and Contributors (https://lib.openmpt.org/)" << std::endl; + about << " Copyright (c) 2013-2025 OpenMPT Project Developers and Contributors (https://lib.openmpt.org/)" << std::endl; about << " OpenMPT version " << openmpt::string::get( "core_version" ) << std::endl; about << std::endl; about << openmpt::string::get( "contact" ) << std::endl; Modified: branches/OpenMPT-1.30/mptrack/res/MPTRACK.RC2 ============================================================================== --- branches/OpenMPT-1.30/mptrack/res/MPTRACK.RC2 Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/mptrack/res/MPTRACK.RC2 Tue Dec 31 11:14:44 2024 (r22660) @@ -61,7 +61,7 @@ VALUE "FileDescription", VER_FILEDESCRIPTION VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "OpenMPT" - VALUE "LegalCopyright", "Copyright 2004-2024 OpenMPT Project Developers and Contributors, Copyright 1997-2003 Olivier Lapicque" + VALUE "LegalCopyright", "Copyright 2004-2025 OpenMPT Project Developers and Contributors, Copyright 1997-2003 Olivier Lapicque" VALUE "OriginalFilename", "OpenMPT.exe" VALUE "ProductName", "OpenMPT" VALUE "ProductVersion", VER_FILEVERSION_STR Modified: branches/OpenMPT-1.30/openmpt123/openmpt123.cpp ============================================================================== --- branches/OpenMPT-1.30/openmpt123/openmpt123.cpp Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/openmpt123/openmpt123.cpp Tue Dec 31 11:14:44 2024 (r22660) @@ -8,7 +8,7 @@ */ static const char * const license = -"Copyright (c) 2004-2024, OpenMPT Project Developers and Contributors" "\n" +"Copyright (c) 2004-2025, OpenMPT Project Developers and Contributors" "\n" "Copyright (c) 1997-2003, Olivier Lapicque" "\n" "All rights reserved." "\n" "" "\n" @@ -466,7 +466,7 @@ static void show_info( std::ostream & log, bool verbose ) { log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << ", libopenmpt " << openmpt::string::get( "library_version" ) << " (" << "OpenMPT " << openmpt::string::get( "core_version" ) << ")" << std::endl; - log << "Copyright (c) 2013-2024 OpenMPT Project Developers and Contributors <https://lib.openmpt.org/>" << std::endl; + log << "Copyright (c) 2013-2025 OpenMPT Project Developers and Contributors <https://lib.openmpt.org/>" << std::endl; if ( !verbose ) { log << std::endl; return; @@ -543,7 +543,7 @@ static void show_man_version( textout & log ) { log << "openmpt123" << " v" << OPENMPT123_VERSION_STRING << std::endl; log << std::endl; - log << "Copyright (c) 2013-2024 OpenMPT Project Developers and Contributors <https://lib.openmpt.org/>" << std::endl; + log << "Copyright (c) 2013-2025 OpenMPT Project Developers and Contributors <https://lib.openmpt.org/>" << std::endl; } static void show_short_version( textout & log ) { Modified: branches/OpenMPT-1.30/pluginBridge/PluginBridge.rc ============================================================================== --- branches/OpenMPT-1.30/pluginBridge/PluginBridge.rc Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/pluginBridge/PluginBridge.rc Tue Dec 31 11:14:44 2024 (r22660) @@ -80,7 +80,7 @@ VALUE "FileDescription", "OpenMPT Plugin Bridge" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "PluginBridge.exe" - VALUE "LegalCopyright", "Copyright 2013-2024 OpenMPT Project Developers and Contributors" + VALUE "LegalCopyright", "Copyright 2013-2025 OpenMPT Project Developers and Contributors" VALUE "OriginalFilename", "PluginBridge.exe" VALUE "ProductName", "OpenMPT" VALUE "ProductVersion", VER_FILEVERSION_STR Modified: branches/OpenMPT-1.30/src/mpt/LICENSE.BSD-3-Clause.txt ============================================================================== --- branches/OpenMPT-1.30/src/mpt/LICENSE.BSD-3-Clause.txt Tue Dec 31 11:10:57 2024 (r22659) +++ branches/OpenMPT-1.30/src/mpt/LICENSE.BSD-3-Clause.txt Tue Dec 31 11:14:44 2024 (r22660) @@ -1,4 +1,4 @@ -Copyright (c) 2004-2024, OpenMPT Project Developers and Contributors +Copyright (c) 2004-2025, OpenMPT Project Developers and Contributors Copyright (c) 1997-2003, Olivier Lapicque All rights reserved. |