From: <sag...@us...> - 2011-07-28 14:56:22
|
Revision: 930 http://modplug.svn.sourceforge.net/modplug/?rev=930&view=rev Author: saga-games Date: 2011-07-28 14:56:16 +0000 (Thu, 28 Jul 2011) Log Message: ----------- [Mod] Modern/Alternative tempo mode is not shown for XM/IT files anymore by default. [Fix] Mod Conversion: Sample panning is now properly reset / disabled for MOD/S3M/XM files. [Imp] Undo point is now also created when renaming a channel from the pattern view. [Ref] Small refactoring here and there Modified Paths: -------------- trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp Modified: trunk/OpenMPT/mptrack/ModConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp 2011-07-26 19:04:08 UTC (rev 929) +++ trunk/OpenMPT/mptrack/ModConvert.cpp 2011-07-28 14:56:16 UTC (rev 930) @@ -174,18 +174,18 @@ // This is used for -> MOD/XM conversion vector<vector<MODCOMMAND::PARAM> > cEffectMemory; - cEffectMemory.resize(m_SndFile.GetNumChannels()); - for(size_t i = 0; i < m_SndFile.GetNumChannels(); i++) + cEffectMemory.resize(GetNumChannels()); + for(size_t i = 0; i < GetNumChannels(); i++) { cEffectMemory[i].resize(MAX_EFFECTS, 0); } bool addBreak = false; // When converting to XM, avoid the E60 bug. - CHANNELINDEX nChannel = m_SndFile.m_nChannels - 1; + CHANNELINDEX nChannel = GetNumChannels() - 1; for (UINT len = m_SndFile.Patterns[nPat].GetNumRows() * m_SndFile.m_nChannels; len; m++, len--) { - nChannel = (nChannel + 1) % m_SndFile.m_nChannels; // 0...Channels - 1 + nChannel = (nChannel + 1) % GetNumChannels(); // 0...Channels - 1 m_SndFile.ConvertCommand(m, nOldType, nNewType); @@ -301,11 +301,10 @@ m_SndFile.Samples[nSmp].nFineTune = 0; } - // Frequency to Transpose, panning (S3M/IT/MPT to MOD/XM) + // Frequency to Transpose (S3M/IT/MPT to MOD/XM) if(oldTypeIsS3M_IT_MPT && newTypeIsMOD_XM) { CSoundFile::FrequencyToTranspose(&m_SndFile.Samples[nSmp]); - if (!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) m_SndFile.Samples[nSmp].nPan = 128; // No relative note for MOD files // TODO: Pattern notes could be transposed based on the previous relative tone? if(newTypeIsMOD && m_SndFile.Samples[nSmp].RelativeTone != 0) @@ -315,6 +314,21 @@ } } + // All XM samples have default panning + if(newTypeIsXM) + { + if(!(m_SndFile.Samples[nSmp].uFlags & CHN_PANNING)) + { + m_SndFile.Samples[nSmp].uFlags |= CHN_PANNING; + m_SndFile.Samples[nSmp].nPan = 128; + } + } + // S3M / MOD samples don't have panning. + if(newTypeIsMOD || newTypeIsS3M) + { + m_SndFile.Samples[nSmp].uFlags &= ~CHN_PANNING; + } + if(oldTypeIsXM && newTypeIsIT_MPT) { // Autovibrato settings (XM to IT, where sweep 0 means "no vibrato") @@ -394,7 +408,7 @@ } // Fix channel settings (pan/vol) - for(CHANNELINDEX nChn = 0; nChn < m_SndFile.m_nChannels; nChn++) + for(CHANNELINDEX nChn = 0; nChn < GetNumChannels(); nChn++) { if(newTypeIsMOD_XM || newTypeIsS3M) { @@ -405,7 +419,7 @@ CHANGEMODTYPE_WARNING(wChannelVolSurround); } } - if(newTypeIsXM && !oldTypeIsMOD_XM) + if(newTypeIsXM) { if(m_SndFile.ChnSettings[nChn].nPan != 128) { @@ -514,7 +528,7 @@ //rewbs.customKeys: update effect key commands CInputHandler *ih = CMainFrame::GetMainFrame()->GetInputHandler(); - if (newTypeIsMOD_XM) + if(newTypeIsMOD_XM) ih->SetXMEffects(); else ih->SetITEffects(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2011-07-26 19:04:08 UTC (rev 929) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2011-07-28 14:56:16 UTC (rev 930) @@ -156,6 +156,12 @@ return CHANNELINDEX_INVALID; } + if(m_SndFile.Patterns.Size() == 0) + { + // Nothing to do + return GetNumChannels(); + } + bool first = true; // Find highest valid pattern number for storing channel undo data with, since the pattern with the highest number will be undone first. PATTERNINDEX highestPattern = 0; @@ -645,14 +651,17 @@ bool CModDoc::RemoveSample(SAMPLEINDEX nSmp) //------------------------------------------ { - if ((nSmp) && (nSmp <= m_SndFile.m_nSamples)) + if ((nSmp) && (nSmp <= m_SndFile.GetNumSamples())) { BEGIN_CRITICAL(); m_SndFile.DestroySample(nSmp); m_SndFile.m_szNames[nSmp][0] = 0; - while ((m_SndFile.m_nSamples > 1) - && (!m_SndFile.m_szNames[m_SndFile.m_nSamples][0]) - && (!m_SndFile.Samples[m_SndFile.m_nSamples].pSample)) m_SndFile.m_nSamples--; + while ((m_SndFile.GetNumSamples() > 1) + && (!m_SndFile.m_szNames[m_SndFile.GetNumSamples()][0]) + && (!m_SndFile.Samples[m_SndFile.GetNumSamples()].pSample)) + { + m_SndFile.m_nSamples--; + } END_CRITICAL(); SetModified(); return true; @@ -664,14 +673,14 @@ bool CModDoc::RemoveInstrument(INSTRUMENTINDEX nIns) //-------------------------------------------------- { - if ((nIns) && (nIns <= m_SndFile.m_nInstruments) && (m_SndFile.Instruments[nIns])) + if ((nIns) && (nIns <= m_SndFile.GetNumInstruments()) && (m_SndFile.Instruments[nIns])) { - BOOL bIns = FALSE; + bool instrumentsLeft = false; BEGIN_CRITICAL(); m_SndFile.DestroyInstrument(nIns); if (nIns == m_SndFile.m_nInstruments) m_SndFile.m_nInstruments--; - for (UINT i=1; i<MAX_INSTRUMENTS; i++) if (m_SndFile.Instruments[i]) bIns = TRUE; - if (!bIns) m_SndFile.m_nInstruments = 0; + for (UINT i=1; i<MAX_INSTRUMENTS; i++) if (m_SndFile.Instruments[i]) instrumentsLeft = true; + if (!instrumentsLeft) m_SndFile.m_nInstruments = 0; END_CRITICAL(); SetModified(); return true; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-07-26 19:04:08 UTC (rev 929) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-07-28 14:56:16 UTC (rev 930) @@ -766,9 +766,9 @@ if (!p) return; BeginWaitCursor(); - DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16)) ? m_dwBeginSel : m_dwEndSel; - DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16)) ? m_dwEndSel : m_dwBeginSel; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->Patterns[m_nPattern].GetNumRows()); + const DWORD startSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwBeginSel : m_dwEndSel; + const DWORD endSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwEndSel : m_dwBeginSel; + pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); int finalDest = GetRowFromCursor(startSel) + (GetRowFromCursor(endSel) - GetRowFromCursor(startSel))*2; for (int row = finalDest; row > (int)GetRowFromCursor(startSel); row -= 2) @@ -816,9 +816,9 @@ if (!p) return; BeginWaitCursor(); - DWORD startSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16)) ? m_dwBeginSel : m_dwEndSel; - DWORD endSel = ((m_dwBeginSel>>16)<(m_dwEndSel>>16)) ? m_dwEndSel : m_dwBeginSel; - pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->m_nChannels, pSndFile->Patterns[m_nPattern].GetNumRows()); + const DWORD startSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwBeginSel : m_dwEndSel; + const DWORD endSel = (GetRowFromCursor(m_dwBeginSel) < GetRowFromCursor(m_dwEndSel)) ? m_dwEndSel : m_dwBeginSel; + pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, pSndFile->GetNumChannels(), pSndFile->Patterns[m_nPattern].GetNumRows()); int finalDest = GetRowFromCursor(startSel) + (GetRowFromCursor(endSel) - GetRowFromCursor(startSel))/2; @@ -5613,6 +5613,9 @@ CChannelRenameDlg dlg(this, pSndFile->ChnSettings[nChn].szName, nChn + 1); if(dlg.DoModal() != IDOK || dlg.bChanged == false) return; + // Backup old name. + pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, 0, 0, 1, 1, false, true); + strcpy(pSndFile->ChnSettings[nChn].szName, dlg.m_sName); pModDoc->SetModified(); pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); @@ -5719,7 +5722,7 @@ for (UINT r=startRow; r<endRow+1; r++) { - p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + startChan; + p = pSndFile->Patterns[m_nPattern] + r * pSndFile->GetNumChannels() + startChan; for (UINT c = startChan; c < endChan + 1; c++, p++) { // If a note or an instr is present on the row, do the change, if required. Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-07-26 19:04:08 UTC (rev 929) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-07-28 14:56:16 UTC (rev 930) @@ -95,9 +95,14 @@ UpdateChannelCBox(); + // Don't show new tempo modes for XM/IT, unless they are currently used + const bool showNewTempoModes = (m_pSndFile->GetType() == MOD_TYPE_MPT || (m_pSndFile->m_dwSongFlags & SONG_ITPROJECT) != 0); + m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Classic"), tempo_mode_classic); - m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Alternative"), tempo_mode_alternative); - m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Modern (accurate)"), tempo_mode_modern); + if(showNewTempoModes || m_pSndFile->m_nTempoMode == tempo_mode_alternative) + m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Alternative"), tempo_mode_alternative); + if(showNewTempoModes || m_pSndFile->m_nTempoMode == tempo_mode_modern) + m_TempoModeBox.SetItemData(m_TempoModeBox.AddString("Modern (accurate)"), tempo_mode_modern); m_TempoModeBox.SetCurSel(0); for(int i = m_TempoModeBox.GetCount(); i > 0; i--) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-07-28 15:00:02
|
Revision: 931 http://modplug.svn.sourceforge.net/modplug/?rev=931&view=rev Author: saga-games Date: 2011-07-28 14:59:55 +0000 (Thu, 28 Jul 2011) Log Message: ----------- [Imp] When using the channel search in the Find/Replace dialog, swapped channel numbers are now treated correctly [Imp] Find/Replace dialog limits volume column parameters better now. It's still possible to do something like "Search for volume command d, replace by volume parameter 24", though... [Ref] Macro config loading/saving has been moved to TrackerSettings [Ref] More refactoring Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/misc_util.cpp Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2011-07-28 14:56:16 UTC (rev 930) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2011-07-28 14:59:55 UTC (rev 931) @@ -17,7 +17,7 @@ #define COLHDR_HEIGHT 16 // Column header #define COLUMN_HEIGHT 13 #define VUMETERS_HEIGHT 13 // Height of vu-meters -#define PLUGNAME_HEIGHT 16 // Height of vu-meters +#define PLUGNAME_HEIGHT 16 // Height of plugin names #define VUMETERS_BMPWIDTH 32 #define VUMETERS_BMPHEIGHT 10 #define VUMETERS_MEDWIDTH 24 @@ -102,7 +102,7 @@ // Effect colour codes // Effect number => Effect colour assignment -const BYTE effectColors[] = +const int effectColors[] = { 0, 0, MODCOLOR_PITCH, MODCOLOR_PITCH, MODCOLOR_PITCH, MODCOLOR_PITCH, MODCOLOR_VOLUME, MODCOLOR_VOLUME, @@ -119,7 +119,7 @@ STATIC_ASSERT(CountOf(effectColors) == MAX_EFFECTS); // Volume effect number => Effect colour assignment -const BYTE volEffectColors[] = +const int volEffectColors[] = { 0, MODCOLOR_VOLUME, MODCOLOR_PANNING, MODCOLOR_VOLUME, MODCOLOR_VOLUME, MODCOLOR_VOLUME, MODCOLOR_VOLUME, MODCOLOR_PITCH, @@ -342,7 +342,7 @@ void CViewPattern::DrawNote(int x, int y, UINT note, CTuning* pTuning) -//--------------------------------------------------------------------------- +//-------------------------------------------------------------------- { PCPATTERNFONT pfnt = GetCurrentPatternFont(); Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2011-07-28 14:56:16 UTC (rev 930) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2011-07-28 14:59:55 UTC (rev 931) @@ -165,7 +165,7 @@ // Pattern Setup (contains also non-pattern related settings) // Feel free to replace the deprecated flags by new flags, but be sure to -// update CMainFrame::LoadIniSettings() as well. +// update TrackerSettings::LoadINISettings() / TrackerSettings::LoadRegistrySettings() as well. #define PATTERN_PLAYNEWNOTE 0x01 // play new notes while recording #define PATTERN_LARGECOMMENTS 0x02 // use large font in comments #define PATTERN_STDHIGHLIGHT 0x04 // enable primary highlight (measures) Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-07-28 14:56:16 UTC (rev 930) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-07-28 14:59:55 UTC (rev 931) @@ -849,24 +849,6 @@ // Load Midi Library if (m_szConfigFileName[0]) ImportMidiConfig(m_szConfigFileName); - // Load default macro configuration - for (UINT isfx=0; isfx<16; isfx++) - { - CHAR s[64], snam[32]; - wsprintf(snam, "SF%X", isfx); - GetPrivateProfileString("Zxx Macros", snam, m_MidiCfg.szMidiSFXExt[isfx], s, CountOf(s), m_szConfigFileName); - s[MACRO_LENGTH - 1] = 0; - memcpy(m_MidiCfg.szMidiSFXExt[isfx], s, MACRO_LENGTH); - } - for (UINT izxx=0; izxx<128; izxx++) - { - CHAR s[64], snam[32]; - wsprintf(snam, "Z%02X", izxx|0x80); - GetPrivateProfileString("Zxx Macros", snam, m_MidiCfg.szMidiZXXExt[izxx], s, CountOf(s), m_szConfigFileName); - s[MACRO_LENGTH - 1] = 0; - memcpy(m_MidiCfg.szMidiZXXExt[izxx], s, MACRO_LENGTH); - } - // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame(/*cmdInfo.m_csExtension*/); if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; @@ -972,26 +954,7 @@ gpDLSBanks[i] = NULL; } } - // Save default macro configuration - if (m_szConfigFileName[0]) - { - for (UINT isfx=0; isfx<16; isfx++) - { - CHAR s[64], snam[32]; - wsprintf(snam, "SF%X", isfx); - memcpy(s, m_MidiCfg.szMidiSFXExt[isfx], MACRO_LENGTH); - s[31] = 0; - if (!WritePrivateProfileString("Zxx Macros", snam, s, m_szConfigFileName)) break; - } - for (UINT izxx=0; izxx<128; izxx++) - { - CHAR s[64], snam[32]; - wsprintf(snam, "Z%02X", izxx|0x80); - memcpy(s, m_MidiCfg.szMidiZXXExt[izxx], MACRO_LENGTH); - s[MACRO_LENGTH - 1] = 0; - if (!WritePrivateProfileString("Zxx Macros", snam, s, m_szConfigFileName)) break; - } - } + // Uninitialize DX-Plugins UninitializeDXPlugins(); Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp =================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp 2011-07-28 14:56:16 UTC (rev 930) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp 2011-07-28 14:59:55 UTC (rev 931) @@ -260,6 +260,7 @@ } } ChangeEffect(); + ChangeVolCmd(); OnCheckChannelSearch(); return TRUE; } @@ -285,6 +286,7 @@ int newpos; if (oldcount) newpos = combo->GetCurSel() % newcount; else newpos = m_nParam % newcount; combo->ResetContent(); + combo->InitStorage(newcount, 4); for (UINT i=0; i<newcount; i++) { wsprintf(s, (newcount == 256) ? "%02X" : "%X", i); @@ -296,6 +298,43 @@ } +void CFindReplaceTab::ChangeVolCmd() +//---------------------------------- +{ + int fxndx = -1; + CComboBox *combo; + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO3)) != NULL) + { + fxndx = combo->GetItemData(combo->GetCurSel()); + } + // Update Param range + if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO4)) != NULL) && (m_pModDoc)) + { + DWORD rangeMin, rangeMax; + if(!m_pModDoc->GetVolCmdInfo(fxndx, nullptr, &rangeMin, &rangeMax)) + { + rangeMin = 0; + rangeMax = 64; + } + UINT oldcount = combo->GetCount(); + UINT newcount = rangeMax - rangeMin + 1; + if (oldcount != newcount) + { + CHAR s[16]; + int newpos; + if (oldcount) newpos = combo->GetCurSel() % newcount; else newpos = m_nParam % newcount; + combo->ResetContent(); + for (UINT i = rangeMin; i <= rangeMax; i++) + { + wsprintf(s, (rangeMax < 10) ? "%d" : "%02d", i); + combo->SetItemData(combo->AddString(s), i); + } + combo->SetCurSel(newpos); + } + } +} + + void CFindReplaceTab::OnCheckChannelSearch() //------------------------------------------ { @@ -389,7 +428,10 @@ { m_nMinChannel = GetDlgItemInt(IDC_EDIT1) - 1; m_nMaxChannel = GetDlgItemInt(IDC_EDIT2) - 1; - if (m_nMaxChannel < m_nMinChannel) m_nMaxChannel = m_nMinChannel; + if (m_nMaxChannel < m_nMinChannel) + { + std::swap(m_nMinChannel, m_nMaxChannel); + } } CPropertyPage::OnOK(); } Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.h =================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h 2011-07-28 14:56:16 UTC (rev 930) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h 2011-07-28 14:59:55 UTC (rev 931) @@ -67,6 +67,7 @@ protected: void ChangeEffect(); + void ChangeVolCmd(); public: CFindReplaceTab(UINT nIDD, bool bReplaceTab, CModDoc *pModDoc):CPropertyPage(nIDD) { m_bReplace = bReplaceTab; m_pModDoc = pModDoc; } @@ -79,7 +80,7 @@ void CheckOnChange(int nIDButton) { CheckDlgButton(nIDButton, BST_CHECKED); CheckReplace(nIDButton); }; afx_msg void OnNoteChanged() { CheckOnChange(IDC_CHECK1); }; afx_msg void OnInstrChanged() { CheckOnChange(IDC_CHECK2); }; - afx_msg void OnVolCmdChanged() { CheckOnChange(IDC_CHECK3); }; + afx_msg void OnVolCmdChanged() { CheckOnChange(IDC_CHECK3); ChangeVolCmd(); }; afx_msg void OnVolumeChanged() { CheckOnChange(IDC_CHECK4); }; afx_msg void OnEffectChanged() { CheckOnChange(IDC_CHECK5); ChangeEffect(); }; afx_msg void OnParamChanged() { CheckOnChange(IDC_CHECK6); }; Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2011-07-28 14:56:16 UTC (rev 930) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2011-07-28 14:59:55 UTC (rev 931) @@ -17,7 +17,6 @@ #include "snddev.h" #include "version.h" #include "UpdateCheck.h" -#include "Ctrl_pat.h" #include "Mpdlgs.h" #include "AutoSaver.h" #include "TrackerSettings.h" @@ -150,20 +149,20 @@ Chords[ichord].notes[0] = 0; Chords[ichord].notes[1] = 0; Chords[ichord].notes[2] = 0; - // Major Chords + if (ichord < 12) { + // Major Chords Chords[ichord].notes[0] = (BYTE)(ichord+5); Chords[ichord].notes[1] = (BYTE)(ichord+8); Chords[ichord].notes[2] = (BYTE)(ichord+11); - } else + } else if (ichord < 24) + { // Minor Chords - if (ichord < 24) - { - Chords[ichord].notes[0] = (BYTE)(ichord-8); - Chords[ichord].notes[1] = (BYTE)(ichord-4); - Chords[ichord].notes[2] = (BYTE)(ichord-1); - } + Chords[ichord].notes[0] = (BYTE)(ichord-8); + Chords[ichord].notes[1] = (BYTE)(ichord-4); + Chords[ichord].notes[2] = (BYTE)(ichord-1); + } } gnPlugWindowX = 243; @@ -178,17 +177,40 @@ void TrackerSettings::LoadSettings() //---------------------------------- { - CString storedVersion = CMainFrame::GetPrivateProfileCString("Version", "Version", "", theApp.GetConfigFileName()); + const CString iniFile = theApp.GetConfigFileName(); + + CString storedVersion = CMainFrame::GetPrivateProfileCString("Version", "Version", "", iniFile); // If version number stored in INI is 1.17.02.40 or later, always load setting from INI file. // If it isn't, try loading from Registry first, then from the INI file. if (storedVersion >= "1.17.02.40" || !LoadRegistrySettings()) { - LoadINISettings(); + LoadINISettings(iniFile); } + // The following stuff was also stored in mptrack.ini while the registry was still being used... + // Load Chords theApp.LoadChords(Chords); + // Load default macro configuration + MODMIDICFG macros; + theApp.GetDefaultMidiMacro(¯os); + for(int isfx = 0; isfx < 16; isfx++) + { + CHAR snam[8]; + wsprintf(snam, "SF%X", isfx); + GetPrivateProfileString("Zxx Macros", snam, macros.szMidiSFXExt[isfx], macros.szMidiSFXExt[isfx], CountOf(macros.szMidiSFXExt[isfx]), iniFile); + SetNullTerminator(macros.szMidiSFXExt[isfx]); + } + for(int izxx = 0; izxx < 128; izxx++) + { + CHAR snam[8]; + wsprintf(snam, "Z%02X", izxx | 0x80); + GetPrivateProfileString("Zxx Macros", snam, macros.szMidiZXXExt[izxx], macros.szMidiZXXExt[izxx], CountOf(macros.szMidiZXXExt[izxx]), iniFile); + SetNullTerminator(macros.szMidiZXXExt[izxx]); + } + theApp.SetDefaultMidiMacro(¯os); + // Default directory location for(UINT i = 0; i < NUM_DIRS; i++) { @@ -198,10 +220,9 @@ } -void TrackerSettings::LoadINISettings() -//------------------------------------- +void TrackerSettings::LoadINISettings(const CString &iniFile) +//---------------------------------------------------------- { - CString iniFile = theApp.GetConfigFileName(); //CHAR collectedString[INIBUFFERSIZE]; MptVersion::VersionNum vIniVersion; @@ -392,7 +413,7 @@ CMainFrame::m_pAutoSaver->SetPath(szPath); CMainFrame::m_pAutoSaver->SetFilenameTemplate(CMainFrame::GetPrivateProfileCString("AutoSave", "FileNameTemplate", "", iniFile)); - GetPrivateProfileString("Misc", "DefaultModType", gdefaultModType->fileExtension, szPath, INIBUFFERSIZE, iniFile); + GetPrivateProfileString("Misc", "DefaultModType", defaultModType->fileExtension, szPath, INIBUFFERSIZE, iniFile); // for(size_t i = 0; i < CountOf(ModSpecs::Collection); i++) // { // if(!strcmp(szPath, ModSpecs::Collection[i]->fileExtension)) @@ -718,7 +739,21 @@ theApp.SaveChords(Chords); - WritePrivateProfileString("Misc", "DefaultModType", gdefaultModType->fileExtension, iniFile); + // Save default macro configuration + MODMIDICFG macros; + theApp.GetDefaultMidiMacro(¯os); + for(int isfx = 0; isfx < 16; isfx++) + { + CHAR snam[8]; + wsprintf(snam, "SF%X", isfx); + WritePrivateProfileString("Zxx Macros", snam, macros.szMidiSFXExt[isfx], iniFile); + } + for(int izxx = 0; izxx < 128; izxx++) + { + CHAR snam[8]; + wsprintf(snam, "Z%02X", izxx | 0x80); + if (!WritePrivateProfileString("Zxx Macros", snam, macros.szMidiZXXExt[izxx], iniFile)) break; + } CMainFrame::GetMainFrame()->SaveBarState("Toolbars"); } Modified: trunk/OpenMPT/mptrack/TrackerSettings.h =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h 2011-07-28 14:56:16 UTC (rev 930) +++ trunk/OpenMPT/mptrack/TrackerSettings.h 2011-07-28 14:59:55 UTC (rev 931) @@ -42,7 +42,7 @@ glInstrumentWindowHeight, glCommentsWindowHeight, glGraphWindowHeight; //rewbs.varWindowSize CString gcsPreviousVersion; CString gcsInstallGUID; - CModSpecifications const *gdefaultModType; + CModSpecifications const *defaultModType; // Audio Setup DWORD m_dwSoundSetup, m_dwRate, m_dwQuality, m_nSrcMode, m_nBitsPerSample, m_nPreAmp, gbLoopSong, m_nChannels; LONG m_nWaveDevice; // use the SNDDEV_GET_NUMBER and SNDDEV_GET_TYPE macros to decode @@ -103,7 +103,7 @@ protected: - void LoadINISettings(); + void LoadINISettings(const CString &iniFile); bool LoadRegistrySettings(); void SetDirectory(const LPCTSTR szFilenameFrom, Directory dir, TCHAR (&pDirs)[NUM_DIRS][_MAX_PATH], bool bStripFilename); Modified: trunk/OpenMPT/mptrack/misc_util.cpp =================================================================== --- trunk/OpenMPT/mptrack/misc_util.cpp 2011-07-28 14:56:16 UTC (rev 930) +++ trunk/OpenMPT/mptrack/misc_util.cpp 2011-07-28 14:59:55 UTC (rev 931) @@ -31,25 +31,24 @@ } -// Returns error message corresponding to error code returned by GetLastError(). +// Returns WinAPI error message corresponding to error code returned by GetLastError(). CString GetErrorMessage(DWORD nErrorCode) //--------------------------------------- { - const size_t nBufferSize = 256; - CString sMsg; - LPTSTR pszBuf = sMsg.GetBuffer(nBufferSize); + LPVOID lpMsgBuf; - FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, nErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - pszBuf, - nBufferSize, + (LPTSTR)&lpMsgBuf, + 0, NULL ); - sMsg.ReleaseBuffer(); + CString msg = (LPTSTR)lpMsgBuf; + LocalFree(lpMsgBuf); - return sMsg; + return msg; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-07-28 22:07:21
|
Revision: 935 http://modplug.svn.sourceforge.net/modplug/?rev=935&view=rev Author: saga-games Date: 2011-07-28 22:07:15 +0000 (Thu, 28 Jul 2011) Log Message: ----------- [Imp] Templates: Edit history / Made with versions are now reset when loading a template. [New] Default mod type can now be set in mptrack.ini by setting DefaultModType in the [Misc] section (f.e. "DefaultModType=mptm") - see http://forum.openmpt.org/index.php?topic=4411.0 [Fix] All numeric input fields in the instrument editor are now scrollable. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-07-28 21:40:15 UTC (rev 934) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-07-28 22:07:15 UTC (rev 935) @@ -2169,6 +2169,7 @@ void CMainFrame::OpenMenuItemFile(const UINT nId, const bool bTemplateFile) +//------------------------------------------------------------------------- { const UINT nIdBegin = (bTemplateFile) ? ID_FILE_OPENTEMPLATE : ID_EXAMPLE_MODULES; const std::vector<CString>& vecFilePaths = (bTemplateFile) ? s_TemplateModulePaths : s_ExampleModulePaths; @@ -2188,6 +2189,9 @@ pModDoc->ClearFilePath(); // Clear path so that saving will not take place in templates/examples folder. if (bTemplateFile) { + pModDoc->GetFileHistory()->empty(); // Reset edit history for template files + pModDoc->GetSoundFile()->m_dwCreatedWithVersion = MptVersion::num; + pModDoc->GetSoundFile()->m_dwLastSavedWithVersion = 0; theApp.RemoveMruItem(0); } } Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2011-07-28 21:40:15 UTC (rev 934) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2011-07-28 22:07:15 UTC (rev 935) @@ -165,6 +165,8 @@ } } + defaultModType = MOD_TYPE_IT; + gnPlugWindowX = 243; gnPlugWindowY = 273; gnPlugWindowWidth = 370; @@ -369,6 +371,8 @@ m_nSampleUndoMaxBuffer = CMainFrame::GetPrivateProfileLong("Sample Editor" , "UndoBufferSize", m_nSampleUndoMaxBuffer >> 20, iniFile); m_nSampleUndoMaxBuffer = max(1, m_nSampleUndoMaxBuffer) << 20; + + // Default Paths TCHAR szPath[_MAX_PATH] = ""; for(size_t i = 0; i < NUM_DIRS; i++) { @@ -383,6 +387,8 @@ GetPrivateProfileString("Paths", "Key_Config_File", m_szKbdFile, m_szKbdFile, INIBUFFERSIZE, iniFile); theApp.RelativePathToAbsolute(m_szKbdFile); + + // Effects Settings CSoundFile::m_nXBassDepth = CMainFrame::GetPrivateProfileLong("Effects", "XBassDepth", CSoundFile::m_nXBassDepth, iniFile); CSoundFile::m_nXBassRange = CMainFrame::GetPrivateProfileLong("Effects", "XBassRange", CSoundFile::m_nXBassRange, iniFile); CSoundFile::m_nReverbDepth = CMainFrame::GetPrivateProfileLong("Effects", "ReverbDepth", CSoundFile::m_nReverbDepth, iniFile); @@ -390,6 +396,8 @@ CSoundFile::m_nProLogicDepth = CMainFrame::GetPrivateProfileLong("Effects", "ProLogicDepth", CSoundFile::m_nProLogicDepth, iniFile); CSoundFile::m_nProLogicDelay = CMainFrame::GetPrivateProfileLong("Effects", "ProLogicDelay", CSoundFile::m_nProLogicDelay, iniFile); + + // EQ Settings GetPrivateProfileStruct("Effects", "EQ_Settings", &m_EqSettings, sizeof(EQPRESET), iniFile); GetPrivateProfileStruct("Effects", "EQ_User1", &CEQSetupDlg::gUserPresets[0], sizeof(EQPRESET), iniFile); GetPrivateProfileStruct("Effects", "EQ_User2", &CEQSetupDlg::gUserPresets[1], sizeof(EQPRESET), iniFile); @@ -397,6 +405,7 @@ GetPrivateProfileStruct("Effects", "EQ_User4", &CEQSetupDlg::gUserPresets[3], sizeof(EQPRESET), iniFile); + // Auto saver settings CMainFrame::m_pAutoSaver = new CAutoSaver(); if(CMainFrame::GetPrivateProfileLong("AutoSave", "Enabled", true, iniFile)) { @@ -413,15 +422,14 @@ CMainFrame::m_pAutoSaver->SetPath(szPath); CMainFrame::m_pAutoSaver->SetFilenameTemplate(CMainFrame::GetPrivateProfileCString("AutoSave", "FileNameTemplate", "", iniFile)); - GetPrivateProfileString("Misc", "DefaultModType", defaultModType->fileExtension, szPath, INIBUFFERSIZE, iniFile); - // for(size_t i = 0; i < CountOf(ModSpecs::Collection); i++) - // { - // if(!strcmp(szPath, ModSpecs::Collection[i]->fileExtension)) - // { - // gdefaultModType = ModSpecs::Collection[i]; - // break; - // } - // } + + // Default mod type when using the "New" button + const MODTYPE oldDefault = defaultModType; + defaultModType = CModSpecifications::ExtensionToType(CMainFrame::GetPrivateProfileCString("Misc", "DefaultModType", CSoundFile::GetModSpecifications(defaultModType).fileExtension, iniFile)); + if(defaultModType == MOD_TYPE_NONE) + { + defaultModType = oldDefault; + } } @@ -755,6 +763,8 @@ if (!WritePrivateProfileString("Zxx Macros", snam, macros.szMidiZXXExt[izxx], iniFile)) break; } + WritePrivateProfileString("Misc", "DefaultModType", CSoundFile::GetModSpecifications(defaultModType).fileExtension, iniFile); + CMainFrame::GetMainFrame()->SaveBarState("Toolbars"); } Modified: trunk/OpenMPT/mptrack/TrackerSettings.h =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h 2011-07-28 21:40:15 UTC (rev 934) +++ trunk/OpenMPT/mptrack/TrackerSettings.h 2011-07-28 22:07:15 UTC (rev 935) @@ -43,7 +43,7 @@ glInstrumentWindowHeight, glCommentsWindowHeight, glGraphWindowHeight; //rewbs.varWindowSize CString gcsPreviousVersion; CString gcsInstallGUID; - CModSpecifications const *defaultModType; + MODTYPE defaultModType; // Audio Setup DWORD m_dwSoundSetup, m_dwRate, m_dwQuality, m_nSrcMode, m_nBitsPerSample, m_nPreAmp, gbLoopSong, m_nChannels; LONG m_nWaveDevice; // use the SNDDEV_GET_NUMBER and SNDDEV_GET_TYPE macros to decode Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-07-28 21:40:15 UTC (rev 934) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-07-28 22:07:15 UTC (rev 935) @@ -13,7 +13,7 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources +// Deutsch (Deutschland) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 @@ -707,14 +707,14 @@ CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS | WS_TABSTOP,111,8,11,11 EDITTEXT IDC_SAMPLE_NAME,131,6,151,12,ES_AUTOHSCROLL EDITTEXT IDC_SAMPLE_FILENAME,324,6,105,12,ES_AUTOHSCROLL - EDITTEXT IDC_EDIT8,84,36,37,12,ES_NUMBER + EDITTEXT IDC_EDIT8,84,36,37,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,40,8,10 EDITTEXT IDC_EDIT7,84,53,37,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,57,8,10 CONTROL "Set Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,42,72,42,10 - EDITTEXT IDC_EDIT9,84,70,37,12,ES_NUMBER + EDITTEXT IDC_EDIT9,84,70,37,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,74,8,11 - EDITTEXT IDC_EDIT15,33,99,27,13 + EDITTEXT IDC_EDIT15,33,99,27,13,ES_AUTOHSCROLL CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,61,103,7,11 COMBOBOX IDC_COMBO4,95,99,27,91,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS,47,135,36,10 @@ -736,9 +736,9 @@ COMBOBOX IDC_COMBO6,246,99,72,127,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Editor",IDC_INSVIEWPLG,321,99,37,13,0,WS_EX_STATICEDGE COMBOBOX IDC_COMBO5,321,116,37,169,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_EDIT10,321,134,37,12 + EDITTEXT IDC_EDIT10,321,134,37,12,ES_AUTOHSCROLL CONTROL "Spin1",IDC_SPIN10,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,349,135,8,11 - EDITTEXT IDC_EDIT11,321,152,37,12 + EDITTEXT IDC_EDIT11,321,152,37,12,ES_AUTOHSCROLL CONTROL "",IDC_SPIN11,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,351,153,8,11 COMBOBOX IDC_PLUGIN_VELOCITYSTYLE,367,115,83,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_PLUGIN_VOLUMESTYLE,367,148,83,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -752,7 +752,7 @@ CTEXT "MIDI Bank",IDC_STATIC,245,152,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Fade Out",IDC_STATIC,8,53,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Global Volume",IDC_STATIC,8,36,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - CTEXT "File",IDC_STATIC,289,6,36,12,SS_CENTERIMAGE,WS_EX_STATICEDGE + CTEXT "File",IDC_STATIC,289,6,35,12,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Sep",IDC_STATIC,8,99,25,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Centre",IDC_STATIC,69,99,26,13,SS_CENTERIMAGE,WS_EX_STATICEDGE GROUPBOX "Random Variation",IDC_STATIC,131,88,104,80 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2011-07-29 20:49:11
|
Revision: 938 http://modplug.svn.sourceforge.net/modplug/?rev=938&view=rev Author: relabsoluness Date: 2011-07-29 20:49:03 +0000 (Fri, 29 Jul 2011) Log Message: ----------- [Fix] MIDI: OpenMPT-made MIDI files might not open in MIDI players due to incorrect endian swap in a data field. [Fix] VST: VST host version fields didn't follow the actual version of OpenMPT (no behaviour changes expected). Modified Paths: -------------- trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/mptrack/mod2midi.h Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-07-29 12:25:18 UTC (rev 937) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-07-29 20:49:03 UTC (rev 938) @@ -2817,9 +2817,24 @@ #ifndef NO_VST char buffer[64]; - GetPrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, buffer, ARRAYELEMCOUNT(buffer), m_szConfigFileName); + GetPrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, buffer, CountOf(buffer), m_szConfigFileName); + + // Version <= 1.19.03.00 had buggy handling of custom host information. If last open was from + // such OpenMPT version, clear the related settings to get a clean start. + const CString sPreviousVer = CMainFrame::GetSettings().gcsPreviousVersion; + if (!sPreviousVer.IsEmpty() && + MptVersion::ToNum(sPreviousVer) < MAKE_VERSION_NUMERIC(1, 19, 03, 01) && + strcmp(buffer, "OpenMPT") == 0) + { + // Remove keys by calling write with nullptr. + WritePrivateProfileString(_T("VST Plugins"), _T("HostProductString"), nullptr, m_szConfigFileName); + WritePrivateProfileString(_T("VST Plugins"), _T("HostVendorString"), nullptr, m_szConfigFileName); + WritePrivateProfileString(_T("VST Plugins"), _T("HostVendorVersion"), nullptr, m_szConfigFileName); + } + + GetPrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, buffer, CountOf(buffer), m_szConfigFileName); strcpy(CVstPluginManager::s_szHostProductString, buffer); - GetPrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, buffer, ARRAYELEMCOUNT(buffer), m_szConfigFileName); + GetPrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, buffer, CountOf(buffer), m_szConfigFileName); strcpy(CVstPluginManager::s_szHostVendorString, buffer); CVstPluginManager::s_nHostVendorVersion = GetPrivateProfileInt("VST Plugins", "HostVendorVersion", CVstPluginManager::s_nHostVendorVersion, m_szConfigFileName); #endif @@ -2876,9 +2891,9 @@ WritePrivateProfileString("VST Plugins", "NumPlugins", s, m_szConfigFileName); #ifndef NO_VST - WritePrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, m_szConfigFileName); - WritePrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, m_szConfigFileName); - CMainFrame::WritePrivateProfileLong("VST Plugins", "HostVendorVersion", CVstPluginManager::s_nHostVendorVersion, m_szConfigFileName); + //WritePrivateProfileString("VST Plugins", "HostProductString", CVstPluginManager::s_szHostProductString, m_szConfigFileName); + //WritePrivateProfileString("VST Plugins", "HostVendorString", CVstPluginManager::s_szHostVendorString, m_szConfigFileName); + //CMainFrame::WritePrivateProfileLong("VST Plugins", "HostVendorVersion", CVstPluginManager::s_nHostVendorVersion, m_szConfigFileName); #endif Modified: trunk/OpenMPT/mptrack/mod2midi.cpp =================================================================== --- trunk/OpenMPT/mptrack/mod2midi.cpp 2011-07-29 12:25:18 UTC (rev 937) +++ trunk/OpenMPT/mptrack/mod2midi.cpp 2011-07-29 20:49:03 UTC (rev 938) @@ -315,7 +315,7 @@ if (nProgram > 127) return; if ((m_nCurrInstr > 0) && (m_nCurrInstr < MAX_SAMPLES)) { - m_InstrMap[m_nCurrInstr].nProgram = nProgram; + m_InstrMap[m_nCurrInstr].nProgram = static_cast<uint8>(nProgram); } } @@ -347,7 +347,7 @@ UINT nMidiChCurPrg[16]; BYTE tmp[256]; CHAR s[256]; - UINT nPPQN, nTickMultiplier, nClock, nOrder, nRow; + UINT nTickMultiplier, nClock, nOrder, nRow; UINT nSpeed; CFile f; @@ -362,7 +362,7 @@ memset(Tracks, 0, sizeof(Tracks)); if (!m_pSndFile->m_nDefaultTempo) m_pSndFile->m_nDefaultTempo = 125; nTickMultiplier = MOD2MIDI_TEMPOFACTOR; - nPPQN = (m_pSndFile->m_nDefaultTempo*nTickMultiplier) / 5; + const uint16 wPPQN = static_cast<uint16>((m_pSndFile->m_nDefaultTempo*nTickMultiplier) / 5); rmid.id_RIFF = IFFID_RIFF; rmid.filelen = sizeof(rmid)+sizeof(mthd)-8; rmid.id_RMID = 0x44494D52; // "RMID" @@ -371,9 +371,9 @@ mthd.id = 0x6468544d; // "MThd" mthd.len = BigEndian(sizeof(mthd)-8); mthd.wFmt = BigEndianW(1); - mthd.wTrks = chnCount; // 1 track/channel + mthd.wTrks = static_cast<uint16>(chnCount); // 1 track/channel mthd.wTrks = BigEndianW(mthd.wTrks); //Convert to big endian value. - mthd.wDivision = BigEndianW(nPPQN); + mthd.wDivision = BigEndianW(wPPQN); if (m_bRmi) f.Write(&rmid, sizeof(rmid)); f.Write(&mthd, sizeof(mthd)); @@ -431,10 +431,12 @@ nRow = 0; continue; } + PatternRow patternRow = m_pSndFile->Patterns[nPat].GetRow(nRow); for (UINT nChn=0; nChn<chnCount; nChn++) { PDYNMIDITRACK pTrk = &Tracks[nChn]; - MODCOMMAND *m = m_pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + //MODCOMMAND *m = m_pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + const MODCOMMAND *m = &patternRow[nChn]; UINT delta_time = nClock - pTrk->nLastEventClock; UINT len = 0; @@ -454,8 +456,8 @@ pTrk->nInstrument = nIns; if ((nMidiCh != 9) && (nProgram != nMidiChCurPrg[nMidiCh])) { - tmp[len] = 0xC0|nMidiCh; - tmp[len+1] = nProgram; + tmp[len] = static_cast<BYTE>(0xC0|nMidiCh); + tmp[len+1] = static_cast<BYTE>(nProgram); tmp[len+2] = 0; len += 3; } @@ -469,7 +471,7 @@ if (pTrk->NoteOn[i]) { tmp[len] = 0x90|(pTrk->NoteOn[i]-1); - tmp[len+1] = i; + tmp[len+1] = static_cast<BYTE>(i); tmp[len+2] = 0; tmp[len+3] = 0; len += 4; @@ -478,9 +480,9 @@ } if (m->note <= NOTE_MAX) { - pTrk->NoteOn[note] = pTrk->nMidiChannel+1; - tmp[len] = 0x90|pTrk->nMidiChannel; - tmp[len+1] = (pTrk->nMidiChannel==9) ? pTrk->nMidiProgram : note; + pTrk->NoteOn[note] = static_cast<BYTE>(pTrk->nMidiChannel+1); + tmp[len] = static_cast<BYTE>(0x90|pTrk->nMidiChannel); + tmp[len+1] = (pTrk->nMidiChannel==9) ? static_cast<BYTE>(pTrk->nMidiProgram) : static_cast<BYTE>(note); UINT vol = 0x7f; UINT nsmp = pTrk->nInstrument; if (m_pSndFile->m_nInstruments) Modified: trunk/OpenMPT/mptrack/mod2midi.h =================================================================== --- trunk/OpenMPT/mptrack/mod2midi.h 2011-07-29 12:25:18 UTC (rev 937) +++ trunk/OpenMPT/mptrack/mod2midi.h 2011-07-29 20:49:03 UTC (rev 938) @@ -4,7 +4,7 @@ typedef struct _MOD2MIDIINSTR { UINT nChannel; - UINT nProgram; + uint8 nProgram; } MOD2MIDIINSTR, *PMOD2MIDIINSTR; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-07-31 13:13:30
|
Revision: 950 http://modplug.svn.sourceforge.net/modplug/?rev=950&view=rev Author: saga-games Date: 2011-07-31 13:13:23 +0000 (Sun, 31 Jul 2011) Log Message: ----------- [Fix] Pattern interpolation broke in revision 944 [Mod] OpenMPT: Version is now 1.20.00.01 Revision Links: -------------- http://modplug.svn.sourceforge.net/modplug/?rev=944&view=rev Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-07-31 12:02:15 UTC (rev 949) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-07-31 13:13:23 UTC (rev 950) @@ -617,7 +617,7 @@ } -BOOL CViewPattern::PrepareUndo(DWORD dwBegin, DWORD dwEnd) +bool CViewPattern::PrepareUndo(DWORD dwBegin, DWORD dwEnd) //-------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); @@ -627,9 +627,8 @@ nRowBeg = GetRowFromCursor(dwBegin); nChnEnd = GetChanFromCursor(dwEnd); nRowEnd = GetRowFromCursor(dwEnd); - if( (nChnEnd < nChnBeg) || (nRowEnd < nRowBeg) ) return FALSE; - if (pModDoc) return pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, nChnBeg, nRowBeg, nChnEnd-nChnBeg+1, nRowEnd-nRowBeg+1); - return FALSE; + if((nChnEnd < nChnBeg) || (nRowEnd < nRowBeg) || pModDoc == nullptr) return false; + return pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, nChnBeg, nRowBeg, nChnEnd-nChnBeg+1, nRowEnd-nRowBeg+1); } @@ -2388,9 +2387,7 @@ bool doPCinterpolation = false; - int vsrc, vdest, vcmd = 0, verr = 0; - ASSERT(row1 >= row0); - UINT distance = row1 - row0; + int vsrc, vdest, vcmd = 0, verr = 0, distance = row1 - row0; const MODCOMMAND srcCmd = *pSndFile->Patterns[m_nPattern].GetpModCommand(row0, nchn); const MODCOMMAND destCmd = *pSndFile->Patterns[m_nPattern].GetpModCommand(row1, nchn); @@ -2404,7 +2401,7 @@ vsrc = srcCmd.note; vdest = destCmd.note; vcmd = srcCmd.instr; - verr = (distance * 59) / NOTE_MAX; + verr = (distance * (NOTE_MAX - 1)) / NOTE_MAX; break; case VOL_COLUMN: vsrc = srcCmd.vol; @@ -2459,19 +2456,23 @@ MODCOMMAND* pcmd = pSndFile->Patterns[m_nPattern].GetpModCommand(row0, nchn); - for (UINT i=0; i<=distance; i++, pcmd += pSndFile->m_nChannels) { + for (int i = 0; i <= distance; i++, pcmd += pSndFile->GetNumChannels()) + { - switch(type) { + switch(type) + { case NOTE_COLUMN: - if ((!pcmd->note) || (pcmd->instr == vcmd)) { - int note = vsrc + ((vdest - vsrc) * (int)i + verr) / distance; + if ((!pcmd->note) || (pcmd->instr == vcmd)) + { + int note = vsrc + ((vdest - vsrc) * i + verr) / distance; pcmd->note = (BYTE)note; pcmd->instr = vcmd; } break; case VOL_COLUMN: - if ((!pcmd->volcmd) || (pcmd->volcmd == vcmd)) { - int vol = vsrc + ((vdest - vsrc) * (int)i + verr) / distance; + if ((!pcmd->volcmd) || (pcmd->volcmd == vcmd)) + { + int vol = vsrc + ((vdest - vsrc) * i + verr) / distance; pcmd->vol = (BYTE)vol; pcmd->volcmd = vcmd; } @@ -2480,7 +2481,7 @@ if(doPCinterpolation) { // With PC/PCs notes, copy PCs note and plug index to all rows where // effect interpolation is done if no PC note with non-zero instrument is there. - const uint16 val = static_cast<uint16>(vsrc + ((vdest - vsrc) * (int)i + verr) / distance); + const uint16 val = static_cast<uint16>(vsrc + ((vdest - vsrc) * i + verr) / distance); if (pcmd->IsPcNote() == false || pcmd->instr == 0) { pcmd->note = PCnote; @@ -2493,7 +2494,7 @@ { if ((!pcmd->command) || (pcmd->command == vcmd)) { - int val = vsrc + ((vdest - vsrc) * (int)i + verr) / distance; + int val = vsrc + ((vdest - vsrc) * i + verr) / distance; pcmd->param = (BYTE)val; pcmd->command = vcmd; } @@ -2508,7 +2509,8 @@ } //end for all channels where type is selected - if (changed) { + if (changed) + { pModDoc->SetModified(); InvalidatePattern(FALSE); } @@ -2870,8 +2872,6 @@ if (pSndFile->Patterns[m_nPattern]) { - MODCOMMAND *p = pSndFile->Patterns[m_nPattern]; - CHANNELINDEX firstChannel = GetSelectionStartChan(), lastChannel = GetSelectionEndChan(); ROWINDEX firstRow = GetSelectionStartRow(), lastRow = GetSelectionEndRow(); firstChannel = CLAMP(firstChannel, 0, pSndFile->GetNumChannels() - 1); @@ -2906,7 +2906,7 @@ for (ROWINDEX nRow = firstRow; nRow <= lastRow; nRow++) { - MODCOMMAND *m = p + nRow * pSndFile->m_nChannels + firstChannel; + MODCOMMAND *m = pSndFile->Patterns[m_nPattern].GetpModCommand(nRow, firstChannel); for (CHANNELINDEX nChn = firstChannel; nChn <= lastChannel; nChn++, m++) { if ((m->command == CMD_VOLUME) && (m->param <= 64)) @@ -2922,9 +2922,9 @@ if ((m->note) && (m->note <= NOTE_MAX) && (m->instr)) { UINT nSmp = m->instr; - if (pSndFile->m_nInstruments) + if (pSndFile->GetNumInstruments()) { - if ((nSmp <= pSndFile->m_nInstruments) && (pSndFile->Instruments[nSmp])) + if ((nSmp <= pSndFile->GetNumInstruments()) && (pSndFile->Instruments[nSmp])) { nSmp = pSndFile->Instruments[nSmp]->Keyboard[m->note]; if(!nSmp) chvol[nChn] = 64; // hack for instruments without samples @@ -2933,7 +2933,7 @@ nSmp = 0; } } - if ((nSmp) && (nSmp <= pSndFile->m_nSamples)) + if ((nSmp) && (nSmp <= pSndFile->GetNumSamples())) { chvol[nChn] = (BYTE)(pSndFile->Samples[nSmp].nVolume >> 2); break; @@ -2958,7 +2958,7 @@ for (ROWINDEX nRow = firstRow; nRow <= lastRow; nRow++) { - MODCOMMAND *m = p + nRow * pSndFile->m_nChannels + firstChannel; + MODCOMMAND *m = pSndFile->Patterns[m_nPattern].GetpModCommand(nRow, firstChannel); const int cy = lastRow - firstRow + 1; // total rows (for fading) for (CHANNELINDEX nChn = firstChannel; nChn <= lastChannel; nChn++, m++) { Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2011-07-31 12:02:15 UTC (rev 949) +++ trunk/OpenMPT/mptrack/View_pat.h 2011-07-31 13:13:23 UTC (rev 950) @@ -196,7 +196,7 @@ void SelectBeatOrMeasure(bool selectBeat); BOOL TransposeSelection(int transp); - BOOL PrepareUndo(DWORD dwBegin, DWORD dwEnd); + bool PrepareUndo(DWORD dwBegin, DWORD dwEnd); void DeleteRows(UINT colmin, UINT colmax, UINT nrows); void OnDropSelection(); void ProcessChar(UINT nChar, UINT nFlags); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-07-31 12:02:15 UTC (rev 949) +++ trunk/OpenMPT/mptrack/version.h 2011-07-31 13:13:23 UTC (rev 950) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 00 +#define VER_MINORMINOR 01 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-07-31 23:32:16
|
Revision: 951 http://modplug.svn.sourceforge.net/modplug/?rev=951&view=rev Author: saga-games Date: 2011-07-31 23:32:09 +0000 (Sun, 31 Jul 2011) Log Message: ----------- [Fix] Revision 948 broke some functions because of broken resource indices. Revision Links: -------------- http://modplug.svn.sourceforge.net/modplug/?rev=948&view=rev Modified Paths: -------------- trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-07-31 13:13:23 UTC (rev 950) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-07-31 23:32:09 UTC (rev 951) @@ -2810,9 +2810,9 @@ END POPUP "&Info" BEGIN - MENUITEM "I&nputs", ID_INFO_INPUTS36015 + MENUITEM "I&nputs", ID_INFO_INPUTS MENUITEM "Ou&tputs", ID_INFO_OUPUTS - MENUITEM "&Macros", ID_INFO_MACROS36017 + MENUITEM "&Macros", ID_INFO_MACROS END POPUP "&Options" BEGIN Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2011-07-31 13:13:23 UTC (rev 950) +++ trunk/OpenMPT/mptrack/resource.h 2011-07-31 23:32:09 UTC (rev 951) @@ -1106,10 +1106,7 @@ #define ID_INFO_INPUTS 36011 #define ID_INFO_OUTPUTS 36012 #define ID_INFO_MACROS 36013 -#define ID_INFO36014 36014 -#define ID_INFO_INPUTS36015 36015 #define ID_INFO_OUPUTS 36016 -#define ID_INFO_MACROS36017 36017 #define ID_EDIT_GOTO 36018 #define ID_VIEW_GRAPH 36019 #define ID_PATTERN_TRANSITIONMUTE 36020 @@ -1164,37 +1161,37 @@ #define ID_CLEANUP_REARRANGESAMPLES 40223 #define ID_ORDERLIST_RENDER 40224 #define ID_EDIT_CLEANUP 40225 -#define ID_ORDERLIST_EDIT_COPY 40231 -#define ID_ORDERLIST_EDIT_CUT 40232 -#define ID_ORDERLIST_EDIT_PASTE 40233 -#define ID_CHANNEL_RENAME 40234 -#define ID_EDIT_PASTEFLOOD 40235 -#define ID_MODTREE_DUPLICATE 40236 -#define ID_MODTREE_INSERT 40237 -#define ID_MODTREE_SWITCHTO 40238 -#define ID_EDIT_PUSHFORWARDPASTE 40239 -#define ID_EDIT_SPLITKEYBOARDSETTINGS 40240 -#define ID_EDIT_PASTESPECIAL 40241 +#define ID_ORDERLIST_EDIT_COPY 40226 +#define ID_ORDERLIST_EDIT_CUT 40227 +#define ID_ORDERLIST_EDIT_PASTE 40228 +#define ID_CHANNEL_RENAME 40229 +#define ID_EDIT_PASTEFLOOD 40230 +#define ID_MODTREE_DUPLICATE 40231 +#define ID_MODTREE_INSERT 40232 +#define ID_MODTREE_SWITCHTO 40233 +#define ID_EDIT_PUSHFORWARDPASTE 40234 +#define ID_EDIT_SPLITKEYBOARDSETTINGS 40235 +#define ID_EDIT_PASTESPECIAL 40236 #define ID_CHANGE_PCNOTE_PARAM 40242 -#define ID_MODTREE_CLOSE 40243 -#define ID_SAMPLE_GENERATOR_MENU 40244 -#define ID_SAMPLE_GENERATOR_PRESET_MENU 40344 -#define ID_SAMPLE_GENERATE 40445 -#define ID_NOTEMAP_TRANS_UP 40446 -#define ID_NOTEMAP_TRANS_DOWN 40447 -#define ID_PATTERN_EDIT_PCNOTE_PLUGIN 40448 -#define ID_ENVELOPE_ZOOM_IN 40449 -#define ID_ENVELOPE_ZOOM_OUT 40450 -#define ID_PANIC 40451 -#define ID_VIEW_EDITHISTORY 40452 -#define ID_SAMPLE_GRID 40453 -#define ID_SAMPLE_QUICKFADE 40454 -#define ID_EDIT_MIXPASTE_ITSTYLE 40455 -#define ID_VIEW_MPTHACKS 40456 -#define ID_PLUGINTOINSTRUMENT 40457 -#define ID_INTERNETUPDATE 40458 -#define ID_HELP_EXAMPLEMODULES 40459 -#define ID_FILE_SAVEASTEMPLATE 40460 +#define ID_MODTREE_CLOSE 41243 +#define ID_SAMPLE_GENERATOR_MENU 41244 +#define ID_SAMPLE_GENERATOR_PRESET_MENU 41344 +#define ID_SAMPLE_GENERATE 41445 +#define ID_NOTEMAP_TRANS_UP 41446 +#define ID_NOTEMAP_TRANS_DOWN 41447 +#define ID_PATTERN_EDIT_PCNOTE_PLUGIN 41448 +#define ID_ENVELOPE_ZOOM_IN 41449 +#define ID_ENVELOPE_ZOOM_OUT 41450 +#define ID_PANIC 41451 +#define ID_VIEW_EDITHISTORY 41452 +#define ID_SAMPLE_GRID 41453 +#define ID_SAMPLE_QUICKFADE 41454 +#define ID_EDIT_MIXPASTE_ITSTYLE 41455 +#define ID_VIEW_MPTHACKS 41456 +#define ID_PLUGINTOINSTRUMENT 41457 +#define ID_INTERNETUPDATE 41458 +#define ID_HELP_EXAMPLEMODULES 41459 +#define ID_FILE_SAVEASTEMPLATE 41460 // Next default values for new objects // This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-01 16:17:27
|
Revision: 952 http://modplug.svn.sourceforge.net/modplug/?rev=952&view=rev Author: saga-games Date: 2011-08-01 16:17:20 +0000 (Mon, 01 Aug 2011) Log Message: ----------- [Ref] Pattern cursor refactoring. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-07-31 23:32:09 UTC (rev 951) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-08-01 16:17:20 UTC (rev 952) @@ -3018,7 +3018,7 @@ if (vol > 64) vol = 64; m->vol = (BYTE)vol; } - if ((((nChn << 3) | 3u) >= (m_dwBeginSel & 0xFFFF)) && (((nChn << 3) | 3u) <= (m_dwEndSel & 0xFFFF))) + if ((CreateCursor(0, nChn, EFFECT_COLUMN) >= (m_dwBeginSel & 0xFFFF)) && (CreateCursor(0, nChn, EFFECT_COLUMN) <= (m_dwEndSel & 0xFFFF))) { if ((m->command == CMD_VOLUME) && (m->param <= 64)) { @@ -3697,23 +3697,23 @@ case kcNavigateLeftSelect: case kcNavigateLeft: if ((CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_WRAP) && (!m_dwCursor)) - SetCurrentColumn((((pSndFile->GetNumChannels() - 1) << 3) | 4)); + SetCurrentColumn(CreateCursor(0, pSndFile->GetNumChannels() - 1, LAST_COLUMN)); else SetCurrentColumn(m_dwCursor - 1); return wParam; case kcNavigateRightSelect: - case kcNavigateRight: if ((CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_WRAP) && (m_dwCursor >= (((pSndFile->m_nChannels-1) << 3u) | 4u))) + case kcNavigateRight: if ((CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_WRAP) && (m_dwCursor >= CreateCursor(0, pSndFile->GetNumChannels() - 1, LAST_COLUMN))) SetCurrentColumn(0); else SetCurrentColumn(m_dwCursor + 1); return wParam; case kcNavigateNextChanSelect: - case kcNavigateNextChan: SetCurrentColumn((((GetChanFromCursor(m_dwCursor) + 1) % pSndFile->m_nChannels) << 3) | GetColTypeFromCursor(m_dwCursor)); return wParam; + case kcNavigateNextChan: SetCurrentColumn(CreateCursor(0, (GetChanFromCursor(m_dwCursor) + 1) % pSndFile->GetNumChannels(), GetColTypeFromCursor(m_dwCursor))); return wParam; case kcNavigatePrevChanSelect: case kcNavigatePrevChan:{if(GetChanFromCursor(m_dwCursor) > 0) - SetCurrentColumn((((GetChanFromCursor(m_dwCursor) - 1) % pSndFile->m_nChannels) << 3) | GetColTypeFromCursor(m_dwCursor)); + SetCurrentColumn(CreateCursor(0, (GetChanFromCursor(m_dwCursor) - 1) % pSndFile->GetNumChannels(), GetColTypeFromCursor(m_dwCursor))); else - SetCurrentColumn(GetColTypeFromCursor(m_dwCursor) | ((pSndFile->m_nChannels-1) << 3)); + SetCurrentColumn(CreateCursor(0, (pSndFile->GetNumChannels() - 1), GetColTypeFromCursor(m_dwCursor))); UINT n = CreateCursor(m_nRow) | m_dwCursor; SetCurSel(n, n); return wParam;} @@ -3729,15 +3729,17 @@ case kcHomeAbsolute: if (m_dwCursor) SetCurrentColumn(0); if (m_nRow > 0) SetCurrentRow(0); return wParam; case kcEndHorizontalSelect: - case kcEndHorizontal: if (m_dwCursor!=(((pSndFile->GetNumChannels() - 1u) << 3u) | 4)) SetCurrentColumn(((pSndFile->m_nChannels-1) << 3) | 4); + case kcEndHorizontal: if (m_dwCursor != CreateCursor(0, pSndFile->GetNumChannels() - 1, LAST_COLUMN)) SetCurrentColumn(CreateCursor(0, pSndFile->GetNumChannels() - 1, LAST_COLUMN)); else if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); return wParam; case kcEndVerticalSelect: case kcEndVertical: if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); - else if (m_dwCursor!=(((pSndFile->GetNumChannels() - 1) << 3u) | 4u)) SetCurrentColumn(((pSndFile->m_nChannels-1) << 3u) | 4); + else if (m_dwCursor != CreateCursor(0, pSndFile->GetNumChannels() - 1, LAST_COLUMN)) SetCurrentColumn(CreateCursor(0, pSndFile->GetNumChannels() - 1, LAST_COLUMN)); return wParam; case kcEndAbsoluteSelect: - case kcEndAbsolute: SetCurrentColumn(((pSndFile->GetNumChannels() - 1) << 3) | 4); if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); return wParam; + case kcEndAbsolute: SetCurrentColumn(CreateCursor(0, pSndFile->GetNumChannels() - 1, LAST_COLUMN)); + if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); + return wParam; case kcNextPattern: { UINT n = m_nPattern + 1; while ((n < pSndFile->Patterns.Size()) && (!pSndFile->Patterns[n])) n++; @@ -4207,9 +4209,9 @@ } //Enter note off - if(pModDoc->GetSoundFile()->GetModSpecifications().hasNoteOff) // === + if(pSndFile->GetModSpecifications().hasNoteOff) // === p->note = NOTE_KEYOFF; - else if(pModDoc->GetSoundFile()->GetModSpecifications().hasNoteCut) // ^^^ + else if(pSndFile->GetModSpecifications().hasNoteCut) // ^^^ p->note = NOTE_NOTECUT; else { // we don't have anything to cut (MOD format) - use volume or ECx if(usePlaybackPosition && nTick) // ECx Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2011-07-31 23:32:09 UTC (rev 951) +++ trunk/OpenMPT/mptrack/View_pat.h 2011-08-01 16:17:20 UTC (rev 952) @@ -113,7 +113,8 @@ RECT m_rcDragItem, m_rcDropItem; bool m_bContinueSearch, m_bWholePatternFitsOnScreen; - DWORD m_dwStatus, m_dwCursor; + DWORD m_dwStatus; + DWORD m_dwCursor; // Current cursor position, without row number. DWORD m_dwBeginSel, m_dwEndSel; // Upper-left / Lower-right corners of selection DWORD m_dwStartSel, m_dwDragPos; // Point where selection was started WORD ChnVUMeters[MAX_BASECHANNELS]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-01 16:21:27
|
Revision: 953 http://modplug.svn.sourceforge.net/modplug/?rev=953&view=rev Author: saga-games Date: 2011-08-01 16:21:19 +0000 (Mon, 01 Aug 2011) Log Message: ----------- [New] MRU list length can now be set through a hidden INI option, MRUListLength in [Misc] (up to 15 entries) [Mod] OpenMPT: Version is now 1.20.00.02 Modified Paths: -------------- trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-01 16:17:20 UTC (rev 952) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-01 16:21:19 UTC (rev 953) @@ -830,9 +830,10 @@ } m_pszProfileName = _tcsdup(m_szConfigFileName); + int mruListLength = GetPrivateProfileInt("Misc", "MRUListLength", 10, m_pszProfileName); + Limit(mruListLength, 0, 15); + LoadStdProfileSettings((UINT)mruListLength); // Load standard INI file options (including MRU) - LoadStdProfileSettings(10); // Load standard INI file options (including MRU) - // Register document templates m_pModTemplate = new CModDocTemplate( IDR_MODULETYPE, Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-08-01 16:17:20 UTC (rev 952) +++ trunk/OpenMPT/mptrack/version.h 2011-08-01 16:21:19 UTC (rev 953) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 01 +#define VER_MINORMINOR 02 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-04 19:30:40
|
Revision: 956 http://modplug.svn.sourceforge.net/modplug/?rev=956&view=rev Author: saga-games Date: 2011-08-04 19:30:34 +0000 (Thu, 04 Aug 2011) Log Message: ----------- [Imp] Added keyboard shortcut for "save as template" Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/mptrack/Moddoc.cpp Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2011-08-04 19:29:41 UTC (rev 955) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2011-08-04 19:30:34 UTC (rev 956) @@ -604,6 +604,7 @@ DefineKeyCommand(kcSampleXFade, 1857, kcVisible, kcNoDummy, _T("Crossfade sample loop")); DefineKeyCommand(kcSelectBeat, 1858, kcVisible, kcNoDummy, _T("Select beat")); DefineKeyCommand(kcSelectMeasure, 1859, kcVisible, kcNoDummy, _T("Select measure")); + DefineKeyCommand(kcFileSaveTemplate, 1860, kcVisible, kcNoDummy, _T("File/Save As Template")); // Add new key commands here. #ifdef _DEBUG Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2011-08-04 19:29:41 UTC (rev 955) +++ trunk/OpenMPT/mptrack/CommandSet.h 2011-08-04 19:30:34 UTC (rev 956) @@ -56,6 +56,7 @@ kcFileClose, kcFileSave, kcFileSaveAs, + kcFileSaveTemplate, kcFileSaveAsWave, kcFileSaveAsMP3, kcFileSaveMidi, Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2011-08-04 19:29:41 UTC (rev 955) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2011-08-04 19:30:34 UTC (rev 956) @@ -414,57 +414,57 @@ switch(id) { - case FILENEW: s="&New\t"; c=kcFileNew; break; - case ID_FILE_OPEN: s="&Open...\t"; c=kcFileOpen; break; - case ID_FILE_OPENTEMPLATE: return "Open Template\t"; - case ID_FILE_CLOSE: s="&Close\t"; c=kcFileClose; break; - case ID_FILE_SAVE: s="&Save\t"; c=kcFileSave; break; - case ID_FILE_SAVE_AS: s="Save &As...\t"; c=kcFileSaveAs; break; - case ID_FILE_SAVEASTEMPLATE:s="Save as Template\t"; break; - case ID_FILE_SAVEASWAVE: s="Export as &Wave...\t"; c=kcFileSaveAsWave; break; - case ID_FILE_SAVEASMP3: s="Export as M&P3...\t"; c=kcFileSaveAsMP3; break; - case ID_FILE_SAVEMIDI: s="Export as M&IDI...\t"; c=kcFileSaveMidi; break; - case ID_FILE_SAVECOMPAT: s="Compatibility &Export...\t"; c=kcFileExportCompat; break; - case ID_IMPORT_MIDILIB: s="Import &MIDI Library...\t"; c=kcFileImportMidiLib; break; - case ID_ADD_SOUNDBANK: s="Add Sound &Bank...\t"; c=kcFileAddSoundBank; break; + case FILENEW: s="&New\t"; c = kcFileNew; break; + case ID_FILE_OPEN: s="&Open...\t"; c = kcFileOpen; break; + case ID_FILE_OPENTEMPLATE: s="Open Template\t"; break; + case ID_FILE_CLOSE: s="&Close\t"; c = kcFileClose; break; + case ID_FILE_SAVE: s="&Save\t"; c = kcFileSave; break; + case ID_FILE_SAVE_AS: s="Save &As...\t"; c = kcFileSaveAs; break; + case ID_FILE_SAVEASTEMPLATE:s="Save as &Template\t"; c = kcFileSaveTemplate; break; + case ID_FILE_SAVEASWAVE: s="Export as &Wave...\t"; c = kcFileSaveAsWave; break; + case ID_FILE_SAVEASMP3: s="Export as M&P3...\t"; c = kcFileSaveAsMP3; break; + case ID_FILE_SAVEMIDI: s="Export as M&IDI...\t"; c = kcFileSaveMidi; break; + case ID_FILE_SAVECOMPAT: s="Compatibility &Export...\t"; c = kcFileExportCompat; break; + case ID_IMPORT_MIDILIB: s="Import &MIDI Library...\t"; c = kcFileImportMidiLib; break; + case ID_ADD_SOUNDBANK: s="Add Sound &Bank...\t"; c = kcFileAddSoundBank; break; - case ID_PLAYER_PLAY: s="Pause / &Resume\t"; c= kcPlayPauseSong; break; - case ID_PLAYER_PLAYFROMSTART: s="&Play from start\t"; c=kcPlaySongFromStart; break; - case ID_PLAYER_STOP: s="&Stop\t"; c=kcStopSong; break; - case ID_PLAYER_PAUSE: s="P&ause\t"; c=kcPauseSong; break; - case ID_MIDI_RECORD: s="&MIDI Record\t"; c=kcMidiRecord; break; - case ID_ESTIMATESONGLENGTH: s="&Estimate Song Length\t"; c=kcEstimateSongLength; break; - case ID_APPROX_BPM: s="Approx. real &BPM\t"; c=kcApproxRealBPM; break; + case ID_PLAYER_PLAY: s="Pause / &Resume\t"; c = kcPlayPauseSong; break; + case ID_PLAYER_PLAYFROMSTART: s="&Play from start\t"; c = kcPlaySongFromStart; break; + case ID_PLAYER_STOP: s="&Stop\t"; c = kcStopSong; break; + case ID_PLAYER_PAUSE: s="P&ause\t"; c = kcPauseSong; break; + case ID_MIDI_RECORD: s="&MIDI Record\t"; c = kcMidiRecord; break; + case ID_ESTIMATESONGLENGTH: s="&Estimate Song Length\t"; c = kcEstimateSongLength; break; + case ID_APPROX_BPM: s="Approx. real &BPM\t"; c = kcApproxRealBPM; break; - case ID_EDIT_UNDO: s="&Undo\t"; c=kcEditUndo; break; - case ID_EDIT_CUT: s="Cu&t\t"; c=kcEditCut; break; - case ID_EDIT_COPY: s="&Copy\t"; c=kcEditCopy; break; - case ID_EDIT_PASTE: s="&Paste\t"; c=kcEditPaste; break; - case ID_EDIT_SELECT_ALL: s="Select &All\t"; c=kcEditSelectAll; break; + case ID_EDIT_UNDO: s="&Undo\t"; c = kcEditUndo; break; + case ID_EDIT_CUT: s="Cu&t\t"; c = kcEditCut; break; + case ID_EDIT_COPY: s="&Copy\t"; c = kcEditCopy; break; + case ID_EDIT_PASTE: s="&Paste\t"; c = kcEditPaste; break; + case ID_EDIT_SELECT_ALL: s="Select &All\t"; c = kcEditSelectAll; break; case ID_EDIT_CLEANUP: s="C&leanup"; break; - case ID_EDIT_FIND: s="&Find / Replace\t"; c=kcEditFind; break; - case ID_EDIT_FINDNEXT: s="Find &Next\t"; c=kcEditFindNext; break; - case ID_EDIT_GOTO_MENU: s="&Goto\t"; c=kcPatternGoto; break; - case ID_EDIT_SPLITKEYBOARDSETTINGS: s="Split &Keyboard Settings\t"; c=kcShowSplitKeyboardSettings; break; + case ID_EDIT_FIND: s="&Find / Replace\t"; c = kcEditFind; break; + case ID_EDIT_FINDNEXT: s="Find &Next\t"; c = kcEditFindNext; break; + case ID_EDIT_GOTO_MENU: s="&Goto\t"; c = kcPatternGoto; break; + case ID_EDIT_SPLITKEYBOARDSETTINGS: s="Split &Keyboard Settings\t"; c = kcShowSplitKeyboardSettings; break; // "Paste Special" sub menu - case ID_EDIT_PASTE_SPECIAL: s="&Mix Paste\t"; c=kcEditMixPaste; break; - case ID_EDIT_MIXPASTE_ITSTYLE: s="&Mix Paste (IT Style)\t"; c=kcEditMixPasteITStyle; break; - case ID_EDIT_PASTEFLOOD: s="Paste Fl&ood\t"; c=kcEditPasteFlood; break; - case ID_EDIT_PUSHFORWARDPASTE: s="&Push Forward Paste (Insert)\t"; c=kcEditPushForwardPaste; break; + case ID_EDIT_PASTE_SPECIAL: s="&Mix Paste\t"; c = kcEditMixPaste; break; + case ID_EDIT_MIXPASTE_ITSTYLE: s="&Mix Paste (IT Style)\t"; c = kcEditMixPasteITStyle; break; + case ID_EDIT_PASTEFLOOD: s="Paste Fl&ood\t"; c = kcEditPasteFlood; break; + case ID_EDIT_PUSHFORWARDPASTE: s="&Push Forward Paste (Insert)\t"; c = kcEditPushForwardPaste; break; - case ID_VIEW_GLOBALS: s="&General\t"; c=kcViewGeneral; break; - case ID_VIEW_SAMPLES: s="&Samples\t"; c=kcViewSamples; break; - case ID_VIEW_PATTERNS: s="&Patterns\t"; c=kcViewPattern; break; - case ID_VIEW_INSTRUMENTS: s="&Instruments\t"; c=kcViewInstruments; break; - case ID_VIEW_COMMENTS: s="&Comments\t"; c=kcViewComments; break; - case ID_VIEW_GRAPH: s="G&raph\t"; c=kcViewGraph; break; //rewbs.graph - case MAINVIEW: s="&Main\t"; c=kcViewMain; break; - case IDD_TREEVIEW: s="&Tree\t"; c=kcViewTree; break; - case ID_VIEW_OPTIONS: s="S&etup...\t"; c=kcViewOptions; break; - case ID_HELP: s="C&ontents (todo)"; c=kcHelp; break; - case ID_PLUGIN_SETUP: s="Pl&ugin Manager...\t"; c=kcViewAddPlugin; break; - case ID_CHANNEL_MANAGER: s="Ch&annel Manager...\t"; c=kcViewChannelManager; break; - case ID_VIEW_SONGPROPERTIES:s="Song P&roperties...\t"; c=kcViewSongProperties; break; //rewbs.graph + case ID_VIEW_GLOBALS: s="&General\t"; c = kcViewGeneral; break; + case ID_VIEW_SAMPLES: s="&Samples\t"; c = kcViewSamples; break; + case ID_VIEW_PATTERNS: s="&Patterns\t"; c = kcViewPattern; break; + case ID_VIEW_INSTRUMENTS: s="&Instruments\t"; c = kcViewInstruments; break; + case ID_VIEW_COMMENTS: s="&Comments\t"; c = kcViewComments; break; + case ID_VIEW_GRAPH: s="G&raph\t"; c = kcViewGraph; break; //rewbs.graph + case MAINVIEW: s="&Main\t"; c = kcViewMain; break; + case IDD_TREEVIEW: s="&Tree\t"; c = kcViewTree; break; + case ID_VIEW_OPTIONS: s="S&etup...\t"; c = kcViewOptions; break; + case ID_HELP: s="C&ontents (todo)"; c = kcHelp; break; + case ID_PLUGIN_SETUP: s="Pl&ugin Manager...\t"; c = kcViewAddPlugin; break; + case ID_CHANNEL_MANAGER: s="Ch&annel Manager...\t"; c = kcViewChannelManager; break; + case ID_VIEW_SONGPROPERTIES:s="Song P&roperties...\t"; c = kcViewSongProperties; break; //rewbs.graph case ID_VIEW_MIDIMAPPING: s="&MIDI Mapping...\t"; c = kcViewMIDImapping; break; case ID_VIEW_EDITHISTORY: s="Edit &History...\t"; c = kcViewEditHistory; break; // Help submenu: Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-08-04 19:29:41 UTC (rev 955) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-08-04 19:30:34 UTC (rev 956) @@ -3645,7 +3645,8 @@ case kcEstimateSongLength: OnEstimateSongLength(); break; case kcApproxRealBPM: OnApproximateBPM(); break; case kcFileSave: DoSave(m_strPathName, 0); break; - case kcFileSaveAs: DoSave(NULL, 1); break; + case kcFileSaveAs: DoSave(NULL, TRUE); break; + case kcFileSaveTemplate: OnSaveTemplateModule(); break; case kcFileClose: SafeFileClose(); break; case kcPlayPatternFromCursor: OnPatternPlay(); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-04 19:56:32
|
Revision: 958 http://modplug.svn.sourceforge.net/modplug/?rev=958&view=rev Author: saga-games Date: 2011-08-04 19:56:25 +0000 (Thu, 04 Aug 2011) Log Message: ----------- [New] Instead of multiple modal message boxes, a single dialog with a list of unsaved files is now shown when closing the main window. The old behaviour can be restored by setting "NoModifiedDocumentsDialog=1" in [Misc] in mptrack.ini. [Mod] OpenMPT: Version is now 1.20.00.03 Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/mptrack/version.h Added Paths: ----------- trunk/OpenMPT/mptrack/CloseMainDialog.cpp trunk/OpenMPT/mptrack/CloseMainDialog.h Added: trunk/OpenMPT/mptrack/CloseMainDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/CloseMainDialog.cpp (rev 0) +++ trunk/OpenMPT/mptrack/CloseMainDialog.cpp 2011-08-04 19:56:25 UTC (rev 958) @@ -0,0 +1,168 @@ +/* + * + * CloseMainDialog.cpp + * ------------------- + * Purpose: Code for displaying a dialog with a list of unsaved documents, and the ability to choose which documents should be saved or not. + * Notes : (currently none) + * Authors: OpenMPT Devs + */ + + +#include "stdafx.h" +#include "Mptrack.h" +#include "Mainfrm.h" +#include "Moddoc.h" +#include "CloseMainDialog.h" + + +BEGIN_MESSAGE_MAP(CloseMainDialog, CDialog) + ON_LBN_SELCHANGE(IDC_LIST1, OnSelectionChanged) + ON_COMMAND(IDC_BUTTON1, OnSwitchSelection) + ON_COMMAND(IDC_CHECK1, OnSwitchFullPaths) +END_MESSAGE_MAP() + + +void CloseMainDialog::DoDataExchange(CDataExchange* pDX) +//------------------------------------------------------ +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(DoDataExchange) + DDX_Control(pDX, IDC_LIST1, m_List); + //}}AFX_DATA_MAP +} + + +// Format a list entry string +CString CloseMainDialog::FormatTitle(const CModDoc *pModDoc, bool fullPath) +//------------------------------------------------------------------------- +{ + const CString &path = (!fullPath || pModDoc->GetPathName().IsEmpty()) ? pModDoc->GetTitle() : pModDoc->GetPathName(); + return pModDoc->GetSoundFile()->GetTitle() + CString(" (") + path + CString(")"); +} + + +BOOL CloseMainDialog::OnInitDialog() +//---------------------------------- +{ + CDialog::OnInitDialog(); + + CMainFrame::GetInputHandler()->Bypass(true); + + // Create list of unsaved documents + m_List.ResetContent(); + + CheckDlgButton(IDC_CHECK1, BST_CHECKED); + + CDocTemplate *pDocTmpl = theApp.GetModDocTemplate(); + if(pDocTmpl) + { + POSITION pos = pDocTmpl->GetFirstDocPosition(); + CDocument *pDoc; + while((pos != NULL) && ((pDoc = pDocTmpl->GetNextDoc(pos)) != NULL)) + { + CModDoc *pModDoc = (CModDoc *)pDoc; + if(pModDoc->IsModified()) + { + int item = m_List.AddString(FormatTitle(pModDoc, true)); + m_List.SetItemDataPtr(item, pModDoc); + m_List.SetSel(item, TRUE); + } + } + } + + if(m_List.GetCount() == 0) + { + // No modified documents... + OnOK(); + } else + { + UpdateSwitchButtonState(); + } + + return TRUE; +} + + +void CloseMainDialog::OnOK() +//-------------------------- +{ + const int count = m_List.GetCount(); + for(int i = 0; i < count; i++) + { + CModDoc *pModDoc = (CModDoc *)m_List.GetItemDataPtr(i); + ASSERT(pModDoc != nullptr); + if(m_List.GetSel(i)) + { + pModDoc->ActivateWindow(); + if(pModDoc->DoFileSave() == FALSE) + { + // If something went wrong, or if the user decided to cancel saving (when using "Save As"), we'll better not proceed... + OnCancel(); + return; + } + } else + { + pModDoc->SetModified(FALSE); + } + } + + CDialog::OnOK(); + CMainFrame::GetInputHandler()->Bypass(false); + +} + + +void CloseMainDialog::OnCancel() +//------------------------------ +{ + CDialog::OnCancel(); + CMainFrame::GetInputHandler()->Bypass(false); +} + + +void CloseMainDialog::OnSelectionChanged() +//---------------------------------------- +{ + UpdateSwitchButtonState(); +} + + +// Switch between save all/none +void CloseMainDialog::OnSwitchSelection() +//--------------------------------------- +{ + const int count = m_List.GetCount(); + // If all items are selected, deselect them all; Else, select all items. + const BOOL action = (m_List.GetSelCount() == count) ? FALSE : TRUE; + for(int i = 0; i < count; i++) + { + m_List.SetSel(i, action); + } + UpdateSwitchButtonState(); +} + + +// Update Select none/all button +void CloseMainDialog::UpdateSwitchButtonState() +//--------------------------------------------- +{ + const CString text = (m_List.GetSelCount() == m_List.GetCount()) ? "&Select none" : "&Select all"; + ((CButton *)GetDlgItem(IDC_BUTTON1))->SetWindowText(text); +} + + +// Switch between full path / filename only display +void CloseMainDialog::OnSwitchFullPaths() +//--------------------------------------- +{ + const int count = m_List.GetCount(); + const bool fullPath = (IsDlgButtonChecked(IDC_CHECK1) == BST_CHECKED); + for(int i = 0; i < count; i++) + { + CModDoc *pModDoc = (CModDoc *)m_List.GetItemDataPtr(i); + int item = m_List.InsertString(i + 1, FormatTitle(pModDoc, fullPath)); + m_List.SetItemDataPtr(item, pModDoc); + m_List.SetSel(item, m_List.GetSel(i)); + m_List.DeleteString(i); + } +} Added: trunk/OpenMPT/mptrack/CloseMainDialog.h =================================================================== --- trunk/OpenMPT/mptrack/CloseMainDialog.h (rev 0) +++ trunk/OpenMPT/mptrack/CloseMainDialog.h 2011-08-04 19:56:25 UTC (rev 958) @@ -0,0 +1,42 @@ +/* + * CloseMainDialog.h + * ----------------- + * Purpose: Header file for unsaved documents dialog. + * Notes : (currently none) + * Authors: OpenMPT Devs + */ + +#ifndef CLOSEMAINDIALOG_H +#define CLOSEMAINDIALOG_H +#pragma once + +//=================================== +class CloseMainDialog: public CDialog +//=================================== +{ +protected: + + CListBox m_List; + + CString FormatTitle(const CModDoc *pModDoc, bool fullPath); + void UpdateSwitchButtonState(); + +public: + CloseMainDialog() : CDialog(IDD_CLOSEDOCUMENTS) { }; + + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + virtual BOOL OnInitDialog(); + virtual void OnOK(); + virtual void OnCancel(); + + afx_msg void OnSelectionChanged(); + afx_msg void OnSwitchSelection(); + afx_msg void OnSwitchFullPaths(); + + DECLARE_MESSAGE_MAP() + +}; + +#endif // CLOSEMAINDIALOG_H \ No newline at end of file Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-04 19:39:53 UTC (rev 957) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-04 19:56:25 UTC (rev 958) @@ -25,6 +25,7 @@ #include "version.h" #include "ctrl_pat.h" #include "UpdateCheck.h" +#include "CloseMainDialog.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -481,8 +482,15 @@ void CMainFrame::OnClose() //------------------------ { - // TODO: Here we could add a custom dialog that lists all modified files, and the user could select which should be saved. - // How do we get all files? Does the document manager help here? + if(GetPrivateProfileLong("Misc", "NoModifiedDocumentsDialog", 0, theApp.GetConfigFileName()) == 0) + { + // Show modified documents window + CloseMainDialog dlg; + if(dlg.DoModal() != IDOK) + { + return; + } + } CChildFrame *pMDIActive = (CChildFrame *)MDIGetActive(); Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-08-04 19:39:53 UTC (rev 957) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-08-04 19:56:25 UTC (rev 958) @@ -209,6 +209,19 @@ END +IDD_CLOSEDOCUMENTS DIALOGEX 0, 0, 370, 233 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Save modified files" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "&OK",IDOK,300,174,66,14 + PUSHBUTTON "&Cancel",IDCANCEL,300,193,66,14 + LISTBOX IDC_LIST1,6,6,288,204,LBS_SORT | LBS_MULTIPLESEL | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + CONTROL "Show &full paths",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,216,252,12 + PUSHBUTTON "&Select none",IDC_BUTTON1,300,12,66,14 +END + + ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO @@ -296,6 +309,14 @@ TOPMARGIN, 7 BOTTOMMARGIN, 274 END + + IDD_CLOSEDOCUMENTS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 363 + TOPMARGIN, 7 + BOTTOMMARGIN, 226 + END END #endif // APSTUDIO_INVOKED @@ -2152,17 +2173,33 @@ STRINGTABLE BEGIN + IDS_TUNING_IMPORT_LIMIT "-Failed to load file %1%2: maximum number(=%3!u!) of temporary tunings is already open.\n" + IDS_TUNING_IMPORT_UNKNOWN_FAILURE + "-Unable to import file ""%1%2"": unknown reason.\n" + IDS_TUNING_IMPORT_UNRECOGNIZED_FILE_EXT + "-Unable to load ""%1%2"": unrecognized file extension.\n" + IDS_TUNING_IMPORT_UNKNOWN_TC_FAILURE + "-Unable to import tuning collection ""%1%2"": unrecognized file.\n" + IDS_TUNING_IMPORT_SCL_FAILURE "-Unable to import ""%1%2"": %3.\n" + IDS_TUNING_IMPORT_UNRECOGNIZED_FILE + "-Unable to import file ""%1%2"": unrecognized file.\n" + IDS_SOUNDTOUCH_LOADFAILURE "Unable to load OpenMPT_soundtouch_i16.dll." + IDS_UNABLE_TO_CREATE_USER_TEMPLATE_FOLDER + """Error: Unable to create template folder '%1'""" + IDS_FILE_DOES_NOT_EXIST "The file '%1' does not exist" + IDS_FILE_EXISTS_BUT_IS_NOT_READABLE + "The file '%1' exists but can't be read" IDS_ERR_FILEOPEN "Unable to open file." IDS_ERR_FILETYPE "Unsupported file type" IDS_ERR_SAVEINS "Unable to save instrument" IDS_ERR_OUTOFMEMORY "Not enough memory" IDS_ERR_TOOMANYINS "Too many instruments!" IDS_ERR_SAVESONG "Unable to save song!" - IDS_ERR_TOOMANYPAT "Too many patterns!" END STRINGTABLE BEGIN + IDS_ERR_TOOMANYPAT "Too many patterns!" IDS_ERR_TOOMANYSMP "Too many samples!" IDS_ERR_SAVESMP "Unable to save sample" END @@ -2175,10 +2212,19 @@ ID_INDICATOR_SCRL "SCRL" ID_INDICATOR_OVR "OVR" ID_INDICATOR_REC "REC" +END + +STRINGTABLE +BEGIN ID_INDICATOR_TIME "00:00:00 [100] 200ch" +END + +STRINGTABLE +BEGIN ID_INDICATOR_USER "Row 000, Col 000" ID_INDICATOR_INFO "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ID_INDICATOR_XINFO "123456789|123456789|123456789|123456789|" + ID_VIEW_MIDIMAPPING "Configure the MIDI Mapping" END STRINGTABLE @@ -2474,28 +2520,12 @@ STRINGTABLE BEGIN - IDS_TUNING_IMPORT_LIMIT "-Failed to load file %1%2: maximum number(=%3!u!) of temporary tunings is already open.\n" - IDS_TUNING_IMPORT_UNKNOWN_FAILURE - "-Unable to import file ""%1%2"": unknown reason.\n" - IDS_TUNING_IMPORT_UNRECOGNIZED_FILE_EXT - "-Unable to load ""%1%2"": unrecognized file extension.\n" - IDS_TUNING_IMPORT_UNKNOWN_TC_FAILURE - "-Unable to import tuning collection ""%1%2"": unrecognized file.\n" - IDS_TUNING_IMPORT_SCL_FAILURE "-Unable to import ""%1%2"": %3.\n" - IDS_TUNING_IMPORT_UNRECOGNIZED_FILE - "-Unable to import file ""%1%2"": unrecognized file.\n" - IDS_SOUNDTOUCH_LOADFAILURE "Unable to load OpenMPT_soundtouch_i16.dll." - IDS_UNABLE_TO_CREATE_USER_TEMPLATE_FOLDER - """Error: Unable to create template folder '%1'""" - IDS_FILE_DOES_NOT_EXIST "The file '%1' does not exist" - IDS_FILE_EXISTS_BUT_IS_NOT_READABLE - "The file '%1' exists but can't be read" + ID_PANIC "Kill all VSTi and sample voices\nStop all hanging VSTi and sample voices" + ID_VIEW_EDITHISTORY "View the edit history of this module" END STRINGTABLE BEGIN - ID_PANIC "Kill all VSTi and sample voices\nStop all hanging VSTi and sample voices" - ID_VIEW_EDITHISTORY "View the edit history of this module" ID_FILE_SAVEASTEMPLATE "Save the active document as template module\nSave as Template" END @@ -2506,11 +2536,6 @@ STRINGTABLE BEGIN - ID_VIEW_MIDIMAPPING "Configure the MIDI Mapping" -END - -STRINGTABLE -BEGIN ID_CHANNEL_MANAGER "Add, remove, mute and manage channels" ID_PLUGIN_SETUP "Register plugins and add them to the current module" END Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2011-08-04 19:39:53 UTC (rev 957) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2011-08-04 19:56:25 UTC (rev 958) @@ -193,6 +193,9 @@ RelativePath=".\CleanupSong.cpp"> </File> <File + RelativePath=".\CloseMainDialog.cpp"> + </File> + <File RelativePath=".\ColourEdit.cpp"> </File> <File @@ -669,6 +672,9 @@ RelativePath=".\CleanupSong.h"> </File> <File + RelativePath=".\CloseMainDialog.h"> + </File> + <File RelativePath=".\ColourEdit.h"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-08-04 19:39:53 UTC (rev 957) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-08-04 19:56:25 UTC (rev 958) @@ -261,6 +261,10 @@ > </File> <File + RelativePath=".\CloseMainDialog.cpp" + > + </File> + <File RelativePath=".\ColourEdit.cpp" > </File> @@ -887,6 +891,10 @@ > </File> <File + RelativePath=".\CloseMainDialog.h" + > + </File> + <File RelativePath=".\ColourEdit.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-04 19:39:53 UTC (rev 957) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-04 19:56:25 UTC (rev 958) @@ -171,6 +171,7 @@ <ClCompile Include="ChannelManagerDlg.cpp" /> <ClCompile Include="ChildFrm.cpp" /> <ClCompile Include="CleanupSong.cpp" /> + <ClCompile Include="CloseMainDialog.cpp" /> <ClCompile Include="ColourEdit.cpp" /> <ClCompile Include="CommandSet.cpp" /> <ClCompile Include="CreditStatic.cpp" /> @@ -334,6 +335,7 @@ <ClInclude Include="ChannelManagerDlg.h" /> <ClInclude Include="ChildFrm.h" /> <ClInclude Include="CleanupSong.h" /> + <ClInclude Include="CloseMainDialog.h" /> <ClInclude Include="ColourEdit.h" /> <ClInclude Include="CommandSet.h" /> <ClInclude Include="CreditStatic.h" /> Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2011-08-04 19:39:53 UTC (rev 957) +++ trunk/OpenMPT/mptrack/resource.h 2011-08-04 19:56:25 UTC (rev 958) @@ -151,6 +151,7 @@ #define IDD_SAMPLE_GRID_SIZE 527 #define IDD_SAMPLE_XFADE 528 #define IDD_OPTIONS_UPDATE 529 +#define IDD_CLOSEDOCUMENTS 530 #define IDC_BUTTON1 1001 #define IDC_BUTTON2 1002 #define IDC_BUTTON3 1003 @@ -1198,7 +1199,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 530 +#define _APS_NEXT_RESOURCE_VALUE 531 #define _APS_NEXT_COMMAND_VALUE 40461 #define _APS_NEXT_CONTROL_VALUE 2436 #define _APS_NEXT_SYMED_VALUE 901 Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-08-04 19:39:53 UTC (rev 957) +++ trunk/OpenMPT/mptrack/version.h 2011-08-04 19:56:25 UTC (rev 958) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 02 +#define VER_MINORMINOR 03 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-05 15:48:26
|
Revision: 959 http://modplug.svn.sourceforge.net/modplug/?rev=959&view=rev Author: saga-games Date: 2011-08-05 15:48:20 +0000 (Fri, 05 Aug 2011) Log Message: ----------- [Mod] Improved Close dialog a bit, made NoModifiedDocumentsDialog an official setting (in the general settings) Modified Paths: -------------- trunk/OpenMPT/mptrack/CloseMainDialog.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moptions.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/CloseMainDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/CloseMainDialog.cpp 2011-08-04 19:56:25 UTC (rev 958) +++ trunk/OpenMPT/mptrack/CloseMainDialog.cpp 2011-08-05 15:48:20 UTC (rev 959) @@ -146,8 +146,10 @@ void CloseMainDialog::UpdateSwitchButtonState() //--------------------------------------------- { - const CString text = (m_List.GetSelCount() == m_List.GetCount()) ? "&Select none" : "&Select all"; + CString text = (m_List.GetSelCount() == m_List.GetCount()) ? "Se&lect none" : "Se&lect all"; ((CButton *)GetDlgItem(IDC_BUTTON1))->SetWindowText(text); + text = (m_List.GetSelCount() > 0) ? "&Save selected" : "Cl&ose"; + ((CButton *)GetDlgItem(IDOK))->SetWindowText(text); } Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-04 19:56:25 UTC (rev 958) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-05 15:48:20 UTC (rev 959) @@ -482,7 +482,7 @@ void CMainFrame::OnClose() //------------------------ { - if(GetPrivateProfileLong("Misc", "NoModifiedDocumentsDialog", 0, theApp.GetConfigFileName()) == 0) + if(!(GetSettings().m_dwPatternSetup & PATTERN_NOCLOSEDIALOG)) { // Show modified documents window CloseMainDialog dlg; @@ -1310,7 +1310,7 @@ { if ((!hwnd) || (m_hFollowSong == hwnd)) { - memset(NotifyBuffer, 0, sizeof(NotifyBuffer)); + MemsetZero(NotifyBuffer); gsdwTotalSamples = 0; return TRUE; } Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2011-08-04 19:56:25 UTC (rev 958) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2011-08-05 15:48:20 UTC (rev 959) @@ -187,7 +187,7 @@ #define PATTERN_KBDNOTEOFF 0x40000 // Record note-off events #define PATTERN_FOLLOWSONGOFF 0x80000 // follow song off by default #define PATTERN_MIDIRECORD 0x100000 // MIDI Record on by default -//#define PATTERN_ALTERNTIVEBPMSPEED 0x200000 // deprecated +#define PATTERN_NOCLOSEDIALOG 0x200000 // Don't use OpenMPT's custom close dialog with a list of saved files when closing the main window //#define PATTERN_HILITETIMESIGS 0x400000 // highlight on song signature, deprecated (now always enabled) #define PATTERN_OLDCTXMENUSTYLE 0x800000 // mpt 1.16 pattern context menu style #define PATTERN_SYNCMUTE 0x1000000 // maintain sample sync on mute Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2011-08-04 19:56:25 UTC (rev 958) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2011-08-05 15:48:20 UTC (rev 959) @@ -583,7 +583,8 @@ {PATTERN_NOTEFADE, "Note fade on key up", "Enable to fade / stop notes on key up in pattern tab." }, {PATTERN_OVERFLOWPASTE, "Overflow paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."}, {PATTERN_RESETCHANNELS, "Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands) and is recommended to be enabled."}, - {PATTERN_LIVEUPDATETREE,"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a different icon in the treeview."} + {PATTERN_LIVEUPDATETREE,"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a different icon in the treeview."}, + {PATTERN_NOCLOSEDIALOG, "Disable modern close dialog", "When closing the main window, a confirmation window is shown for every unsaved document instead of one single window with a list of unsaved documents."}, }; Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-08-04 19:56:25 UTC (rev 958) +++ trunk/OpenMPT/mptrack/version.h 2011-08-05 15:48:20 UTC (rev 959) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 03 +#define VER_MINORMINOR 04 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-08 14:27:51
|
Revision: 967 http://modplug.svn.sourceforge.net/modplug/?rev=967&view=rev Author: saga-games Date: 2011-08-08 14:27:41 +0000 (Mon, 08 Aug 2011) Log Message: ----------- [Mod] Renamed "invalid index" shortcut to "stop index" [Ref] Made shortcut generation list look a little bit nicer. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2011-08-08 13:01:53 UTC (rev 966) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2011-08-08 14:27:41 UTC (rev 967) @@ -53,8 +53,8 @@ //------------------------------------------------------- // Helper function for setting up commands -inline void CCommandSet::DefineKeyCommand(CommandID kc, UINT uid, enmKcVisibility visibility, enmKcDummy dummy, CString message) -//------------------------------------------------------------------------------------------------------------------------------ +void CCommandSet::DefineKeyCommand(CommandID kc, UINT uid, CString message, enmKcVisibility visibility, enmKcDummy dummy) +//----------------------------------------------------------------------------------------------------------------------- { commands[kc].UID = uid; commands[kc].isHidden = (visibility == kcHidden) ? true : false; @@ -68,543 +68,543 @@ { //TODO: make this hideous list a bit nicer, with a constructor or somthing. //NOTE: isHidden implies automatically set, since the user will not be able to see it. - DefineKeyCommand(kcPatternRecord, 1001, kcVisible, kcNoDummy, _T("Enable recording")); - DefineKeyCommand(kcPatternPlayRow, 1002, kcVisible, kcNoDummy, _T("Play row")); - DefineKeyCommand(kcCursorCopy, 1003, kcVisible, kcNoDummy, _T("Quick copy")); - DefineKeyCommand(kcCursorPaste, 1004, kcVisible, kcNoDummy, _T("Quick paste")); - DefineKeyCommand(kcChannelMute, 1005, kcVisible, kcNoDummy, _T("Mute current channel")); - DefineKeyCommand(kcChannelSolo, 1006, kcVisible, kcNoDummy, _T("Solo current channel")); - DefineKeyCommand(kcTransposeUp, 1007, kcVisible, kcNoDummy, _T("Transpose +1")); - DefineKeyCommand(kcTransposeDown, 1008, kcVisible, kcNoDummy, _T("Transpose -1")); - DefineKeyCommand(kcTransposeOctUp, 1009, kcVisible, kcNoDummy, _T("Transpose +12")); - DefineKeyCommand(kcTransposeOctDown, 1010, kcVisible, kcNoDummy, _T("Transpose -12")); - DefineKeyCommand(kcSelectColumn, 1011, kcVisible, kcNoDummy, _T("Select channel / Select all")); - DefineKeyCommand(kcPatternAmplify, 1012, kcVisible, kcNoDummy, _T("Amplify selection")); - DefineKeyCommand(kcPatternSetInstrument, 1013, kcVisible, kcNoDummy, _T("Apply current instrument")); - DefineKeyCommand(kcPatternInterpolateVol, 1014, kcVisible, kcNoDummy, _T("Interpolate volume")); - DefineKeyCommand(kcPatternInterpolateEffect, 1015, kcVisible, kcNoDummy, _T("Interpolate effect")); - DefineKeyCommand(kcPatternVisualizeEffect, 1016, kcVisible, kcNoDummy, _T("Open effect visualizer")); - DefineKeyCommand(kcPatternJumpDownh1, 1017, kcVisible, kcNoDummy, _T("Jump down by measure")); - DefineKeyCommand(kcPatternJumpUph1, 1018, kcVisible, kcNoDummy, _T("Jump up by measure")); - DefineKeyCommand(kcPatternSnapDownh1, 1019, kcVisible, kcNoDummy, _T("Snap down to measure")); - DefineKeyCommand(kcPatternSnapUph1, 1020, kcVisible, kcNoDummy, _T("Snap up to measure")); - DefineKeyCommand(kcViewGeneral, 1021, kcVisible, kcNoDummy, _T("View General")); - DefineKeyCommand(kcViewPattern, 1022, kcVisible, kcNoDummy, _T("View Pattern")); - DefineKeyCommand(kcViewSamples, 1023, kcVisible, kcNoDummy, _T("View Samples")); - DefineKeyCommand(kcViewInstruments, 1024, kcVisible, kcNoDummy, _T("View Instruments")); - DefineKeyCommand(kcViewComments, 1025, kcVisible, kcNoDummy, _T("View Comments")); - DefineKeyCommand(kcPlayPatternFromCursor, 1026, kcVisible, kcNoDummy, _T("Play pattern from cursor")); - DefineKeyCommand(kcPlayPatternFromStart, 1027, kcVisible, kcNoDummy, _T("Play pattern from start")); - DefineKeyCommand(kcPlaySongFromCursor, 1028, kcVisible, kcNoDummy, _T("Play song from cursor")); - DefineKeyCommand(kcPlaySongFromStart, 1029, kcVisible, kcNoDummy, _T("Play song from start")); - DefineKeyCommand(kcPlayPauseSong, 1030, kcVisible, kcNoDummy, _T("Play song/Pause song")); - DefineKeyCommand(kcPauseSong, 1031, kcVisible, kcNoDummy, _T("Pause song")); - DefineKeyCommand(kcPrevInstrument, 1032, kcVisible, kcNoDummy, _T("Previous instrument")); - DefineKeyCommand(kcNextInstrument, 1033, kcVisible, kcNoDummy, _T("Next instrument")); - DefineKeyCommand(kcPrevOrder, 1034, kcVisible, kcNoDummy, _T("Previous order")); - DefineKeyCommand(kcNextOrder, 1035, kcVisible, kcNoDummy, _T("Next order")); - DefineKeyCommand(kcPrevOctave, 1036, kcVisible, kcNoDummy, _T("Previous octave")); - DefineKeyCommand(kcNextOctave, 1037, kcVisible, kcNoDummy, _T("Next octave")); - DefineKeyCommand(kcNavigateDown, 1038, kcVisible, kcNoDummy, _T("Navigate down by 1 row")); - DefineKeyCommand(kcNavigateUp, 1039, kcVisible, kcNoDummy, _T("Navigate up by 1 row")); - DefineKeyCommand(kcNavigateLeft, 1040, kcVisible, kcNoDummy, _T("Navigate left")); - DefineKeyCommand(kcNavigateRight, 1041, kcVisible, kcNoDummy, _T("Navigate right")); - DefineKeyCommand(kcNavigateNextChan, 1042, kcVisible, kcNoDummy, _T("Navigate to next channel")); - DefineKeyCommand(kcNavigatePrevChan, 1043, kcVisible, kcNoDummy, _T("Navigate to previous channel")); - DefineKeyCommand(kcHomeHorizontal, 1044, kcVisible, kcNoDummy, _T("Go to first channel")); - DefineKeyCommand(kcHomeVertical, 1045, kcVisible, kcNoDummy, _T("Go to first row")); - DefineKeyCommand(kcHomeAbsolute, 1046, kcVisible, kcNoDummy, _T("Go to first row of first channel")); - DefineKeyCommand(kcEndHorizontal, 1047, kcVisible, kcNoDummy, _T("Go to last channel")); - DefineKeyCommand(kcEndVertical, 1048, kcVisible, kcNoDummy, _T("Go to last row")); - DefineKeyCommand(kcEndAbsolute, 1049, kcVisible, kcNoDummy, _T("Go to last row of last channel")); - DefineKeyCommand(kcSelect, 1050, kcVisible, kcNoDummy, _T("Selection key")); - DefineKeyCommand(kcCopySelect, 1051, kcVisible, kcNoDummy, _T("Copy select key")); - DefineKeyCommand(kcSelectOff, 1052, kcHidden, kcNoDummy, _T("Deselect")); - DefineKeyCommand(kcCopySelectOff, 1053, kcHidden, kcNoDummy, _T("Copy deselect key")); - DefineKeyCommand(kcNextPattern, 1054, kcVisible, kcNoDummy, _T("Next pattern")); - DefineKeyCommand(kcPrevPattern, 1055, kcVisible, kcNoDummy, _T("Previous pattern")); - //DefineKeyCommand(kcClearSelection, 1056, kcVisible, kcNoDummy, _T("Wipe selection")); - DefineKeyCommand(kcClearRow, 1057, kcVisible, kcNoDummy, _T("Clear row")); - DefineKeyCommand(kcClearField, 1058, kcVisible, kcNoDummy, _T("Clear field")); - DefineKeyCommand(kcClearRowStep, 1059, kcVisible, kcNoDummy, _T("Clear row and step")); - DefineKeyCommand(kcClearFieldStep, 1060, kcVisible, kcNoDummy, _T("Clear field and step")); - DefineKeyCommand(kcDeleteRows, 1061, kcVisible, kcNoDummy, _T("Delete rows")); - DefineKeyCommand(kcShowNoteProperties, 1062, kcVisible, kcNoDummy, _T("Show note properties")); - DefineKeyCommand(kcShowEditMenu, 1063, kcVisible, kcNoDummy, _T("Show context (right-click) menu")); - DefineKeyCommand(kcVPNoteC_0, 1064, kcVisible, kcNoDummy, _T("Base octave C")); - DefineKeyCommand(kcVPNoteCS0, 1065, kcVisible, kcNoDummy, _T("Base octave C#")); - DefineKeyCommand(kcVPNoteD_0, 1066, kcVisible, kcNoDummy, _T("Base octave D")); - DefineKeyCommand(kcVPNoteDS0, 1067, kcVisible, kcNoDummy, _T("Base octave D#")); - DefineKeyCommand(kcVPNoteE_0, 1068, kcVisible, kcNoDummy, _T("Base octave E")); - DefineKeyCommand(kcVPNoteF_0, 1069, kcVisible, kcNoDummy, _T("Base octave F")); - DefineKeyCommand(kcVPNoteFS0, 1070, kcVisible, kcNoDummy, _T("Base octave F#")); - DefineKeyCommand(kcVPNoteG_0, 1071, kcVisible, kcNoDummy, _T("Base octave G")); - DefineKeyCommand(kcVPNoteGS0, 1072, kcVisible, kcNoDummy, _T("Base octave G#")); - DefineKeyCommand(kcVPNoteA_1, 1073, kcVisible, kcNoDummy, _T("Base octave A")); - DefineKeyCommand(kcVPNoteAS1, 1074, kcVisible, kcNoDummy, _T("Base octave A#")); - DefineKeyCommand(kcVPNoteB_1, 1075, kcVisible, kcNoDummy, _T("Base octave B")); - DefineKeyCommand(kcVPNoteC_1, 1076, kcVisible, kcNoDummy, _T("Base octave +1 C")); - DefineKeyCommand(kcVPNoteCS1, 1077, kcVisible, kcNoDummy, _T("Base octave +1 C#")); - DefineKeyCommand(kcVPNoteD_1, 1078, kcVisible, kcNoDummy, _T("Base octave +1 D")); - DefineKeyCommand(kcVPNoteDS1, 1079, kcVisible, kcNoDummy, _T("Base octave +1 D#")); - DefineKeyCommand(kcVPNoteE_1, 1080, kcVisible, kcNoDummy, _T("Base octave +1 E")); - DefineKeyCommand(kcVPNoteF_1, 1081, kcVisible, kcNoDummy, _T("Base octave +1 F")); - DefineKeyCommand(kcVPNoteFS1, 1082, kcVisible, kcNoDummy, _T("Base octave +1 F#")); - DefineKeyCommand(kcVPNoteG_1, 1083, kcVisible, kcNoDummy, _T("Base octave +1 G")); - DefineKeyCommand(kcVPNoteGS1, 1084, kcVisible, kcNoDummy, _T("Base octave +1 G#")); - DefineKeyCommand(kcVPNoteA_2, 1085, kcVisible, kcNoDummy, _T("Base octave +1 A")); - DefineKeyCommand(kcVPNoteAS2, 1086, kcVisible, kcNoDummy, _T("Base octave +1 A#")); - DefineKeyCommand(kcVPNoteB_2, 1087, kcVisible, kcNoDummy, _T("Base octave +1 B")); - DefineKeyCommand(kcVPNoteC_2, 1088, kcVisible, kcNoDummy, _T("Base octave +2 C")); - DefineKeyCommand(kcVPNoteCS2, 1089, kcVisible, kcNoDummy, _T("Base octave +2 C#")); - DefineKeyCommand(kcVPNoteD_2, 1090, kcVisible, kcNoDummy, _T("Base octave +2 D")); - DefineKeyCommand(kcVPNoteDS2, 1091, kcVisible, kcNoDummy, _T("Base octave +2 D#")); - DefineKeyCommand(kcVPNoteE_2, 1092, kcVisible, kcNoDummy, _T("Base octave +2 E")); - DefineKeyCommand(kcVPNoteF_2, 1093, kcVisible, kcNoDummy, _T("Base octave +2 F")); - DefineKeyCommand(kcVPNoteFS2, 1094, kcVisible, kcNoDummy, _T("Base octave +2 F#")); - DefineKeyCommand(kcVPNoteG_2, 1095, kcVisible, kcNoDummy, _T("Base octave +2 G")); - DefineKeyCommand(kcVPNoteGS2, 1096, kcVisible, kcNoDummy, _T("Base octave +2 G#")); - DefineKeyCommand(kcVPNoteA_3, 1097, kcVisible, kcNoDummy, _T("Base octave +2 A")); - DefineKeyCommand(kcVPNoteStopC_0, 1098, kcHidden, kcNoDummy, _T("Stop base octave C")); - DefineKeyCommand(kcVPNoteStopCS0, 1099, kcHidden, kcNoDummy, _T("Stop base octave C#")); - DefineKeyCommand(kcVPNoteStopD_0, 1100, kcHidden, kcNoDummy, _T("Stop base octave D")); - DefineKeyCommand(kcVPNoteStopDS0, 1101, kcHidden, kcNoDummy, _T("Stop base octave D#")); - DefineKeyCommand(kcVPNoteStopE_0, 1102, kcHidden, kcNoDummy, _T("Stop base octave E")); - DefineKeyCommand(kcVPNoteStopF_0, 1103, kcHidden, kcNoDummy, _T("Stop base octave F")); - DefineKeyCommand(kcVPNoteStopFS0, 1104, kcHidden, kcNoDummy, _T("Stop base octave F#")); - DefineKeyCommand(kcVPNoteStopG_0, 1105, kcHidden, kcNoDummy, _T("Stop base octave G")); - DefineKeyCommand(kcVPNoteStopGS0, 1106, kcHidden, kcNoDummy, _T("Stop base octave G#")); - DefineKeyCommand(kcVPNoteStopA_1, 1107, kcHidden, kcNoDummy, _T("Stop base octave +1 A")); - DefineKeyCommand(kcVPNoteStopAS1, 1108, kcHidden, kcNoDummy, _T("Stop base octave +1 A#")); - DefineKeyCommand(kcVPNoteStopB_1, 1109, kcHidden, kcNoDummy, _T("Stop base octave +1 B")); - DefineKeyCommand(kcVPNoteStopC_1, 1110, kcHidden, kcNoDummy, _T("Stop base octave +1 C")); - DefineKeyCommand(kcVPNoteStopCS1, 1111, kcHidden, kcNoDummy, _T("Stop base octave +1 C#")); - DefineKeyCommand(kcVPNoteStopD_1, 1112, kcHidden, kcNoDummy, _T("Stop base octave +1 D")); - DefineKeyCommand(kcVPNoteStopDS1, 1113, kcHidden, kcNoDummy, _T("Stop base octave +1 D#")); - DefineKeyCommand(kcVPNoteStopE_1, 1114, kcHidden, kcNoDummy, _T("Stop base octave +1 E")); - DefineKeyCommand(kcVPNoteStopF_1, 1115, kcHidden, kcNoDummy, _T("Stop base octave +1 F")); - DefineKeyCommand(kcVPNoteStopFS1, 1116, kcHidden, kcNoDummy, _T("Stop base octave +1 F#")); - DefineKeyCommand(kcVPNoteStopG_1, 1117, kcHidden, kcNoDummy, _T("Stop base octave +1 G")); - DefineKeyCommand(kcVPNoteStopGS1, 1118, kcHidden, kcNoDummy, _T("Stop base octave +1 G#")); - DefineKeyCommand(kcVPNoteStopA_2, 1119, kcHidden, kcNoDummy, _T("Stop base octave +2 A")); - DefineKeyCommand(kcVPNoteStopAS2, 1120, kcHidden, kcNoDummy, _T("Stop base octave +2 A#")); - DefineKeyCommand(kcVPNoteStopB_2, 1121, kcHidden, kcNoDummy, _T("Stop base octave +2 B")); - DefineKeyCommand(kcVPNoteStopC_2, 1122, kcHidden, kcNoDummy, _T("Stop base octave +2 C")); - DefineKeyCommand(kcVPNoteStopCS2, 1123, kcHidden, kcNoDummy, _T("Stop base octave +2 C#")); - DefineKeyCommand(kcVPNoteStopD_2, 1124, kcHidden, kcNoDummy, _T("Stop base octave +2 D")); - DefineKeyCommand(kcVPNoteStopDS2, 1125, kcHidden, kcNoDummy, _T("Stop base octave +2 D#")); - DefineKeyCommand(kcVPNoteStopE_2, 1126, kcHidden, kcNoDummy, _T("Stop base octave +2 E")); - DefineKeyCommand(kcVPNoteStopF_2, 1127, kcHidden, kcNoDummy, _T("Stop base octave +2 F")); - DefineKeyCommand(kcVPNoteStopFS2, 1128, kcHidden, kcNoDummy, _T("Stop base octave +2 F#")); - DefineKeyCommand(kcVPNoteStopG_2, 1129, kcHidden, kcNoDummy, _T("Stop base octave +2 G")); - DefineKeyCommand(kcVPNoteStopGS2, 1130, kcHidden, kcNoDummy, _T("Stop base octave +2 G#")); - DefineKeyCommand(kcVPNoteStopA_3, 1131, kcHidden, kcNoDummy, _T("Stop base octave +3 A")); - DefineKeyCommand(kcVPChordC_0, 1132, kcHidden, kcNoDummy, _T("base octave chord C")); - DefineKeyCommand(kcVPChordCS0, 1133, kcHidden, kcNoDummy, _T("base octave chord C#")); - DefineKeyCommand(kcVPChordD_0, 1134, kcHidden, kcNoDummy, _T("base octave chord D")); - DefineKeyCommand(kcVPChordDS0, 1135, kcHidden, kcNoDummy, _T("base octave chord D#")); - DefineKeyCommand(kcVPChordE_0, 1136, kcHidden, kcNoDummy, _T("base octave chord E")); - DefineKeyCommand(kcVPChordF_0, 1137, kcHidden, kcNoDummy, _T("base octave chord F")); - DefineKeyCommand(kcVPChordFS0, 1138, kcHidden, kcNoDummy, _T("base octave chord F#")); - DefineKeyCommand(kcVPChordG_0, 1139, kcHidden, kcNoDummy, _T("base octave chord G")); - DefineKeyCommand(kcVPChordGS0, 1140, kcHidden, kcNoDummy, _T("base octave chord G#")); - DefineKeyCommand(kcVPChordA_1, 1141, kcHidden, kcNoDummy, _T("base octave +1 chord A")); - DefineKeyCommand(kcVPChordAS1, 1142, kcHidden, kcNoDummy, _T("base octave +1 chord A#")); - DefineKeyCommand(kcVPChordB_1, 1143, kcHidden, kcNoDummy, _T("base octave +1 chord B")); - DefineKeyCommand(kcVPChordC_1, 1144, kcHidden, kcNoDummy, _T("base octave +1 chord C")); - DefineKeyCommand(kcVPChordCS1, 1145, kcHidden, kcNoDummy, _T("base octave +1 chord C#")); - DefineKeyCommand(kcVPChordD_1, 1146, kcHidden, kcNoDummy, _T("base octave +1 chord D")); - DefineKeyCommand(kcVPChordDS1, 1147, kcHidden, kcNoDummy, _T("base octave +1 chord D#")); - DefineKeyCommand(kcVPChordE_1, 1148, kcHidden, kcNoDummy, _T("base octave +1 chord E")); - DefineKeyCommand(kcVPChordF_1, 1149, kcHidden, kcNoDummy, _T("base octave +1 chord F")); - DefineKeyCommand(kcVPChordFS1, 1150, kcHidden, kcNoDummy, _T("base octave +1 chord F#")); - DefineKeyCommand(kcVPChordG_1, 1151, kcHidden, kcNoDummy, _T("base octave +1 chord G")); - DefineKeyCommand(kcVPChordGS1, 1152, kcHidden, kcNoDummy, _T("base octave +1 chord G#")); - DefineKeyCommand(kcVPChordA_2, 1153, kcHidden, kcNoDummy, _T("base octave +2 chord A")); - DefineKeyCommand(kcVPChordAS2, 1154, kcHidden, kcNoDummy, _T("base octave +2 chord A#")); - DefineKeyCommand(kcVPChordB_2, 1155, kcHidden, kcNoDummy, _T("base octave +2 chord B")); - DefineKeyCommand(kcVPChordC_2, 1156, kcHidden, kcNoDummy, _T("base octave +2 chord C")); - DefineKeyCommand(kcVPChordCS2, 1157, kcHidden, kcNoDummy, _T("base octave +2 chord C#")); - DefineKeyCommand(kcVPChordD_2, 1158, kcHidden, kcNoDummy, _T("base octave +2 chord D")); - DefineKeyCommand(kcVPChordDS2, 1159, kcHidden, kcNoDummy, _T("base octave +2 chord D#")); - DefineKeyCommand(kcVPChordE_2, 1160, kcHidden, kcNoDummy, _T("base octave +2 chord E")); - DefineKeyCommand(kcVPChordF_2, 1161, kcHidden, kcNoDummy, _T("base octave +2 chord F")); - DefineKeyCommand(kcVPChordFS2, 1162, kcHidden, kcNoDummy, _T("base octave +2 chord F#")); - DefineKeyCommand(kcVPChordG_2, 1163, kcHidden, kcNoDummy, _T("base octave +2 chord G")); - DefineKeyCommand(kcVPChordGS2, 1164, kcHidden, kcNoDummy, _T("base octave +2 chord G#")); - DefineKeyCommand(kcVPChordA_3, 1165, kcHidden, kcNoDummy, _T("base octave chord +3 A")); - DefineKeyCommand(kcVPChordStopC_0, 1166, kcHidden, kcNoDummy, _T("Stop base octave chord C")); - DefineKeyCommand(kcVPChordStopCS0, 1167, kcHidden, kcNoDummy, _T("Stop base octave chord C#")); - DefineKeyCommand(kcVPChordStopD_0, 1168, kcHidden, kcNoDummy, _T("Stop base octave chord D")); - DefineKeyCommand(kcVPChordStopDS0, 1169, kcHidden, kcNoDummy, _T("Stop base octave chord D#")); - DefineKeyCommand(kcVPChordStopE_0, 1170, kcHidden, kcNoDummy, _T("Stop base octave chord E")); - DefineKeyCommand(kcVPChordStopF_0, 1171, kcHidden, kcNoDummy, _T("Stop base octave chord F")); - DefineKeyCommand(kcVPChordStopFS0, 1172, kcHidden, kcNoDummy, _T("Stop base octave chord F#")); - DefineKeyCommand(kcVPChordStopG_0, 1173, kcHidden, kcNoDummy, _T("Stop base octave chord G")); - DefineKeyCommand(kcVPChordStopGS0, 1174, kcHidden, kcNoDummy, _T("Stop base octave chord G#")); - DefineKeyCommand(kcVPChordStopA_1, 1175, kcHidden, kcNoDummy, _T("Stop base octave +1 chord A")); - DefineKeyCommand(kcVPChordStopAS1, 1176, kcHidden, kcNoDummy, _T("Stop base octave +1 chord A#")); - DefineKeyCommand(kcVPChordStopB_1, 1177, kcHidden, kcNoDummy, _T("Stop base octave +1 chord B")); - DefineKeyCommand(kcVPChordStopC_1, 1178, kcHidden, kcNoDummy, _T("Stop base octave +1 chord C")); - DefineKeyCommand(kcVPChordStopCS1, 1179, kcHidden, kcNoDummy, _T("Stop base octave +1 chord C#")); - DefineKeyCommand(kcVPChordStopD_1, 1180, kcHidden, kcNoDummy, _T("Stop base octave +1 chord D")); - DefineKeyCommand(kcVPChordStopDS1, 1181, kcHidden, kcNoDummy, _T("Stop base octave +1 chord D#")); - DefineKeyCommand(kcVPChordStopE_1, 1182, kcHidden, kcNoDummy, _T("Stop base octave +1 chord E")); - DefineKeyCommand(kcVPChordStopF_1, 1183, kcHidden, kcNoDummy, _T("Stop base octave +1 chord F")); - DefineKeyCommand(kcVPChordStopFS1, 1184, kcHidden, kcNoDummy, _T("Stop base octave +1 chord F#")); - DefineKeyCommand(kcVPChordStopG_1, 1185, kcHidden, kcNoDummy, _T("Stop base octave +1 chord G")); - DefineKeyCommand(kcVPChordStopGS1, 1186, kcHidden, kcNoDummy, _T("Stop base octave +1 chord G#")); - DefineKeyCommand(kcVPChordStopA_2, 1187, kcHidden, kcNoDummy, _T("Stop base octave +2 chord A")); - DefineKeyCommand(kcVPChordStopAS2, 1188, kcHidden, kcNoDummy, _T("Stop base octave +2 chord A#")); - DefineKeyCommand(kcVPChordStopB_2, 1189, kcHidden, kcNoDummy, _T("Stop base octave +2 chord B")); - DefineKeyCommand(kcVPChordStopC_2, 1190, kcHidden, kcNoDummy, _T("Stop base octave +2 chord C")); - DefineKeyCommand(kcVPChordStopCS2, 1191, kcHidden, kcNoDummy, _T("Stop base octave +2 chord C#")); - DefineKeyCommand(kcVPChordStopD_2, 1192, kcHidden, kcNoDummy, _T("Stop base octave +2 chord D")); - DefineKeyCommand(kcVPChordStopDS2, 1193, kcHidden, kcNoDummy, _T("Stop base octave +2 chord D#")); - DefineKeyCommand(kcVPChordStopE_2, 1194, kcHidden, kcNoDummy, _T("Stop base octave +2 chord E")); - DefineKeyCommand(kcVPChordStopF_2, 1195, kcHidden, kcNoDummy, _T("Stop base octave +2 chord F")); - DefineKeyCommand(kcVPChordStopFS2, 1196, kcHidden, kcNoDummy, _T("Stop base octave +2 chord F#")); - DefineKeyCommand(kcVPChordStopG_2, 1197, kcHidden, kcNoDummy, _T("Stop base octave +2 chord G")); - DefineKeyCommand(kcVPChordStopGS2, 1198, kcHidden, kcNoDummy, _T("Stop base octave +2 chord G#")); - DefineKeyCommand(kcVPChordStopA_3, 1199, kcHidden, kcNoDummy, _T("Stop base octave +3 chord A")); - DefineKeyCommand(kcNoteCut, 1200, kcVisible, kcNoDummy, _T("Note Cut")); - DefineKeyCommand(kcNoteOff, 1201, kcVisible, kcNoDummy, _T("Note Off")); - DefineKeyCommand(kcSetIns0, 1202, kcVisible, kcNoDummy, _T("Set instrument digit 0")); - DefineKeyCommand(kcSetIns1, 1203, kcVisible, kcNoDummy, _T("Set instrument digit 1")); - DefineKeyCommand(kcSetIns2, 1204, kcVisible, kcNoDummy, _T("Set instrument digit 2")); - DefineKeyCommand(kcSetIns3, 1205, kcVisible, kcNoDummy, _T("Set instrument digit 3")); - DefineKeyCommand(kcSetIns4, 1206, kcVisible, kcNoDummy, _T("Set instrument digit 4")); - DefineKeyCommand(kcSetIns5, 1207, kcVisible, kcNoDummy, _T("Set instrument digit 5")); - DefineKeyCommand(kcSetIns6, 1208, kcVisible, kcNoDummy, _T("Set instrument digit 6")); - DefineKeyCommand(kcSetIns7, 1209, kcVisible, kcNoDummy, _T("Set instrument digit 7")); - DefineKeyCommand(kcSetIns8, 1210, kcVisible, kcNoDummy, _T("Set instrument digit 8")); - DefineKeyCommand(kcSetIns9, 1211, kcVisible, kcNoDummy, _T("Set instrument digit 9")); - DefineKeyCommand(kcSetOctave0, 1212, kcVisible, kcNoDummy, _T("Set octave 0")); - DefineKeyCommand(kcSetOctave1, 1213, kcVisible, kcNoDummy, _T("Set octave 1")); - DefineKeyCommand(kcSetOctave2, 1214, kcVisible, kcNoDummy, _T("Set octave 2")); - DefineKeyCommand(kcSetOctave3, 1215, kcVisible, kcNoDummy, _T("Set octave 3")); - DefineKeyCommand(kcSetOctave4, 1216, kcVisible, kcNoDummy, _T("Set octave 4")); - DefineKeyCommand(kcSetOctave5, 1217, kcVisible, kcNoDummy, _T("Set octave 5")); - DefineKeyCommand(kcSetOctave6, 1218, kcVisible, kcNoDummy, _T("Set octave 6")); - DefineKeyCommand(kcSetOctave7, 1219, kcVisible, kcNoDummy, _T("Set octave 7")); - DefineKeyCommand(kcSetOctave8, 1220, kcVisible, kcNoDummy, _T("Set octave 8")); - DefineKeyCommand(kcSetOctave9, 1221, kcVisible, kcNoDummy, _T("Set octave 9")); - DefineKeyCommand(kcSetVolume0, 1222, kcVisible, kcNoDummy, _T("Set volume digit 0")); - DefineKeyCommand(kcSetVolume1, 1223, kcVisible, kcNoDummy, _T("Set volume digit 1")); - DefineKeyCommand(kcSetVolume2, 1224, kcVisible, kcNoDummy, _T("Set volume digit 2")); - DefineKeyCommand(kcSetVolume3, 1225, kcVisible, kcNoDummy, _T("Set volume digit 3")); - DefineKeyCommand(kcSetVolume4, 1226, kcVisible, kcNoDummy, _T("Set volume digit 4")); - DefineKeyCommand(kcSetVolume5, 1227, kcVisible, kcNoDummy, _T("Set volume digit 5")); - DefineKeyCommand(kcSetVolume6, 1228, kcVisible, kcNoDummy, _T("Set volume digit 6")); - DefineKeyCommand(kcSetVolume7, 1229, kcVisible, kcNoDummy, _T("Set volume digit 7")); - DefineKeyCommand(kcSetVolume8, 1230, kcVisible, kcNoDummy, _T("Set volume digit 8")); - DefineKeyCommand(kcSetVolume9, 1231, kcVisible, kcNoDummy, _T("Set volume digit 9")); - DefineKeyCommand(kcSetVolumeVol, 1232, kcVisible, kcNoDummy, _T("Vol command - volume")); - DefineKeyCommand(kcSetVolumePan, 1233, kcVisible, kcNoDummy, _T("Vol command - pan")); - DefineKeyCommand(kcSetVolumeVolSlideUp, 1234, kcVisible, kcNoDummy, _T("Vol command - vol slide up")); - DefineKeyCommand(kcSetVolumeVolSlideDown, 1235, kcVisible, kcNoDummy, _T("Vol command - vol slide down")); - DefineKeyCommand(kcSetVolumeFineVolUp, 1236, kcVisible, kcNoDummy, _T("Vol command - vol fine slide up")); - DefineKeyCommand(kcSetVolumeFineVolDown, 1237, kcVisible, kcNoDummy, _T("Vol command - vol fine slide down")); - DefineKeyCommand(kcSetVolumeVibratoSpd, 1238, kcVisible, kcNoDummy, _T("Vol command - vibrato speed")); - DefineKeyCommand(kcSetVolumeVibrato, 1239, kcVisible, kcNoDummy, _T("Vol command - vibrato")); - DefineKeyCommand(kcSetVolumeXMPanLeft, 1240, kcVisible, kcNoDummy, _T("Vol command - XM pan left")); - DefineKeyCommand(kcSetVolumeXMPanRight, 1241, kcVisible, kcNoDummy, _T("Vol command - XM pan right")); - DefineKeyCommand(kcSetVolumePortamento, 1242, kcVisible, kcNoDummy, _T("Vol command - Portamento")); - DefineKeyCommand(kcSetVolumeITPortaUp, 1243, kcVisible, kcNoDummy, _T("Vol command - Portamento Up")); - DefineKeyCommand(kcSetVolumeITPortaDown, 1244, kcVisible, kcNoDummy, _T("Vol command - Portamento Down")); - DefineKeyCommand(kcSetVolumeITUnused, 1245, kcHidden, kcNoDummy, _T("Vol command - Unused")); - DefineKeyCommand(kcSetVolumeITOffset, 1246, kcVisible, kcNoDummy, _T("Vol command - Offset")); - DefineKeyCommand(kcSetFXParam0, 1247, kcVisible, kcNoDummy, _T("FX Param digit 0")); - DefineKeyCommand(kcSetFXParam1, 1248, kcVisible, kcNoDummy, _T("FX Param digit 1")); - DefineKeyCommand(kcSetFXParam2, 1249, kcVisible, kcNoDummy, _T("FX Param digit 2")); - DefineKeyCommand(kcSetFXParam3, 1250, kcVisible, kcNoDummy, _T("FX Param digit 3")); - DefineKeyCommand(kcSetFXParam4, 1251, kcVisible, kcNoDummy, _T("FX Param digit 4")); - DefineKeyCommand(kcSetFXParam5, 1252, kcVisible, kcNoDummy, _T("FX Param digit 5")); - DefineKeyCommand(kcSetFXParam6, 1253, kcVisible, kcNoDummy, _T("FX Param digit 6")); - DefineKeyCommand(kcSetFXParam7, 1254, kcVisible, kcNoDummy, _T("FX Param digit 7")); - DefineKeyCommand(kcSetFXParam8, 1255, kcVisible, kcNoDummy, _T("FX Param digit 8")); - DefineKeyCommand(kcSetFXParam9, 1256, kcVisible, kcNoDummy, _T("FX Param digit 9")); - DefineKeyCommand(kcSetFXParamA, 1257, kcVisible, kcNoDummy, _T("FX Param digit A")); - DefineKeyCommand(kcSetFXParamB, 1258, kcVisible, kcNoDummy, _T("FX Param digit B")); - DefineKeyCommand(kcSetFXParamC, 1259, kcVisible, kcNoDummy, _T("FX Param digit C")); - DefineKeyCommand(kcSetFXParamD, 1260, kcVisible, kcNoDummy, _T("FX Param digit D")); - DefineKeyCommand(kcSetFXParamE, 1261, kcVisible, kcNoDummy, _T("FX Param digit E")); - DefineKeyCommand(kcSetFXParamF, 1262, kcVisible, kcNoDummy, _T("FX Param digit F")); - DefineKeyCommand(kcSetFXarp, 1263, kcHidden, kcNoDummy, _T("FX arpeggio")); - DefineKeyCommand(kcSetFXportUp, 1264, kcHidden, kcNoDummy, _T("FX portamentao Up")); - DefineKeyCommand(kcSetFXportDown, 1265, kcHidden, kcNoDummy, _T("FX portamentao Down")); - DefineKeyCommand(kcSetFXport, 1266, kcHidden, kcNoDummy, _T("FX portamentao")); - DefineKeyCommand(kcSetFXvibrato, 1267, kcHidden, kcNoDummy, _T("FX vibrato")); - DefineKeyCommand(kcSetFXportSlide, 1268, kcHidden, kcNoDummy, _T("FX portamento slide")); - DefineKeyCommand(kcSetFXvibSlide, 1269, kcHidden, kcNoDummy, _T("FX vibrato slide")); - DefineKeyCommand(kcSetFXtremolo, 1270, kcHidden, kcNoDummy, _T("FX tremolo")); - DefineKeyCommand(kcSetFXpan, 1271, kcHidden, kcNoDummy, _T("FX pan")); - DefineKeyCommand(kcSetFXoffset, 1272, kcHidden, kcNoDummy, _T("FX offset")); - DefineKeyCommand(kcSetFXvolSlide, 1273, kcHidden, kcNoDummy, _T("FX Volume slide")); - DefineKeyCommand(kcSetFXgotoOrd, 1274, kcHidden, kcNoDummy, _T("FX go to order")); - DefineKeyCommand(kcSetFXsetVol, 1275, kcHidden, kcNoDummy, _T("FX set volume")); - DefineKeyCommand(kcSetFXgotoRow, 1276, kcHidden, kcNoDummy, _T("FX go to row")); - DefineKeyCommand(kcSetFXretrig, 1277, kcHidden, kcNoDummy, _T("FX retrigger")); - DefineKeyCommand(kcSetFXspeed, 1278, kcHidden, kcNoDummy, _T("FX set speed")); - DefineKeyCommand(kcSetFXtempo, 1279, kcHidden, kcNoDummy, _T("FX set tempo")); - DefineKeyCommand(kcSetFXtremor, 1280, kcHidden, kcNoDummy, _T("FX tremor")); - DefineKeyCommand(kcSetFXextendedMOD, 1281, kcHidden, kcNoDummy, _T("FX extended MOD cmds")); - DefineKeyCommand(kcSetFXextendedS3M, 1282, kcHidden, kcNoDummy, _T("FX extended S3M cmds")); - DefineKeyCommand(kcSetFXchannelVol, 1283, kcHidden, kcNoDummy, _T("FX set channel vol")); - DefineKeyCommand(kcSetFXchannelVols, 1284, kcHidden, kcNoDummy, _T("FX channel vol slide")); - DefineKeyCommand(kcSetFXglobalVol, 1285, kcHidden, kcNoDummy, _T("FX set global volume")); - DefineKeyCommand(kcSetFXglobalVols, 1286, kcHidden, kcNoDummy, _T("FX global volume slide")); - DefineKeyCommand(kcSetFXkeyoff, 1287, kcHidden, kcNoDummy, _T("FX Some XM Command :D")); - DefineKeyCommand(kcSetFXfineVib, 1288, kcHidden, kcNoDummy, _T("FX fine vibrato")); - DefineKeyCommand(kcSetFXpanbrello, 1289, kcHidden, kcNoDummy, _T("FX set panbrello")); - DefineKeyCommand(kcSetFXextendedXM, 1290, kcHidden, kcNoDummy, _T("FX extended XM effects ")); - DefineKeyCommand(kcSetFXpanSlide, 1291, kcHidden, kcNoDummy, _T("FX pan slide")); - DefineKeyCommand(kcSetFXsetEnvPos, 1292, kcHidden, kcNoDummy, _T("FX set envelope position (XM only)")); - DefineKeyCommand(kcSetFXmacro, 1293, kcHidden, kcNoDummy, _T("FX midi macro")); - DefineKeyCommand(kcSetFXmacroSlide, 1294, kcVisible, kcNoDummy, _T("FX midi macro slide")); - DefineKeyCommand(kcSetFXdelaycut, 1295, kcVisible, kcNoDummy, _T("FX combined note delay and note cut")); - DefineKeyCommand(kcPatternJumpDownh1Select, 1296, kcHidden, kcNoDummy, _T("kcPatternJumpDownh1Select")); - DefineKeyCommand(kcPatternJumpUph1Select, 1297, kcHidden, kcNoDummy, _T("kcPatternJumpUph1Select")); - DefineKeyCommand(kcPatternSnapDownh1Select, 1298, kcHidden, kcNoDummy, _T("kcPatternSnapDownh1Select")); - DefineKeyCommand(kcPatternSnapUph1Select, 1299, kcHidden, kcNoDummy, _T("kcPatternSnapUph1Select")); - DefineKeyCommand(kcNavigateDownSelect, 1300, kcHidden, kcNoDummy, _T("kcNavigateDownSelect")); - DefineKeyCommand(kcNavigateUpSelect, 1301, kcHidden, kcNoDummy, _T("kcNavigateUpSelect")); - DefineKeyCommand(kcNavigateLeftSelect, 1302, kcHidden, kcNoDummy, _T("kcNavigateLeftSelect")); - DefineKeyCommand(kcNavigateRightSelect, 1303, kcHidden, kcNoDummy, _T("kcNavigateRightSelect")); - DefineKeyCommand(kcNavigateNextChanSelect, 1304, kcHidden, kcNoDummy, _T("kcNavigateNextChanSelect")); - DefineKeyCommand(kcNavigatePrevChanSelect, 1305, kcHidden, kcNoDummy, _T("kcNavigatePrevChanSelect")); - DefineKeyCommand(kcHomeHorizontalSelect, 1306, kcHidden, kcNoDummy, _T("kcHomeHorizontalSelect")); - DefineKeyCommand(kcHomeVerticalSelect, 1307, kcHidden, kcNoDummy, _T("kcHomeVerticalSelect")); - DefineKeyCommand(kcHomeAbsoluteSelect, 1308, kcHidden, kcNoDummy, _T("kcHomeAbsoluteSelect")); - DefineKeyCommand(kcEndHorizontalSelect, 1309, kcHidden, kcNoDummy, _T("kcEndHorizontalSelect")); - DefineKeyCommand(kcEndVerticalSelect, 1310, kcHidden, kcNoDummy, _T("kcEndVerticalSelect")); - DefineKeyCommand(kcEndAbsoluteSelect, 1311, kcHidden, kcNoDummy, _T("kcEndAbsoluteSelect")); - DefineKeyCommand(kcSelectWithNav, 1312, kcHidden, kcNoDummy, _T("kcSelectWithNav")); - DefineKeyCommand(kcSelectOffWithNav, 1313, kcHidden, kcNoDummy, _T("kcSelectOffWithNav")); - DefineKeyCommand(kcCopySelectWithNav, 1314, kcHidden, kcNoDummy, _T("kcCopySelectWithNav")); - DefineKeyCommand(kcCopySelectOffWithNav, 1315, kcHidden, kcNoDummy, _T("kcCopySelectOffWithNav")); - DefineKeyCommand(kcChordModifier, 1316, kcVisible, kcDummy, _T("Chord Modifier")); - DefineKeyCommand(kcSetSpacing, 1317, kcVisible, kcDummy, _T("Set row jump on note entry")); - DefineKeyCommand(kcSetSpacing0, 1318, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing1, 1319, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing2, 1320, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing3, 1321, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing4, 1322, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing5, 1323, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing6, 1324, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing7, 1325, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing8, 1326, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcSetSpacing9, 1327, kcHidden, kcNoDummy, _T("")); - DefineKeyCommand(kcCopySelectWithSelect, 1328, kcHidden, kcNoDummy, _T("kcCopySelectWithSelect")); - DefineKeyCommand(kcCopySelectOffWithSelect, 1329, kcHidden, kcNoDummy, _T("kcCopySelectOffWithSelect")); - DefineKeyCommand(kcSelectWithCopySelect, 1330, kcHidden, kcNoDummy, _T("kcSelectWithCopySelect")); - DefineKeyCommand(kcSelectOffWithCopySelect, 1331, kcHidden, kcNoDummy, _T("kcSelectOffWithCopySelect")); + DefineKeyCommand(kcPatternRecord, 1001, _T("Enable recording")); + DefineKeyCommand(kcPatternPlayRow, 1002, _T("Play row")); + DefineKeyCommand(kcCursorCopy, 1003, _T("Quick copy")); + DefineKeyCommand(kcCursorPaste, 1004, _T("Quick paste")); + DefineKeyCommand(kcChannelMute, 1005, _T("Mute current channel")); + DefineKeyCommand(kcChannelSolo, 1006, _T("Solo current channel")); + DefineKeyCommand(kcTransposeUp, 1007, _T("Transpose +1")); + DefineKeyCommand(kcTransposeDown, 1008, _T("Transpose -1")); + DefineKeyCommand(kcTransposeOctUp, 1009, _T("Transpose +12")); + DefineKeyCommand(kcTransposeOctDown, 1010, _T("Transpose -12")); + DefineKeyCommand(kcSelectColumn, 1011, _T("Select channel / Select all")); + DefineKeyCommand(kcPatternAmplify, 1012, _T("Amplify selection")); + DefineKeyCommand(kcPatternSetInstrument, 1013, _T("Apply current instrument")); + DefineKeyCommand(kcPatternInterpolateVol, 1014, _T("Interpolate volume")); + DefineKeyCommand(kcPatternInterpolateEffect, 1015, _T("Interpolate effect")); + DefineKeyCommand(kcPatternVisualizeEffect, 1016, _T("Open effect visualizer")); + DefineKeyCommand(kcPatternJumpDownh1, 1017, _T("Jump down by measure")); + DefineKeyCommand(kcPatternJumpUph1, 1018, _T("Jump up by measure")); + DefineKeyCommand(kcPatternSnapDownh1, 1019, _T("Snap down to measure")); + DefineKeyCommand(kcPatternSnapUph1, 1020, _T("Snap up to measure")); + DefineKeyCommand(kcViewGeneral, 1021, _T("View General")); + DefineKeyCommand(kcViewPattern, 1022, _T("View Pattern")); + DefineKeyCommand(kcViewSamples, 1023, _T("View Samples")); + DefineKeyCommand(kcViewInstruments, 1024, _T("View Instruments")); + DefineKeyCommand(kcViewComments, 1025, _T("View Comments")); + DefineKeyCommand(kcPlayPatternFromCursor, 1026, _T("Play pattern from cursor")); + DefineKeyCommand(kcPlayPatternFromStart, 1027, _T("Play pattern from start")); + DefineKeyCommand(kcPlaySongFromCursor, 1028, _T("Play song from cursor")); + DefineKeyCommand(kcPlaySongFromStart, 1029, _T("Play song from start")); + DefineKeyCommand(kcPlayPauseSong, 1030, _T("Play song/Pause song")); + DefineKeyCommand(kcPauseSong, 1031, _T("Pause song")); + DefineKeyCommand(kcPrevInstrument, 1032, _T("Previous instrument")); + DefineKeyCommand(kcNextInstrument, 1033, _T("Next instrument")); + DefineKeyCommand(kcPrevOrder, 1034, _T("Previous order")); + DefineKeyCommand(kcNextOrder, 1035, _T("Next order")); + DefineKeyCommand(kcPrevOctave, 1036, _T("Previous octave")); + DefineKeyCommand(kcNextOctave, 1037, _T("Next octave")); + DefineKeyCommand(kcNavigateDown, 1038, _T("Navigate down by 1 row")); + DefineKeyCommand(kcNavigateUp, 1039, _T("Navigate up by 1 row")); + DefineKeyCommand(kcNavigateLeft, 1040, _T("Navigate left")); + DefineKeyCommand(kcNavigateRight, 1041, _T("Navigate right")); + DefineKeyCommand(kcNavigateNextChan, 1042, _T("Navigate to next channel")); + DefineKeyCommand(kcNavigatePrevChan, 1043, _T("Navigate to previous channel")); + DefineKeyCommand(kcHomeHorizontal, 1044, _T("Go to first channel")); + DefineKeyCommand(kcHomeVertical, 1045, _T("Go to first row")); + DefineKeyCommand(kcHomeAbsolute, 1046, _T("Go to first row of first channel")); + DefineKeyCommand(kcEndHorizontal, 1047, _T("Go to last channel")); + DefineKeyCommand(kcEndVertical, 1048, _T("Go to last row")); + DefineKeyCommand(kcEndAbsolute, 1049, _T("Go to last row of last channel")); + DefineKeyCommand(kcSelect, 1050, _T("Selection key")); + DefineKeyCommand(kcCopySelect, 1051, _T("Copy select key")); + DefineKeyCommand(kcSelectOff, 1052, _T("Deselect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcCopySelectOff, 1053, _T("Copy deselect key"), kcHidden, kcNoDummy); + DefineKeyCommand(kcNextPattern, 1054, _T("Next pattern")); + DefineKeyCommand(kcPrevPattern, 1055, _T("Previous pattern")); + //DefineKeyCommand(kcClearSelection, 1056, _T("Wipe selection")); + DefineKeyCommand(kcClearRow, 1057, _T("Clear row")); + DefineKeyCommand(kcClearField, 1058, _T("Clear field")); + DefineKeyCommand(kcClearRowStep, 1059, _T("Clear row and step")); + DefineKeyCommand(kcClearFieldStep, 1060, _T("Clear field and step")); + DefineKeyCommand(kcDeleteRows, 1061, _T("Delete rows")); + DefineKeyCommand(kcShowNoteProperties, 1062, _T("Show note properties")); + DefineKeyCommand(kcShowEditMenu, 1063, _T("Show context (right-click) menu")); + DefineKeyCommand(kcVPNoteC_0, 1064, _T("Base octave C")); + DefineKeyCommand(kcVPNoteCS0, 1065, _T("Base octave C#")); + DefineKeyCommand(kcVPNoteD_0, 1066, _T("Base octave D")); + DefineKeyCommand(kcVPNoteDS0, 1067, _T("Base octave D#")); + DefineKeyCommand(kcVPNoteE_0, 1068, _T("Base octave E")); + DefineKeyCommand(kcVPNoteF_0, 1069, _T("Base octave F")); + DefineKeyCommand(kcVPNoteFS0, 1070, _T("Base octave F#")); + DefineKeyCommand(kcVPNoteG_0, 1071, _T("Base octave G")); + DefineKeyCommand(kcVPNoteGS0, 1072, _T("Base octave G#")); + DefineKeyCommand(kcVPNoteA_1, 1073, _T("Base octave A")); + DefineKeyCommand(kcVPNoteAS1, 1074, _T("Base octave A#")); + DefineKeyCommand(kcVPNoteB_1, 1075, _T("Base octave B")); + DefineKeyCommand(kcVPNoteC_1, 1076, _T("Base octave +1 C")); + DefineKeyCommand(kcVPNoteCS1, 1077, _T("Base octave +1 C#")); + DefineKeyCommand(kcVPNoteD_1, 1078, _T("Base octave +1 D")); + DefineKeyCommand(kcVPNoteDS1, 1079, _T("Base octave +1 D#")); + DefineKeyCommand(kcVPNoteE_1, 1080, _T("Base octave +1 E")); + DefineKeyCommand(kcVPNoteF_1, 1081, _T("Base octave +1 F")); + DefineKeyCommand(kcVPNoteFS1, 1082, _T("Base octave +1 F#")); + DefineKeyCommand(kcVPNoteG_1, 1083, _T("Base octave +1 G")); + DefineKeyCommand(kcVPNoteGS1, 1084, _T("Base octave +1 G#")); + DefineKeyCommand(kcVPNoteA_2, 1085, _T("Base octave +1 A")); + DefineKeyCommand(kcVPNoteAS2, 1086, _T("Base octave +1 A#")); + DefineKeyCommand(kcVPNoteB_2, 1087, _T("Base octave +1 B")); + DefineKeyCommand(kcVPNoteC_2, 1088, _T("Base octave +2 C")); + DefineKeyCommand(kcVPNoteCS2, 1089, _T("Base octave +2 C#")); + DefineKeyCommand(kcVPNoteD_2, 1090, _T("Base octave +2 D")); + DefineKeyCommand(kcVPNoteDS2, 1091, _T("Base octave +2 D#")); + DefineKeyCommand(kcVPNoteE_2, 1092, _T("Base octave +2 E")); + DefineKeyCommand(kcVPNoteF_2, 1093, _T("Base octave +2 F")); + DefineKeyCommand(kcVPNoteFS2, 1094, _T("Base octave +2 F#")); + DefineKeyCommand(kcVPNoteG_2, 1095, _T("Base octave +2 G")); + DefineKeyCommand(kcVPNoteGS2, 1096, _T("Base octave +2 G#")); + DefineKeyCommand(kcVPNoteA_3, 1097, _T("Base octave +2 A")); + DefineKeyCommand(kcVPNoteStopC_0, 1098, _T("Stop base octave C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopCS0, 1099, _T("Stop base octave C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopD_0, 1100, _T("Stop base octave D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopDS0, 1101, _T("Stop base octave D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopE_0, 1102, _T("Stop base octave E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopF_0, 1103, _T("Stop base octave F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopFS0, 1104, _T("Stop base octave F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopG_0, 1105, _T("Stop base octave G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopGS0, 1106, _T("Stop base octave G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopA_1, 1107, _T("Stop base octave +1 A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopAS1, 1108, _T("Stop base octave +1 A#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopB_1, 1109, _T("Stop base octave +1 B"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopC_1, 1110, _T("Stop base octave +1 C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopCS1, 1111, _T("Stop base octave +1 C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopD_1, 1112, _T("Stop base octave +1 D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopDS1, 1113, _T("Stop base octave +1 D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopE_1, 1114, _T("Stop base octave +1 E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopF_1, 1115, _T("Stop base octave +1 F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopFS1, 1116, _T("Stop base octave +1 F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopG_1, 1117, _T("Stop base octave +1 G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopGS1, 1118, _T("Stop base octave +1 G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopA_2, 1119, _T("Stop base octave +2 A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopAS2, 1120, _T("Stop base octave +2 A#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopB_2, 1121, _T("Stop base octave +2 B"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopC_2, 1122, _T("Stop base octave +2 C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopCS2, 1123, _T("Stop base octave +2 C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopD_2, 1124, _T("Stop base octave +2 D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopDS2, 1125, _T("Stop base octave +2 D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopE_2, 1126, _T("Stop base octave +2 E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopF_2, 1127, _T("Stop base octave +2 F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopFS2, 1128, _T("Stop base octave +2 F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopG_2, 1129, _T("Stop base octave +2 G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopGS2, 1130, _T("Stop base octave +2 G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPNoteStopA_3, 1131, _T("Stop base octave +3 A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordC_0, 1132, _T("base octave chord C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordCS0, 1133, _T("base octave chord C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordD_0, 1134, _T("base octave chord D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordDS0, 1135, _T("base octave chord D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordE_0, 1136, _T("base octave chord E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordF_0, 1137, _T("base octave chord F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordFS0, 1138, _T("base octave chord F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordG_0, 1139, _T("base octave chord G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordGS0, 1140, _T("base octave chord G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordA_1, 1141, _T("base octave +1 chord A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordAS1, 1142, _T("base octave +1 chord A#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordB_1, 1143, _T("base octave +1 chord B"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordC_1, 1144, _T("base octave +1 chord C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordCS1, 1145, _T("base octave +1 chord C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordD_1, 1146, _T("base octave +1 chord D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordDS1, 1147, _T("base octave +1 chord D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordE_1, 1148, _T("base octave +1 chord E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordF_1, 1149, _T("base octave +1 chord F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordFS1, 1150, _T("base octave +1 chord F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordG_1, 1151, _T("base octave +1 chord G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordGS1, 1152, _T("base octave +1 chord G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordA_2, 1153, _T("base octave +2 chord A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordAS2, 1154, _T("base octave +2 chord A#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordB_2, 1155, _T("base octave +2 chord B"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordC_2, 1156, _T("base octave +2 chord C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordCS2, 1157, _T("base octave +2 chord C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordD_2, 1158, _T("base octave +2 chord D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordDS2, 1159, _T("base octave +2 chord D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordE_2, 1160, _T("base octave +2 chord E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordF_2, 1161, _T("base octave +2 chord F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordFS2, 1162, _T("base octave +2 chord F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordG_2, 1163, _T("base octave +2 chord G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordGS2, 1164, _T("base octave +2 chord G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordA_3, 1165, _T("base octave chord +3 A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopC_0, 1166, _T("Stop base octave chord C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopCS0, 1167, _T("Stop base octave chord C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopD_0, 1168, _T("Stop base octave chord D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopDS0, 1169, _T("Stop base octave chord D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopE_0, 1170, _T("Stop base octave chord E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopF_0, 1171, _T("Stop base octave chord F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopFS0, 1172, _T("Stop base octave chord F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopG_0, 1173, _T("Stop base octave chord G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopGS0, 1174, _T("Stop base octave chord G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopA_1, 1175, _T("Stop base octave +1 chord A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopAS1, 1176, _T("Stop base octave +1 chord A#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopB_1, 1177, _T("Stop base octave +1 chord B"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopC_1, 1178, _T("Stop base octave +1 chord C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopCS1, 1179, _T("Stop base octave +1 chord C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopD_1, 1180, _T("Stop base octave +1 chord D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopDS1, 1181, _T("Stop base octave +1 chord D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopE_1, 1182, _T("Stop base octave +1 chord E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopF_1, 1183, _T("Stop base octave +1 chord F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopFS1, 1184, _T("Stop base octave +1 chord F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopG_1, 1185, _T("Stop base octave +1 chord G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopGS1, 1186, _T("Stop base octave +1 chord G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopA_2, 1187, _T("Stop base octave +2 chord A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopAS2, 1188, _T("Stop base octave +2 chord A#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopB_2, 1189, _T("Stop base octave +2 chord B"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopC_2, 1190, _T("Stop base octave +2 chord C"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopCS2, 1191, _T("Stop base octave +2 chord C#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopD_2, 1192, _T("Stop base octave +2 chord D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopDS2, 1193, _T("Stop base octave +2 chord D#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopE_2, 1194, _T("Stop base octave +2 chord E"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopF_2, 1195, _T("Stop base octave +2 chord F"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopFS2, 1196, _T("Stop base octave +2 chord F#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopG_2, 1197, _T("Stop base octave +2 chord G"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopGS2, 1198, _T("Stop base octave +2 chord G#"), kcHidden, kcNoDummy); + DefineKeyCommand(kcVPChordStopA_3, 1199, _T("Stop base octave +3 chord A"), kcHidden, kcNoDummy); + DefineKeyCommand(kcNoteCut, 1200, _T("Note Cut")); + DefineKeyCommand(kcNoteOff, 1201, _T("Note Off")); + DefineKeyCommand(kcSetIns0, 1202, _T("Set instrument digit 0")); + DefineKeyCommand(kcSetIns1, 1203, _T("Set instrument digit 1")); + DefineKeyCommand(kcSetIns2, 1204, _T("Set instrument digit 2")); + DefineKeyCommand(kcSetIns3, 1205, _T("Set instrument digit 3")); + DefineKeyCommand(kcSetIns4, 1206, _T("Set instrument digit 4")); + DefineKeyCommand(kcSetIns5, 1207, _T("Set instrument digit 5")); + DefineKeyCommand(kcSetIns6, 1208, _T("Set instrument digit 6")); + DefineKeyCommand(kcSetIns7, 1209, _T("Set instrument digit 7")); + DefineKeyCommand(kcSetIns8, 1210, _T("Set instrument digit 8")); + DefineKeyCommand(kcSetIns9, 1211, _T("Set instrument digit 9")); + DefineKeyCommand(kcSetOctave0, 1212, _T("Set octave 0")); + DefineKeyCommand(kcSetOctave1, 1213, _T("Set octave 1")); + DefineKeyCommand(kcSetOctave2, 1214, _T("Set octave 2")); + DefineKeyCommand(kcSetOctave3, 1215, _T("Set octave 3")); + DefineKeyCommand(kcSetOctave4, 1216, _T("Set octave 4")); + DefineKeyCommand(kcSetOctave5, 1217, _T("Set octave 5")); + DefineKeyCommand(kcSetOctave6, 1218, _T("Set octave 6")); + DefineKeyCommand(kcSetOctave7, 1219, _T("Set octave 7")); + DefineKeyCommand(kcSetOctave8, 1220, _T("Set octave 8")); + DefineKeyCommand(kcSetOctave9, 1221, _T("Set octave 9")); + DefineKeyCommand(kcSetVolume0, 1222, _T("Set volume digit 0")); + DefineKeyCommand(kcSetVolume1, 1223, _T("Set volume digit 1")); + DefineKeyCommand(kcSetVolume2, 1224, _T("Set volume digit 2")); + DefineKeyCommand(kcSetVolume3, 1225, _T("Set volume digit 3")); + DefineKeyCommand(kcSetVolume4, 1226, _T("Set volume digit 4")); + DefineKeyCommand(kcSetVolume5, 1227, _T("Set volume digit 5")); + DefineKeyCommand(kcSetVolume6, 1228, _T("Set volume digit 6")); + DefineKeyCommand(kcSetVolume7, 1229, _T("Set volume digit 7")); + DefineKeyCommand(kcSetVolume8, 1230, _T("Set volume digit 8")); + DefineKeyCommand(kcSetVolume9, 1231, _T("Set volume digit 9")); + DefineKeyCommand(kcSetVolumeVol, 1232, _T("Vol command - volume")); + DefineKeyCommand(kcSetVolumePan, 1233, _T("Vol command - pan")); + DefineKeyCommand(kcSetVolumeVolSlideUp, 1234, _T("Vol command - vol slide up")); + DefineKeyCommand(kcSetVolumeVolSlideDown, 1235, _T("Vol command - vol slide down")); + DefineKeyCommand(kcSetVolumeFineVolUp, 1236, _T("Vol command - vol fine slide up")); + DefineKeyCommand(kcSetVolumeFineVolDown, 1237, _T("Vol command - vol fine slide down")); + DefineKeyCommand(kcSetVolumeVibratoSpd, 1238, _T("Vol command - vibrato speed")); + DefineKeyCommand(kcSetVolumeVibrato, 1239, _T("Vol command - vibrato")); + DefineKeyCommand(kcSetVolumeXMPanLeft, 1240, _T("Vol command - XM pan left")); + DefineKeyCommand(kcSetVolumeXMPanRight, 1241, _T("Vol command - XM pan right")); + DefineKeyCommand(kcSetVolumePortamento, 1242, _T("Vol command - Portamento")); + DefineKeyCommand(kcSetVolumeITPortaUp, 1243, _T("Vol command - Portamento Up")); + DefineKeyCommand(kcSetVolumeITPortaDown, 1244, _T("Vol command - Portamento Down")); + DefineKeyCommand(kcSetVolumeITUnused, 1245, _T("Vol command - Unused"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetVolumeITOffset, 1246, _T("Vol command - Offset")); + DefineKeyCommand(kcSetFXParam0, 1247, _T("FX Param digit 0")); + DefineKeyCommand(kcSetFXParam1, 1248, _T("FX Param digit 1")); + DefineKeyCommand(kcSetFXParam2, 1249, _T("FX Param digit 2")); + DefineKeyCommand(kcSetFXParam3, 1250, _T("FX Param digit 3")); + DefineKeyCommand(kcSetFXParam4, 1251, _T("FX Param digit 4")); + DefineKeyCommand(kcSetFXParam5, 1252, _T("FX Param digit 5")); + DefineKeyCommand(kcSetFXParam6, 1253, _T("FX Param digit 6")); + DefineKeyCommand(kcSetFXParam7, 1254, _T("FX Param digit 7")); + DefineKeyCommand(kcSetFXParam8, 1255, _T("FX Param digit 8")); + DefineKeyCommand(kcSetFXParam9, 1256, _T("FX Param digit 9")); + DefineKeyCommand(kcSetFXParamA, 1257, _T("FX Param digit A")); + DefineKeyCommand(kcSetFXParamB, 1258, _T("FX Param digit B")); + DefineKeyCommand(kcSetFXParamC, 1259, _T("FX Param digit C")); + DefineKeyCommand(kcSetFXParamD, 1260, _T("FX Param digit D")); + DefineKeyCommand(kcSetFXParamE, 1261, _T("FX Param digit E")); + DefineKeyCommand(kcSetFXParamF, 1262, _T("FX Param digit F")); + DefineKeyCommand(kcSetFXarp, 1263, _T("FX arpeggio"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXportUp, 1264, _T("FX portamentao Up"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXportDown, 1265, _T("FX portamentao Down"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXport, 1266, _T("FX portamentao"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXvibrato, 1267, _T("FX vibrato"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXportSlide, 1268, _T("FX portamento slide"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXvibSlide, 1269, _T("FX vibrato slide"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXtremolo, 1270, _T("FX tremolo"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXpan, 1271, _T("FX pan"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXoffset, 1272, _T("FX offset"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXvolSlide, 1273, _T("FX Volume slide"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXgotoOrd, 1274, _T("FX go to order"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXsetVol, 1275, _T("FX set volume"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXgotoRow, 1276, _T("FX go to row"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXretrig, 1277, _T("FX retrigger"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXspeed, 1278, _T("FX set speed"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXtempo, 1279, _T("FX set tempo"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXtremor, 1280, _T("FX tremor"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXextendedMOD, 1281, _T("FX extended MOD cmds"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXextendedS3M, 1282, _T("FX extended S3M cmds"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXchannelVol, 1283, _T("FX set channel vol"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXchannelVols, 1284, _T("FX channel vol slide"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXglobalVol, 1285, _T("FX set global volume"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXglobalVols, 1286, _T("FX global volume slide"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXkeyoff, 1287, _T("FX Some XM Command :D"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXfineVib, 1288, _T("FX fine vibrato"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXpanbrello, 1289, _T("FX set panbrello"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXextendedXM, 1290, _T("FX extended XM effects "), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXpanSlide, 1291, _T("FX pan slide"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXsetEnvPos, 1292, _T("FX set envelope position (XM only)"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXmacro, 1293, _T("FX midi macro"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetFXmacroSlide, 1294, _T("FX midi macro slide")); + DefineKeyCommand(kcSetFXdelaycut, 1295, _T("FX combined note delay and note cut")); + DefineKeyCommand(kcPatternJumpDownh1Select, 1296, _T("kcPatternJumpDownh1Select"), kcHidden, kcNoDummy); + DefineKeyCommand(kcPatternJumpUph1Select, 1297, _T("kcPatternJumpUph1Select"), kcHidden, kcNoDummy); + DefineKeyCommand(kcPatternSnapDownh1Select, 1298, _T("kcPatternSnapDownh1Select"), kcHidden, kcNoDummy); + DefineKeyCommand(kcPatternSnapUph1Select, 1299, _T("kcPatternSnapUph1Select"), kcHidden, kcNoDummy); + DefineKeyCommand(kcNavigateDownSelect, 1300, _T("kcNavigateDownSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcNavigateUpSelect, 1301, _T("kcNavigateUpSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcNavigateLeftSelect, 1302, _T("kcNavigateLeftSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcNavigateRightSelect, 1303, _T("kcNavigateRightSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcNavigateNextChanSelect, 1304, _T("kcNavigateNextChanSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcNavigatePrevChanSelect, 1305, _T("kcNavigatePrevChanSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcHomeHorizontalSelect, 1306, _T("kcHomeHorizontalSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcHomeVerticalSelect, 1307, _T("kcHomeVerticalSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcHomeAbsoluteSelect, 1308, _T("kcHomeAbsoluteSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcEndHorizontalSelect, 1309, _T("kcEndHorizontalSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcEndVerticalSelect, 1310, _T("kcEndVerticalSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcEndAbsoluteSelect, 1311, _T("kcEndAbsoluteSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSelectWithNav, 1312, _T("kcSelectWithNav"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSelectOffWithNav, 1313, _T("kcSelectOffWithNav"), kcHidden, kcNoDummy); + DefineKeyCommand(kcCopySelectWithNav, 1314, _T("kcCopySelectWithNav"), kcHidden, kcNoDummy); + DefineKeyCommand(kcCopySelectOffWithNav, 1315, _T("kcCopySelectOffWithNav"), kcHidden, kcNoDummy); + DefineKeyCommand(kcChordModifier, 1316, _T("Chord Modifier"), kcVisible, kcDummy); + DefineKeyCommand(kcSetSpacing, 1317, _T("Set row jump on note entry"), kcVisible, kcDummy); + DefineKeyCommand(kcSetSpacing0, 1318, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing1, 1319, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing2, 1320, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing3, 1321, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing4, 1322, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing5, 1323, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing6, 1324, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing7, 1325, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing8, 1326, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcSetSpacing9, 1327, _T(""), kcHidden, kcNoDummy); + DefineKeyCommand(kcCopySelectWithSelect, 1328, _T("kcCopySelectWithSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcCopySelectOffWithSelect, 1329, _T("kcCopySelectOffWithSelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSelectWithCopySelect, 1330, _T("kcSelectWithCopySelect"), kcHidden, kcNoDummy); + DefineKeyCommand(kcSelectOffWithCopySelect, 1331, _T("kcSelectOffWithCopySelect"), kcHidden, kcNoDummy); /* - DefineKeyCommand(kcCopy, 1332, kcVisible, kcNoDummy, _T("Copy pattern data")); - DefineKeyCommand(kcCut, 1333, kcVisible, kcNoDummy, _T("Cut pattern data")); - DefineKeyCommand(kcPaste, 1334, kcVisible, kcNoDummy, _T("Paste pattern data")); - DefineKeyCommand(kcMixPaste, 1335, kcVisible, kcNoDummy, _T("Mix-paste pattern data")); - DefineKeyCommand(kcSelectAll, 1336, kcVisible, kcNoDummy, _T("Select all pattern data")); - DefineKeyCommand(kcSelectCol, 1337, kcHidden, kcNoDummy, _T("Select channel / select all")); + DefineKeyCommand(kcCopy, 1332, _T("Copy pattern data")); + DefineKeyCommand(kcCut, 1333, _T("Cut pattern data")); + DefineKeyCommand(kcPaste, 1334, _T("Paste pattern data")); + DefineKeyCommand(kcMixPaste, 1335, _T("Mix-paste pattern data")); + DefineKeyCommand(kcSelectAll, 1336, _T("Select all pattern data")); + DefineKeyCommand(kcSelectCol, 1337, _T("Select channel / select all"), kcHidden, kcNoDummy); */ - DefineKeyCommand(kcPatternJumpDownh2, 1338, kcVisible, kcNoDummy, _T("Jump down by beat")); - DefineKeyCommand(kcPatternJumpUph2, 1339, kcVisible, kcNoDummy, _T("Jump up by beat")); - DefineKeyCommand(kcPatternSnapDownh2, 1340, kcVisible, kcNoDummy, _T("Snap down to beat")); - DefineKeyCommand(kcPatternSnapUph2, 1341, kcVisible, kcNoDummy, _T("Snap up to beat")); - DefineKeyCommand(kcPatternJumpDownh2Select, 1342, kcHidden, kcNoDummy, _T("kcPatternJumpDownh2Select")); - DefineKeyCommand(kcPatternJumpUph2Select, 1343, kcHidden, kcNoDummy, _T("kcPatternJumpUph2Select")); - DefineKeyCommand(kcPatternSnapDownh2Select, 1344, kcHidden, kcNoDummy, _T("kcPatternSnapDownh2Select")); - DefineKeyCommand(kcPatternSnapUph2Select, 1345, kcHidden, kcNoDummy, _T("kcPatternSnapUph2Select")); - DefineKeyCommand(kcFileOpen, 1346, kcVisible, kcNoDummy, _T("File/Open")); - DefineKeyCommand(kcFileNew, 1347, kcVisible, kcNoDummy, _T("File/New")); - DefineKeyCommand(kcFileClose, 1348, kcVisible, kcNoDummy, _T("File/Close")); - DefineKeyCommand(kcFileSave, 1349, kcVisible, kcNoDummy, _T("File/Save")); - DefineKeyCommand(kcFileSaveAs, 1350, kcVisible, kcNoDummy, _T("File/Save As")); - DefineKeyCommand(kcFileSaveAsWave, 1351, kcVisible, kcNoDummy, _T("File/Export as Wave")); - DefineKeyCommand(kcFileSaveAsMP3, 1352, kcVisible, kcNoDummy, _T("File/Export as MP3")); - DefineKeyCommand(kcFileSaveMidi, 1353, kcVisible, kcNoDummy, _T("File/Export as MIDI")); - DefineKeyCommand(kcFileImportMidiLib, 1354, kcVisible, kcNoDummy, _T("File/Import Midi Lib")); - DefineKeyCommand(kcFileAddSoundBank, 1355, kcVisible, kcNoDummy, _T("File/Add Sound Bank")); - DefineKeyCommand(kc... [truncated message content] |
From: <sag...@us...> - 2011-08-09 14:45:45
|
Revision: 973 http://modplug.svn.sourceforge.net/modplug/?rev=973&view=rev Author: saga-games Date: 2011-08-09 14:45:39 +0000 (Tue, 09 Aug 2011) Log Message: ----------- [Fix] Instrument Editor: Aftertouch messages forwarded to plugins don't mark the module as modified anymore. [Mod] Resized close dialog a bit. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2011-08-09 14:22:45 UTC (rev 972) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2011-08-09 14:45:39 UTC (rev 973) @@ -2118,10 +2118,10 @@ switch(event) { - case 0x8: // Note Off + case MIDIEVENT_NOTEOFF: // Note Off midiByte2 = 0; - case 0x9: // Note On + case MIDIEVENT_NOTEON: // Note On pModDoc->NoteOff(nNote, FALSE, m_nInstrument); if (midiByte2 & 0x7F) { @@ -2130,15 +2130,16 @@ } break; - case 0xB: //Controller change + case MIDIEVENT_CONTROLLERCHANGE: //Controller change switch(midiByte1) { case 0x7: //Volume midivolume = midiByte2; break; } + default: - if(CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_MIDITOPLUG && CMainFrame::GetMainFrame()->GetModPlaying() == pModDoc) + if((CMainFrame::GetSettings().m_dwMidiSetup & MIDISETUP_MIDITOPLUG) && CMainFrame::GetMainFrame()->GetModPlaying() == pModDoc) { const INSTRUMENTINDEX instr = m_nInstrument; IMixPlugin* plug = pSndFile->GetInstrumentPlugin(instr); @@ -2146,9 +2147,11 @@ { plug->MidiSend(dwMidiData); // Sending midi may modify the plug. For now, if MIDI data - // is not active sensing, set modified. - if(dwMidiData != MIDISTATUS_ACTIVESENSING) + // is not active sensing or aftertouch messages, set modified. + if(dwMidiData != MIDISTATUS_ACTIVESENSING && event != MIDIEVENT_POLYAFTERTOUCH && event != MIDIEVENT_CHANAFTERTOUCH) + { CMainFrame::GetMainFrame()->ThreadSafeSetModified(pModDoc); + } } } break; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-08-09 14:22:45 UTC (rev 972) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-08-09 14:45:39 UTC (rev 973) @@ -209,15 +209,15 @@ END -IDD_CLOSEDOCUMENTS DIALOGEX 0, 0, 370, 233 +IDD_CLOSEDOCUMENTS DIALOGEX 0, 0, 370, 197 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Save modified files" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - DEFPUSHBUTTON "&OK",IDOK,300,174,66,14 - PUSHBUTTON "&Cancel",IDCANCEL,300,193,66,14 - LISTBOX IDC_LIST1,6,6,288,204,LBS_SORT | LBS_MULTIPLESEL | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - CONTROL "Show &full paths",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,216,252,12 + DEFPUSHBUTTON "&OK",IDOK,300,138,66,14 + PUSHBUTTON "&Cancel",IDCANCEL,300,157,66,14 + LISTBOX IDC_LIST1,6,6,288,168,LBS_SORT | LBS_MULTIPLESEL | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + CONTROL "Show &full paths",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,180,252,12 PUSHBUTTON "&Select none",IDC_BUTTON1,300,12,66,14 END @@ -315,7 +315,7 @@ LEFTMARGIN, 7 RIGHTMARGIN, 363 TOPMARGIN, 7 - BOTTOMMARGIN, 226 + BOTTOMMARGIN, 190 END END #endif // APSTUDIO_INVOKED This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-10 17:22:00
|
Revision: 974 http://modplug.svn.sourceforge.net/modplug/?rev=974&view=rev Author: saga-games Date: 2011-08-10 17:21:53 +0000 (Wed, 10 Aug 2011) Log Message: ----------- [New] Added option to select whole channel when double-clicking a pattern cell (tx ko0x) [Mod] OpenMPT: Version is now 1.20.00.07 Modified Paths: -------------- trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moptions.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2011-08-09 14:45:39 UTC (rev 973) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2011-08-10 17:21:53 UTC (rev 974) @@ -188,7 +188,7 @@ #define PATTERN_FOLLOWSONGOFF 0x80000 // follow song off by default #define PATTERN_MIDIRECORD 0x100000 // MIDI Record on by default #define PATTERN_NOCLOSEDIALOG 0x200000 // Don't use OpenMPT's custom close dialog with a list of saved files when closing the main window -//#define PATTERN_HILITETIMESIGS 0x400000 // highlight on song signature, deprecated (now always enabled) +#define PATTERN_DBLCLICKSELECT 0x400000 // Double-clicking pattern selects whole channel #define PATTERN_OLDCTXMENUSTYLE 0x800000 // mpt 1.16 pattern context menu style #define PATTERN_SYNCMUTE 0x1000000 // maintain sample sync on mute #define PATTERN_AUTODELAY 0x2000000 // automatically insert delay commands in pattern when entering notes Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2011-08-09 14:45:39 UTC (rev 973) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2011-08-10 17:21:53 UTC (rev 974) @@ -576,7 +576,7 @@ {PATTERN_CONTSCROLL, "Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"}, {PATTERN_KBDNOTEOFF, "Record note off", "Record note off when a key is released on the PC keyboard (Only works in instrument mode)."}, {PATTERN_FOLLOWSONGOFF, "Follow song off by default", "Ensure follow song is off when opening or starting a new song."}, - {PATTERN_MIDIRECORD, "Midi record", "Enable midi in record by default."}, + {PATTERN_MIDIRECORD, "MIDI record", "Enable MIDI in record by default."}, {PATTERN_OLDCTXMENUSTYLE, "Old style pattern context menu", "Check this option to hide unavailable items in the pattern editor context menu. Uncheck to grey-out unavailable items instead."}, {PATTERN_SYNCMUTE, "Maintain sample sync on mute", "Samples continue to be processed when channels are muted (like in IT2 and FT2)"}, {PATTERN_AUTODELAY, "Automatic delay commands", "Automatically insert appropriate note-delay commands when recording notes during live playback."}, @@ -585,6 +585,7 @@ {PATTERN_RESETCHANNELS, "Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands) and is recommended to be enabled."}, {PATTERN_LIVEUPDATETREE,"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a different icon in the treeview."}, {PATTERN_NOCLOSEDIALOG, "Disable modern close dialog", "When closing the main window, a confirmation window is shown for every unsaved document instead of one single window with a list of unsaved documents."}, + {PATTERN_DBLCLICKSELECT, "Double-click to select channel", "Instead of showing the note properties, double-clicking a pattern cell selects the whole channel."}, }; Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2011-08-09 14:45:39 UTC (rev 973) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2011-08-10 17:21:53 UTC (rev 974) @@ -252,6 +252,7 @@ RpcStringFree(&Str); } + // GUI Stuff gbMdiMaximize = CMainFrame::GetPrivateProfileLong("Display", "MDIMaximize", gbMdiMaximize, iniFile); glTreeWindowWidth = CMainFrame::GetPrivateProfileLong("Display", "MDITreeWidth", glTreeWindowWidth, iniFile); glTreeSplitRatio = CMainFrame::GetPrivateProfileLong("Display", "MDITreeRatio", glTreeSplitRatio, iniFile); @@ -359,8 +360,12 @@ m_dwPatternSetup |= PATTERN_RESETCHANNELS; if(vIniVersion < MAKE_VERSION_NUMERIC(1,19,00,07)) m_dwPatternSetup &= ~0x800; // this was previously deprecated and is now used for something else + if(vIniVersion < MAKE_VERSION_NUMERIC(1,20,00,04)) + m_dwPatternSetup &= ~0x200000; // dito + if(vIniVersion < MAKE_VERSION_NUMERIC(1,20,00,07)) + m_dwPatternSetup &= ~0x400000; // dito if(vIniVersion < MptVersion::num) - m_dwPatternSetup &= ~(0x200000|0x400000|0x10000000); // various deprecated old options + m_dwPatternSetup &= ~0x10000000; // various deprecated old options m_nRowHighlightMeasures = CMainFrame::GetPrivateProfileDWord("Pattern Editor", "RowSpacing", m_nRowHighlightMeasures, iniFile); m_nRowHighlightBeats = CMainFrame::GetPrivateProfileDWord("Pattern Editor", "RowSpacing2", m_nRowHighlightBeats, iniFile); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-08-09 14:45:39 UTC (rev 973) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-08-10 17:21:53 UTC (rev 974) @@ -1112,7 +1112,14 @@ DWORD dwPos = GetPositionFromPoint(point); if ((dwPos == (CreateCursor(m_nRow) | m_dwCursor)) && (point.y >= m_szHeader.cy)) { - if (ShowEditWindow()) return; + if((CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_DBLCLICKSELECT)) + { + OnSelectCurrentColumn(); + return; + } else + { + if (ShowEditWindow()) return; + } } OnLButtonDown(uFlags, point); } @@ -3247,7 +3254,7 @@ LRESULT CViewPattern::OnMidiMsg(WPARAM dwMidiDataParam, LPARAM) -//-------------------------------------------------------- +//------------------------------------------------------------- { const DWORD dwMidiData = dwMidiDataParam; static BYTE midivolume = 127; Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-08-09 14:45:39 UTC (rev 973) +++ trunk/OpenMPT/mptrack/version.h 2011-08-10 17:21:53 UTC (rev 974) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 06 +#define VER_MINORMINOR 07 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-16 23:44:56
|
Revision: 980 http://modplug.svn.sourceforge.net/modplug/?rev=980&view=rev Author: saga-games Date: 2011-08-16 23:44:49 +0000 (Tue, 16 Aug 2011) Log Message: ----------- [Fix] Tentative fix for multi-input plugins like Guitar Rig (fix by xaimus) [Mod] OpenMPT: Version is now 1.20.00.08 Modified Paths: -------------- trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2011-08-16 23:32:11 UTC (rev 979) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2011-08-16 23:44:49 UTC (rev 980) @@ -827,11 +827,11 @@ Log("VST plugin to host: Process Events\n"); break; // DEPRECATED in VST 2.4 - case audioMasterSetTime: + case audioMasterSetTime: Log("VST plugin to host: Set Time\n"); break; // returns tempo (in bpm * 10000) at sample frame location passed in <value> - DEPRECATED in VST 2.4 - case audioMasterTempoAt: + case audioMasterTempoAt: //Screw it! Let's just return the tempo at this point in time (might be a bit wrong). if (effect->resvd1) { @@ -844,17 +844,17 @@ return (VstInt32)(125 * 10000); } } - return 125*10000; + return 125 * 10000; // parameters - DEPRECATED in VST 2.4 - case audioMasterGetNumAutomatableParameters: + case audioMasterGetNumAutomatableParameters: Log("VST plugin to host: Get Num Automatable Parameters\n"); break; // Apparently, this one is broken in VST SDK anyway. - DEPRECATED in VST 2.4 - case audioMasterGetParameterQuantization: + case audioMasterGetParameterQuantization: Log("VST plugin to host: Audio Master Get Parameter Quantization\n"); break; // numInputs and/or numOutputs has changed - case audioMasterIOChanged: + case audioMasterIOChanged: Log("VST plugin to host: IOchanged\n"); break; // plug needs idle calls (outside its editor window) - DEPRECATED in VST 2.4 @@ -886,9 +886,9 @@ } Log("VST plugin to host: Size Window\n"); return 1; - case audioMasterGetSampleRate: + case audioMasterGetSampleRate: return CMainFrame::GetMainFrame()->GetSampleRate(); - case audioMasterGetBlockSize: + case audioMasterGetBlockSize: return MIXBUFFERSIZE; case audioMasterGetInputLatency: Log("VST plugin to host: Get Input Latency\n"); @@ -927,19 +927,19 @@ //Log("VST plugin to host: Get Automation State\n"); return kVstAutomationRead; - case audioMasterOfflineStart: + case audioMasterOfflineStart: Log("VST plugin to host: Offlinestart\n"); break; - case audioMasterOfflineRead: + case audioMasterOfflineRead: Log("VST plugin to host: Offlineread\n"); break; - case audioMasterOfflineWrite: + case audioMasterOfflineWrite: Log("VST plugin to host: Offlinewrite\n"); break; - case audioMasterOfflineGetCurrentPass: + case audioMasterOfflineGetCurrentPass: Log("VST plugin to host: OfflineGetcurrentpass\n"); break; - case audioMasterOfflineGetCurrentMetaPass: + case audioMasterOfflineGetCurrentMetaPass: Log("VST plugin to host: OfflineGetCurrentMetapass\n"); break; // for variable i/o, sample rate in <opt> - DEPRECATED in VST 2.4 @@ -950,12 +950,12 @@ case audioMasterGetOutputSpeakerArrangement: Log("VST plugin to host: Get Output Speaker Arrangement\n"); break; - case audioMasterGetVendorString: + case audioMasterGetVendorString: strcpy((char *) ptr, s_szHostVendorString); //strcpy((char*)ptr,"Steinberg"); //return 0; return true; - case audioMasterGetVendorVersion: + case audioMasterGetVendorVersion: return s_nHostVendorVersion; //return 7000; case audioMasterGetProductString: @@ -963,10 +963,10 @@ //strcpy((char*)ptr,"Cubase VST"); //return 0; return true; - case audioMasterVendorSpecific: + case audioMasterVendorSpecific: return 0; // void* in <ptr>, format not defined yet - DEPRECATED in VST 2.4 - case audioMasterSetIcon: + case audioMasterSetIcon: Log("VST plugin to host: Set Icon\n"); break; // string in ptr, see below @@ -994,14 +994,14 @@ else return HostCanNotDo; // - case audioMasterGetLanguage: + case audioMasterGetLanguage: return kVstLangEnglish; // returns platform specific ptr - DEPRECATED in VST 2.4 case audioMasterOpenWindow: Log("VST plugin to host: Open Window\n"); break; // close window, platform specific handle in <ptr> - DEPRECATED in VST 2.4 - case audioMasterCloseWindow: + case audioMasterCloseWindow: Log("VST plugin to host: Close Window\n"); break; // get plug directory, FSSpec on MAC, else char* @@ -1045,19 +1045,19 @@ return VstFileSelector(opcode == audioMasterCloseFileSelector, (VstFileSelect *)ptr, effect); // open an editor for audio (defined by XML text in ptr) - DEPRECATED in VST 2.4 - case audioMasterEditFile: + case audioMasterEditFile: Log("VST plugin to host: Edit File\n"); break; // get the native path of currently loading bank or project // (called from writeChunk) void* in <ptr> (char[2048], or sizeof(FSSpec)) - DEPRECATED in VST 2.4 - case audioMasterGetChunkFile: + case audioMasterGetChunkFile: Log("VST plugin to host: Get Chunk File\n"); break; //---from here VST 2.3 extension opcodes------------------------------------------------------ // result a VstSpeakerArrangement in ret - DEPRECATED in VST 2.4 - case audioMasterGetInputSpeakerArrangement: + case audioMasterGetInputSpeakerArrangement: Log("VST plugin to host: Get Input Speaker Arrangement\n"); break; @@ -1777,9 +1777,11 @@ m_MixState.nVolDecayL = 0; m_MixState.nVolDecayR = 0; m_MixState.pMixBuffer = (int *)((((DWORD)m_MixBuffer)+7)&~7); - m_MixState.pOutBufferL = (float *)((((DWORD)&m_FloatBuffer[0])+7)&~7); - m_MixState.pOutBufferR = (float *)((((DWORD)&m_FloatBuffer[MIXBUFFERSIZE])+7)&~7); - + m_MixState.pOutBufferL = (float *)((((DWORD)&m_FloatBuffer[0]) + 7) & ~7); + m_MixState.pOutBufferR = (float *)((((DWORD)&m_FloatBuffer[MIXBUFFERSIZE]) + 7) & ~7); + MemsetZero(dummyBuffer_); + + //rewbs.dryRatio: we now initialise this in CVstPlugin::Initialize(). //m_pTempBuffer = (float *)((((DWORD)&m_FloatBuffer[MIXBUFFERSIZE*2])+7)&~7); @@ -1905,6 +1907,11 @@ m_pInputs = (m_nInputs >= 2) ? new (float *[m_nInputs]) : new (float*[2]); m_pInputs[0] = m_MixState.pOutBufferL; m_pInputs[1] = m_MixState.pOutBufferR; + // Assign dummy inputs + for(size_t i = 2; i < m_nInputs; i++) + { + m_pInputs[i] = dummyBuffer_; + } m_pOutputs = new (float *[m_nOutputs]); m_pTempBuffer = new (float *[m_nOutputs]); //rewbs.dryRatio Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2011-08-16 23:32:11 UTC (rev 979) +++ trunk/OpenMPT/mptrack/Vstplug.h 2011-08-16 23:44:49 UTC (rev 980) @@ -82,8 +82,9 @@ float **m_pInputs; float **m_pOutputs; int m_nEditorX, m_nEditorY; - int m_MixBuffer[MIXBUFFERSIZE*2+2]; // Stereo interleaved + int m_MixBuffer[MIXBUFFERSIZE*2+2]; // Stereo interleaved float m_FloatBuffer[MIXBUFFERSIZE*(2+32)+34]; // 2ch separated + up to 32 VSTi outputs... + float dummyBuffer_[MIXBUFFERSIZE + 2]; // Other (unused) inputs VstMidiEvent m_ev_queue[VSTEVENT_QUEUE_LEN]; CModDoc* m_pModDoc; //rewbs.plugDocAware CSoundFile* m_pSndFile; //rewbs.plugDocAware Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-08-16 23:32:11 UTC (rev 979) +++ trunk/OpenMPT/mptrack/version.h 2011-08-16 23:44:49 UTC (rev 980) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 07 +#define VER_MINORMINOR 08 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-17 00:24:35
|
Revision: 979 http://modplug.svn.sourceforge.net/modplug/?rev=979&view=rev Author: saga-games Date: 2011-08-16 23:32:11 +0000 (Tue, 16 Aug 2011) Log Message: ----------- [Fix] Treeview works in VS2010 as well now (fix by xaimus). [Imp] Improved template file handling (not added to MRU anymore, so they don't need to be removed anymore as well, so the MRU list stays intact) Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/test/test.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-16 18:40:56 UTC (rev 978) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-16 23:32:11 UTC (rev 979) @@ -2182,7 +2182,7 @@ const bool bAvailable = Util::sdOs::IsPathFileAvailable(sPath, Util::sdOs::FileModeRead); if (bAvailable) { - CDocument* pDoc = theApp.OpenDocumentFile(sPath); + CDocument* pDoc = theApp.OpenDocumentFile(sPath, bTemplateFile ? FALSE : TRUE); if (pDoc != nullptr) { ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CModDoc)) == TRUE); @@ -2201,7 +2201,6 @@ pModDoc->GetFileHistory()->clear(); // Reset edit history for template files pModDoc->GetSoundFile()->m_dwCreatedWithVersion = MptVersion::num; pModDoc->GetSoundFile()->m_dwLastSavedWithVersion = 0; - theApp.RemoveMruItem(0); } } } Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-16 18:40:56 UTC (rev 978) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-16 23:32:11 UTC (rev 979) @@ -50,42 +50,45 @@ public: CModDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass): CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass) {} - virtual CDocument* OpenDocumentFile(LPCTSTR lpszPathName, BOOL bMakeVisible = TRUE); + virtual CDocument* OpenDocumentFile(LPCTSTR path, BOOL addToMru = TRUE, BOOL makeVisible = TRUE); + +private: + bool DocumentIsOpen(const char*, CDocument**); }; -CDocument *CModDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bMakeVisible) -//----------------------------------------------------------------------------------- +CDocument *CModDocTemplate::OpenDocumentFile(LPCTSTR path, BOOL addToMru, BOOL makeVisible) +//----------------------------------------------------------------------------------------- { - if (lpszPathName) + if (path) { TCHAR s[_MAX_EXT]; - _tsplitpath(lpszPathName, NULL, NULL, NULL, s); + _tsplitpath(path, NULL, NULL, NULL, s); if (!_tcsicmp(s, _TEXT(".dll"))) { CVstPluginManager *pPluginManager = theApp.GetPluginManager(); if (pPluginManager) { - pPluginManager->AddPlugin(lpszPathName); + pPluginManager->AddPlugin(path); return NULL; } } } - CDocument *pDoc = CMultiDocTemplate::OpenDocumentFile(lpszPathName, bMakeVisible); + CDocument *pDoc = CMultiDocTemplate::OpenDocumentFile(path, addToMru, makeVisible); if (pDoc) { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - if (pMainFrm) pMainFrm->OnDocumentCreated((CModDoc *)pDoc); + if (pMainFrm) pMainFrm->OnDocumentCreated(static_cast<CModDoc *>(pDoc)); } else //Case: pDoc == 0, opening document failed. { - if(lpszPathName != 0) + if(path != NULL) { - if(PathFileExists(lpszPathName) == FALSE) + if(PathFileExists(path) == FALSE) { CString str; - str.Format(GetStrI18N(_TEXT("Unable to open \"%s\": file does not exist.")), lpszPathName); + str.Format(GetStrI18N(_TEXT("Unable to open \"%s\": file does not exist.")), path); AfxMessageBox(str); } else //Case: Valid path but opening fails. @@ -97,7 +100,7 @@ "recognised. If the former is true, it's " "recommended to close some documents as otherwise crash is likely" "(currently there %s %d document%s open).")), - lpszPathName, (nOdc == 1) ? "is" : "are", nOdc, (nOdc == 1) ? "" : "s"); + path, (nOdc == 1) ? "is" : "are", nOdc, (nOdc == 1) ? "" : "s"); AfxMessageBox(str); } } Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-16 18:40:56 UTC (rev 978) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-16 23:32:11 UTC (rev 979) @@ -157,8 +157,7 @@ <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> <RandomizedBaseAddress>true</RandomizedBaseAddress> - <DataExecutionPrevention> - </DataExecutionPrevention> + <DataExecutionPrevention>true</DataExecutionPrevention> </Link> <Manifest> <AdditionalManifestFiles>$(ProjectDir)res/rt_manif.bin;%(AdditionalManifestFiles)</AdditionalManifestFiles> Modified: trunk/OpenMPT/mptrack/test/test.cpp =================================================================== --- trunk/OpenMPT/mptrack/test/test.cpp 2011-08-16 18:40:56 UTC (rev 978) +++ trunk/OpenMPT/mptrack/test/test.cpp 2011-08-16 23:32:11 UTC (rev 979) @@ -469,21 +469,20 @@ theFile.Append("test/test."); // Test file loading - CModDoc *pModDoc = (CModDoc *)theApp.OpenDocumentFile(theFile + "mptm"); + CModDoc *pModDoc = (CModDoc *)theApp.OpenDocumentFile(theFile + "mptm", FALSE); TestLoadFile(pModDoc); // Test file saving pModDoc->DoSave(theFile + "saved.mptm"); pModDoc->OnCloseDocument(); + // Saving the file puts it in the MRU list... + theApp.RemoveMruItem(0); + // Reload the saved file and test if everything is still working correctly. - pModDoc = (CModDoc *)theApp.OpenDocumentFile(theFile + "saved.mptm"); + pModDoc = (CModDoc *)theApp.OpenDocumentFile(theFile + "saved.mptm", FALSE); TestLoadFile(pModDoc); pModDoc->OnCloseDocument(); - - // Forget about the files we just loaded - theApp.RemoveMruItem(0); - theApp.RemoveMruItem(0); } double Rand01() {return rand() / double(RAND_MAX);} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-17 19:23:47
|
Revision: 982 http://modplug.svn.sourceforge.net/modplug/?rev=982&view=rev Author: saga-games Date: 2011-08-17 18:26:59 +0000 (Wed, 17 Aug 2011) Log Message: ----------- [Mod] Removed some overriden MFC function to get rid of failed assertions... Doesn't seem to change behaviour otherwise. This stuff might have been necessary on pre-VS2008, since I think that was the first version where I noticed the assertions when switching tabs using shortcuts. Modified Paths: -------------- trunk/OpenMPT/mptrack/Childfrm.cpp trunk/OpenMPT/mptrack/Childfrm.h Modified: trunk/OpenMPT/mptrack/Childfrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.cpp 2011-08-17 00:02:42 UTC (rev 981) +++ trunk/OpenMPT/mptrack/Childfrm.cpp 2011-08-17 18:26:59 UTC (rev 982) @@ -23,7 +23,7 @@ IMPLEMENT_DYNAMIC(CViewExSplitWnd, CSplitterWnd) -CWnd* CViewExSplitWnd::GetActivePane(int*, int*) // pRow, pCol +/*CWnd* CViewExSplitWnd::GetActivePane(int*, int*) // pRow, pCol //---------------------------------------------- { // attempt to use active view of frame window @@ -37,7 +37,7 @@ pView = GetFocus(); return pView; -} +}*/ @@ -93,11 +93,10 @@ BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) //----------------------------------------------------------------------------- { - // create a splitter with 1 row, 2 columns + // create a splitter with 2 rows, 1 column if (!m_wndSplitter.CreateStatic(this, 2, 1)) return FALSE; // add the first splitter pane - the default view in row 0 - //int cy = CMainFrame::glCtrlWindowHeight; int cy = CMainFrame::GetSettings().glGeneralWindowHeight; //rewbs.varWindowSize - default to general tab. if (cy <= 1) cy = (lpcs->cy*2) / 3; if (!m_wndSplitter.CreateView(0, 0, pContext->m_pNewViewClass, CSize(0, cy), pContext)) return FALSE; Modified: trunk/OpenMPT/mptrack/Childfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Childfrm.h 2011-08-17 00:02:42 UTC (rev 981) +++ trunk/OpenMPT/mptrack/Childfrm.h 2011-08-17 18:26:59 UTC (rev 982) @@ -70,7 +70,7 @@ public: CViewExSplitWnd() {} ~CViewExSplitWnd() {} - CWnd* GetActivePane(int* pRow = NULL, int* pCol = NULL); + //CWnd* GetActivePane(int* pRow = NULL, int* pCol = NULL); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-17 20:51:06
|
Revision: 983 http://modplug.svn.sourceforge.net/modplug/?rev=983&view=rev Author: saga-games Date: 2011-08-17 20:50:59 +0000 (Wed, 17 Aug 2011) Log Message: ----------- [Imp] Treeview isn't limited to 32 song items anymore. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2011-08-17 18:26:59 UTC (rev 982) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2011-08-17 20:50:59 UTC (rev 983) @@ -113,29 +113,27 @@ m_hDropWnd = NULL; m_hInsLib = m_hMidiLib = NULL; m_nDocNdx = m_nDragDocNdx = 0; - memset(m_tiMidiGrp, 0, sizeof(m_tiMidiGrp)); - memset(m_tiMidi, 0, sizeof(m_tiMidi)); - memset(m_tiPerc, 0, sizeof(m_tiPerc)); - memset(m_tiDLS, 0, sizeof(m_tiDLS)); - memset(&DocInfo, 0, sizeof(DocInfo)); + MemsetZero(m_tiMidiGrp); + MemsetZero(m_tiMidi); + MemsetZero(m_tiPerc); + MemsetZero(m_tiDLS); + DocInfo.clear(); } CModTree::~CModTree() //------------------- { - for (UINT i=0; i<MODTREE_MAX_DOCUMENTS; i++) + vector<PMODTREEDOCINFO>::iterator iter; + for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { - if (DocInfo[i]) - { - delete DocInfo[i]; - DocInfo[i] = NULL; - } + delete (*iter); } + DocInfo.clear(); } -VOID CModTree::Init() +void CModTree::Init() //------------------- { DWORD dwRemove = TVS_EDITLABELS|TVS_SINGLEEXPAND; @@ -224,7 +222,7 @@ } -VOID CModTree::InsLibGetFullPath(HTREEITEM hItem, LPSTR pszFullPath) const +void CModTree::InsLibGetFullPath(HTREEITEM hItem, LPSTR pszFullPath) const //------------------------------------------------------------------------ { strcpy(pszFullPath, m_szInstrLibPath); @@ -233,7 +231,7 @@ } -VOID CModTree::InsLibSetFullPath(LPCSTR pszLibPath, LPCSTR pszSongName) +void CModTree::InsLibSetFullPath(LPCSTR pszLibPath, LPCSTR pszSongName) //--------------------------------------------------------------------- { strcpy(m_szInstrLibPath, pszLibPath); @@ -263,7 +261,7 @@ } -VOID CModTree::OnOptionsChanged() +void CModTree::OnOptionsChanged() //------------------------------- { DWORD dwRemove = TVS_SINGLEEXPAND, dwAdd = 0; @@ -278,53 +276,49 @@ } -VOID CModTree::AddDocument(CModDoc *pModDoc) +void CModTree::AddDocument(CModDoc *pModDoc) //------------------------------------------ { - UINT nNewNdx = MODTREE_MAX_DOCUMENTS; // Check if document is already in the list - for (UINT i=0; i<MODTREE_MAX_DOCUMENTS; i++) + vector<PMODTREEDOCINFO>::iterator iter; + for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { - if (DocInfo[i]) + if ((*iter)->pModDoc == pModDoc) { - if (DocInfo[i]->pModDoc == pModDoc) return; // already in list - } else - { - if (nNewNdx >= MODTREE_MAX_DOCUMENTS) nNewNdx = i; + return; } } - if (nNewNdx < MODTREE_MAX_DOCUMENTS) + + PMODTREEDOCINFO pInfo = new MODTREEDOCINFO(pModDoc->GetSoundFile()); + pInfo->pModDoc = pModDoc; + pInfo->nSeqSel = SEQUENCEINDEX_INVALID; + pInfo->nOrdSel = ORDERINDEX_INVALID; + DocInfo.push_back(pInfo); + + UpdateView(pInfo, HINT_MODTYPE); + if (pInfo->hSong) { - PMODTREEDOCINFO pInfo = new MODTREEDOCINFO(pModDoc->GetSoundFile()); - if (pInfo) - { - pInfo->pModDoc = pModDoc; - pInfo->nSeqSel = SEQUENCEINDEX_INVALID; - pInfo->nOrdSel = ORDERINDEX_INVALID; - DocInfo[nNewNdx] = pInfo; - UpdateView(nNewNdx, HINT_MODTYPE); - if (pInfo->hSong) - { - Expand(pInfo->hSong, TVE_EXPAND); - EnsureVisible(pInfo->hSong); - SelectItem(pInfo->hSong); - } - } + Expand(pInfo->hSong, TVE_EXPAND); + EnsureVisible(pInfo->hSong); + SelectItem(pInfo->hSong); } } -VOID CModTree::RemoveDocument(CModDoc *pModDoc) +void CModTree::RemoveDocument(CModDoc *pModDoc) //--------------------------------------------- { - UINT nDocNdx = GetDocumentIDFromModDoc(pModDoc); - if(nDocNdx >= MODTREE_MAX_DOCUMENTS) return; - if (DocInfo[nDocNdx]->hSong) + vector<PMODTREEDOCINFO>::iterator iter; + for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { - DeleteItem(DocInfo[nDocNdx]->hSong); + if((*iter)->pModDoc == pModDoc) + { + DeleteItem((*iter)->hSong); + delete (*iter); + DocInfo.erase(iter); + return; + } } - delete DocInfo[nDocNdx]; - DocInfo[nDocNdx] = NULL; } @@ -339,34 +333,36 @@ } if (hItem != NULL) { - for (UINT iDoc=0; iDoc<MODTREE_MAX_DOCUMENTS; iDoc++) + vector<PMODTREEDOCINFO>::iterator iter; + for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { - PMODTREEDOCINFO p = DocInfo[iDoc]; - if ((p) && (hItem == p->hSong)) return p->pModDoc; + if (hItem == (*iter)->hSong) return (*iter)->pModDoc; } } return NULL; } -UINT CModTree::GetDocumentIDFromModDoc(CModDoc *pModDoc) -//------------------------------------------------------ +PMODTREEDOCINFO CModTree::GetDocumentInfoFromModDoc(CModDoc *pModDoc) +//------------------------------------------------------------------- { - // returns document ID (to access DocInfo[] info) - UINT nDocNdx = MODTREE_MAX_DOCUMENTS; - for (UINT i = 0; i < MODTREE_MAX_DOCUMENTS; i++) + // returns DocInfo[] information + vector<PMODTREEDOCINFO>::iterator iter; + for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { - if (DocInfo[i] && DocInfo[i]->pModDoc == pModDoc) - nDocNdx = i; + if ((*iter)->pModDoc == pModDoc) + { + return (*iter); + } } - return nDocNdx; + return nullptr; } ///////////////////////////////////////////////////////////////////////////// // CViewModTree drawing -VOID CModTree::RefreshMidiLibrary() +void CModTree::RefreshMidiLibrary() //--------------------------------- { CHAR s[256], stmp[256]; @@ -448,7 +444,7 @@ } -VOID CModTree::RefreshDlsBanks() +void CModTree::RefreshDlsBanks() //------------------------------ { CHAR s[256]; @@ -585,7 +581,7 @@ } -VOID CModTree::RefreshInstrumentLibrary() +void CModTree::RefreshInstrumentLibrary() //--------------------------------------- { SetRedraw(FALSE); @@ -600,16 +596,15 @@ } -VOID CModTree::UpdateView(UINT nDocNdx, DWORD lHint) -//-------------------------------------------------- +void CModTree::UpdateView(PMODTREEDOCINFO pInfo, DWORD lHint) +//---------------------------------------------------------- { - PMODTREEDOCINFO pInfo = DocInfo[nDocNdx]; CModDoc *pDoc; CSoundFile *pSndFile; CHAR s[256], stmp[256]; TV_ITEM tvi; const DWORD hintFlagPart = HintFlagPart(lHint); - if ((!pInfo) || (nDocNdx >= MODTREE_MAX_DOCUMENTS) || (!pInfo->pModDoc) || (!m_pDataTree)) return; + if ((pInfo == nullptr) || (pInfo->pModDoc == nullptr) || (!m_pDataTree)) return; if (!hintFlagPart) return; pDoc = pInfo->pModDoc; pSndFile = pDoc->GetSoundFile(); @@ -619,7 +614,7 @@ { _splitpath(pDoc->GetPathName(), NULL, NULL, s, NULL); if (!s[0]) strcpy(s, "untitled"); - memset(&tvi, 0, sizeof(tvi)); + MemsetZero(tvi); } if (!pInfo->hSong) { @@ -1072,62 +1067,62 @@ } if (!m_pDataTree) return 0; // Songs - for (UINT iSong=0; iSong<MODTREE_MAX_DOCUMENTS; iSong++) if (DocInfo[iSong]) + for (size_t i = 0; i < DocInfo.size(); i++) { - PMODTREEDOCINFO pSong = DocInfo[iSong]; - m_nDocNdx = iSong; - if (hItem == pSong->hSong) return MODITEM_HDR_SONG; - if (hRootParent == pSong->hSong) + m_nDocNdx = i; + PMODTREEDOCINFO pInfo = DocInfo[i]; + if (hItem == pInfo->hSong) return MODITEM_HDR_SONG; + if (hRootParent == pInfo->hSong) { - if (hItem == pSong->hPatterns) return MODITEM_HDR_PATTERNS; - if (hItem == pSong->hOrders) return MODITEM_HDR_ORDERS; - if (hItem == pSong->hSamples) return MODITEM_HDR_SAMPLES; - if (hItem == pSong->hInstruments) return MODITEM_HDR_INSTRUMENTS; - if (hItem == pSong->hComments) return MODITEM_COMMENTS; + if (hItem == pInfo->hPatterns) return MODITEM_HDR_PATTERNS; + if (hItem == pInfo->hOrders) return MODITEM_HDR_ORDERS; + if (hItem == pInfo->hSamples) return MODITEM_HDR_SAMPLES; + if (hItem == pInfo->hInstruments) return MODITEM_HDR_INSTRUMENTS; + if (hItem == pInfo->hComments) return MODITEM_COMMENTS; // Order List or Sequence item? - if ((hItemParent == pSong->hOrders) || (hItemParentParent == pSong->hOrders)) + if ((hItemParent == pInfo->hOrders) || (hItemParentParent == pInfo->hOrders)) { // find sequence this item belongs to - for(SEQUENCEINDEX nSeq = 0; nSeq < pSong->tiOrders.size(); nSeq++) + for(SEQUENCEINDEX nSeq = 0; nSeq < pInfo->tiOrders.size(); nSeq++) { - if(hItem == pSong->tiSequences[nSeq]) return (MODITEM_SEQUENCE | (nSeq << 16)); - for(ORDERINDEX nOrd = 0; nOrd < pSong->tiOrders[nSeq].size(); nOrd++) + if(hItem == pInfo->tiSequences[nSeq]) return (MODITEM_SEQUENCE | (nSeq << 16)); + for(ORDERINDEX nOrd = 0; nOrd < pInfo->tiOrders[nSeq].size(); nOrd++) { - if (hItem == pSong->tiOrders[nSeq][nOrd]) return (MODITEM_ORDER | (nOrd << 16) | (((uint64)nSeq) << 32)); + if (hItem == pInfo->tiOrders[nSeq][nOrd]) return (MODITEM_ORDER | (nOrd << 16) | (((uint64)nSeq) << 32)); } } } // Pattern ? - if (hItemParent == pSong->hPatterns && pSndFile) + if (hItemParent == pInfo->hPatterns && pSndFile) { - ASSERT(pSong->tiPatterns.size() == pSndFile->Patterns.Size()); - for (UINT i=0; i<pSong->tiPatterns.size(); i++) + ASSERT(pInfo->tiPatterns.size() == pSndFile->Patterns.Size()); + for (UINT i=0; i<pInfo->tiPatterns.size(); i++) { - if (hItem == pSong->tiPatterns[i]) return (MODITEM_PATTERN | (i << 16)); + if (hItem == pInfo->tiPatterns[i]) return (MODITEM_PATTERN | (i << 16)); } } // Sample ? - if (hItemParent == pSong->hSamples) + if (hItemParent == pInfo->hSamples) { for (UINT i=0; i<MAX_SAMPLES; i++) { - if (hItem == pSong->tiSamples[i]) return (MODITEM_SAMPLE | (i << 16)); + if (hItem == pInfo->tiSamples[i]) return (MODITEM_SAMPLE | (i << 16)); } } // Instrument ? - if (hItemParent == pSong->hInstruments) + if (hItemParent == pInfo->hInstruments) { for (UINT i=0; i<MAX_INSTRUMENTS; i++) { - if (hItem == pSong->tiInstruments[i]) return (MODITEM_INSTRUMENT | (i << 16)); + if (hItem == pInfo->tiInstruments[i]) return (MODITEM_INSTRUMENT | (i << 16)); } } // Effect ? - if (hItemParent == pSong->hEffects) + if (hItemParent == pInfo->hEffects) { for (UINT i=0; i<MAX_MIXPLUGINS; i++) { - if (hItem == pSong->tiEffects[i]) return (MODITEM_EFFECT | (i<<16)); + if (hItem == pInfo->tiEffects[i]) return (MODITEM_EFFECT | (i<<16)); } } return 0; @@ -1524,7 +1519,7 @@ // Empty Instrument Library -VOID CModTree::EmptyInstrumentLibrary() +void CModTree::EmptyInstrumentLibrary() //------------------------------------- { HTREEITEM h; @@ -1546,7 +1541,7 @@ // Refresh Instrument Library -VOID CModTree::FillInstrumentLibrary() +void CModTree::FillInstrumentLibrary() //------------------------------------ { TV_INSERTSTRUCT tvis; @@ -2061,6 +2056,7 @@ return true; } break; + case MODITEM_HDR_ORDERS: // Drop your sequences here. // At the moment, only dropping sequences into another module is possible. @@ -2107,8 +2103,11 @@ } return true; } + break; + case MODITEM_SAMPLE: break; + case MODITEM_INSTRUMENT: break; @@ -2133,19 +2132,19 @@ } -VOID CModTree::UpdatePlayPos(CModDoc *pModDoc, PMPTNOTIFICATION pNotify) +void CModTree::UpdatePlayPos(CModDoc *pModDoc, PMPTNOTIFICATION pNotify) //---------------------------------------------------------------------- { - UINT nDocNdx = GetDocumentIDFromModDoc(pModDoc); - if(nDocNdx >= MODTREE_MAX_DOCUMENTS) return; + PMODTREEDOCINFO pInfo = GetDocumentInfoFromModDoc(pModDoc); + if(pInfo == nullptr) return; ORDERINDEX nNewOrd = (pNotify) ? pNotify->nOrder : ORDERINDEX_INVALID; SEQUENCEINDEX nNewSeq = (pModDoc->GetSoundFile() != nullptr) ? pModDoc->GetSoundFile()->Order.GetCurrentSequenceIndex() : SEQUENCEINDEX_INVALID; - if (nNewOrd != DocInfo[nDocNdx]->nOrdSel || nNewSeq != DocInfo[nDocNdx]->nSeqSel) + if (nNewOrd != pInfo->nOrdSel || nNewSeq != pInfo->nSeqSel) { - DocInfo[nDocNdx]->nOrdSel = nNewOrd; - DocInfo[nDocNdx]->nSeqSel = nNewSeq; - UpdateView(nDocNdx, HINT_MODSEQUENCE); + pInfo->nOrdSel = nNewOrd; + pInfo->nSeqSel = nNewSeq; + UpdateView(pInfo, HINT_MODSEQUENCE); } // Update sample / instrument playing status icons (will only detect instruments with samples, though) @@ -2158,10 +2157,10 @@ nUpdateCount = 0;*/ // check whether the lists are actually visible (don't waste resources) - bool bUpdateSamples = IsItemExpanded(DocInfo[nDocNdx]->hSamples), bUpdateInstruments = IsItemExpanded(DocInfo[nDocNdx]->hInstruments); + bool bUpdateSamples = IsItemExpanded(pInfo->hSamples), bUpdateInstruments = IsItemExpanded(pInfo->hInstruments); - memset(DocInfo[nDocNdx]->bIsSamplePlaying, false, MAX_SAMPLES * sizeof(bool)); - memset(DocInfo[nDocNdx]->bIsInstrPlaying, false, MAX_INSTRUMENTS * sizeof(bool)); + memset(pInfo->bIsSamplePlaying, false, MAX_SAMPLES * sizeof(bool)); + memset(pInfo->bIsInstrPlaying, false, MAX_INSTRUMENTS * sizeof(bool)); if((bUpdateSamples == false) && (bUpdateInstruments == false)) return; @@ -2178,7 +2177,7 @@ { if(pSndFile->Chn[nChn].pModSample == &pSndFile->Samples[nSmp]) { - DocInfo[nDocNdx]->bIsSamplePlaying[nSmp - 1] = true; + pInfo->bIsSamplePlaying[nSmp - 1] = true; break; } } @@ -2189,7 +2188,7 @@ { if(pSndFile->Chn[nChn].pModInstrument == pSndFile->Instruments[nIns]) { - DocInfo[nDocNdx]->bIsInstrPlaying[nIns - 1] = true; + pInfo->bIsInstrPlaying[nIns - 1] = true; break; } } @@ -2198,7 +2197,7 @@ } // what should be updated? DWORD dwHintFlags = (bUpdateSamples ? HINT_SAMPLEINFO : 0) | (bUpdateInstruments ? HINT_INSTRUMENT : 0); - if(dwHintFlags != 0) UpdateView(nDocNdx, dwHintFlags); + if(dwHintFlags != 0) UpdateView(pInfo, dwHintFlags); } @@ -2213,11 +2212,12 @@ dwHint &= (HINT_PATNAMES|HINT_SMPNAMES|HINT_INSNAMES|HINT_MODTYPE|HINT_MODGENERAL|HINT_MODSEQUENCE|HINT_MIXPLUGINS|HINT_MPTOPTIONS|HINT_MASK_ITEM|HINT_SEQNAMES); if ((pHint != this) && (dwHint & HINT_MASK_FLAGS)) { - for (UINT i=0; i<MODTREE_MAX_DOCUMENTS; i++) + vector<PMODTREEDOCINFO>::iterator iter; + for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { - if ((DocInfo[i]) && ((DocInfo[i]->pModDoc == pModDoc) || (!pModDoc))) + if (((*iter)->pModDoc == pModDoc) || (!pModDoc)) { - UpdateView(i, dwHint); + UpdateView((*iter), dwHint); break; } } @@ -2787,12 +2787,10 @@ //---------------------------- { BeginWaitCursor(); - for (UINT i=0; i<MODTREE_MAX_DOCUMENTS; i++) + vector<PMODTREEDOCINFO>::iterator iter; + for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { - if (DocInfo[i]) - { - UpdateView(i, HINT_MODTYPE); - } + UpdateView((*iter), HINT_MODTYPE); } RefreshMidiLibrary(); RefreshDlsBanks(); @@ -2846,12 +2844,12 @@ if ((modItemType == MODITEM_SAMPLE) && (!pModDoc->GetNumInstruments())) { pModDoc->MuteSample((SAMPLEINDEX)modItemID, (pModDoc->IsSampleMuted((SAMPLEINDEX)modItemID)) ? false : true); - UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SMPNAMES | HINT_SAMPLEINFO); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SMPNAMES | HINT_SAMPLEINFO); } else if ((modItemType == MODITEM_INSTRUMENT) && (pModDoc->GetNumInstruments())) { pModDoc->MuteInstrument((INSTRUMENTINDEX)modItemID, (pModDoc->IsInstrumentMuted((INSTRUMENTINDEX)modItemID)) ? false : true); - UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_INSNAMES | HINT_INSTRUMENT); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_INSNAMES | HINT_INSTRUMENT); } else if ((modItemType == MODITEM_EFFECT)) { @@ -2891,7 +2889,7 @@ for (SAMPLEINDEX nSmp = 1; nSmp <= pModDoc->GetNumSamples(); nSmp++) { pModDoc->MuteSample(nSmp, (nSmp == modItemID) ? false : true); - UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SMPNAMES | HINT_SAMPLEINFO); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SMPNAMES | HINT_SAMPLEINFO); } } else if ((modItemType == MODITEM_INSTRUMENT) && (nInstruments)) @@ -2899,7 +2897,7 @@ for (INSTRUMENTINDEX nIns = 1; nIns <= nInstruments; nIns++) { pModDoc->MuteInstrument(nIns, (nIns == modItemID) ? false : true); - UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_INSNAMES | HINT_INSTRUMENT); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_INSNAMES | HINT_INSTRUMENT); } } } @@ -2924,12 +2922,12 @@ for (SAMPLEINDEX nSmp = 1; nSmp <= pModDoc->GetNumSamples(); nSmp++) { pModDoc->MuteSample(nSmp, false); - UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SMPNAMES | HINT_SAMPLEINFO); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SMPNAMES | HINT_SAMPLEINFO); } for (INSTRUMENTINDEX nIns = 1; nIns <= pModDoc->GetNumInstruments(); nIns++) { pModDoc->MuteInstrument(nIns, false); - UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_INSNAMES | HINT_INSTRUMENT); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_INSNAMES | HINT_INSTRUMENT); } } } @@ -2954,7 +2952,7 @@ pSndFile->Order.SetSequence((SEQUENCEINDEX)modItemID); pSndFile->Order.AddSequence(true); pModDoc->SetModified(); - UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE); pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE); } } @@ -2977,7 +2975,7 @@ { pSndFile->Order.AddSequence(false); pModDoc->SetModified(); - UpdateView(GetDocumentIDFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE); + UpdateView(GetDocumentInfoFromModDoc(pModDoc), HINT_SEQNAMES|HINT_MODSEQUENCE); pModDoc->UpdateAllViews(NULL, HINT_SEQNAMES|HINT_MODSEQUENCE); } } Modified: trunk/OpenMPT/mptrack/View_tre.h =================================================================== --- trunk/OpenMPT/mptrack/View_tre.h 2011-08-17 18:26:59 UTC (rev 982) +++ trunk/OpenMPT/mptrack/View_tre.h 2011-08-17 20:50:59 UTC (rev 983) @@ -124,7 +124,7 @@ HTREEITEM m_tiDLS[MAX_DLS_BANKS]; HTREEITEM m_tiMidi[128]; HTREEITEM m_tiPerc[128]; - PMODTREEDOCINFO DocInfo[MODTREE_MAX_DOCUMENTS]; + vector<PMODTREEDOCINFO> DocInfo; CHAR m_szInstrLibPath[_MAX_PATH], m_szOldPath[_MAX_PATH], m_szSongName[_MAX_PATH]; public: @@ -133,14 +133,14 @@ // Attributes public: - VOID Init(); - VOID InsLibSetFullPath(LPCSTR pszLibPath, LPCSTR pszSongFolder); - VOID InsLibGetFullPath(HTREEITEM hItem, LPSTR pszFullPath) const; - VOID RefreshMidiLibrary(); - VOID RefreshDlsBanks(); - VOID RefreshInstrumentLibrary(); - VOID EmptyInstrumentLibrary(); - VOID FillInstrumentLibrary(); + void Init(); + void InsLibSetFullPath(LPCSTR pszLibPath, LPCSTR pszSongFolder); + void InsLibGetFullPath(HTREEITEM hItem, LPSTR pszFullPath) const; + void RefreshMidiLibrary(); + void RefreshDlsBanks(); + void RefreshInstrumentLibrary(); + void EmptyInstrumentLibrary(); + void FillInstrumentLibrary(); uint64 GetModItem(HTREEITEM hItem); inline uint32 GetModItemType(const uint64 modItem) {return static_cast<uint32>(modItem & 0xFFFF);}; // return "item type" part of mod item variable ( & 0xFFFF ) inline uint32 GetModItemID(const uint64 modItem) {return static_cast<uint32>(modItem >> 16);}; // return "item ID" part of mod item variable ( >> 16 ) @@ -153,13 +153,13 @@ BOOL OpenMidiInstrument(DWORD dwItem); BOOL InstrumentLibraryChDir(LPCSTR lpszDir); BOOL GetDropInfo(LPDRAGONDROP pdropinfo, LPSTR lpszPath); - VOID OnOptionsChanged(); - VOID AddDocument(CModDoc *pModDoc); - VOID RemoveDocument(CModDoc *pModDoc); - VOID UpdateView(UINT nDocNdx, DWORD dwHint); - VOID OnUpdate(CModDoc *pModDoc, DWORD dwHint, CObject *pHint); + void OnOptionsChanged(); + void AddDocument(CModDoc *pModDoc); + void RemoveDocument(CModDoc *pModDoc); + void UpdateView(PMODTREEDOCINFO pInfo, DWORD dwHint); + void OnUpdate(CModDoc *pModDoc, DWORD dwHint, CObject *pHint); bool CanDrop(HTREEITEM hItem, bool bDoDrop); - VOID UpdatePlayPos(CModDoc *pModDoc, PMPTNOTIFICATION pNotify); + void UpdatePlayPos(CModDoc *pModDoc, PMPTNOTIFICATION pNotify); bool IsItemExpanded(HTREEITEM hItem); // Overrides @@ -180,7 +180,7 @@ static int CALLBACK ModTreeDrumCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); void ModTreeBuildTVIParam(TV_INSERTSTRUCT &tvis, LPCSTR lpszName, int iImage); CModDoc *GetDocumentFromItem(HTREEITEM hItem); - UINT GetDocumentIDFromModDoc(CModDoc *pModDoc); + PMODTREEDOCINFO GetDocumentInfoFromModDoc(CModDoc *pModDoc); // Generated message map functions protected: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rel...@us...> - 2011-08-19 19:57:48
|
Revision: 986 http://modplug.svn.sourceforge.net/modplug/?rev=986&view=rev Author: relabsoluness Date: 2011-08-19 19:57:42 +0000 (Fri, 19 Aug 2011) Log Message: ----------- [Fix] Internal: Build fix for VC2008 (broken in r979). Modified Paths: -------------- trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-19 19:03:11 UTC (rev 985) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-19 19:57:42 UTC (rev 986) @@ -49,11 +49,19 @@ public: CModDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass): CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass) {} - virtual CDocument* OpenDocumentFile(LPCTSTR path, BOOL addToMru = TRUE, BOOL makeVisible = TRUE); + + #if (_MSC_VER < MSVC_VER_2010) + virtual CDocument* OpenDocumentFile(LPCTSTR path, BOOL makeVisible = TRUE); + #else + virtual CDocument* OpenDocumentFile(LPCTSTR path, BOOL addToMru = TRUE, BOOL makeVisible = TRUE); + #endif }; - -CDocument *CModDocTemplate::OpenDocumentFile(LPCTSTR path, BOOL addToMru, BOOL makeVisible) +#if (_MSC_VER < MSVC_VER_2010) + CDocument *CModDocTemplate::OpenDocumentFile(LPCTSTR path, BOOL makeVisible) +#else + CDocument *CModDocTemplate::OpenDocumentFile(LPCTSTR path, BOOL addToMru, BOOL makeVisible) +#endif //----------------------------------------------------------------------------------------- { if (path) @@ -71,7 +79,11 @@ } } - CDocument *pDoc = CMultiDocTemplate::OpenDocumentFile(path, addToMru, makeVisible); + #if (_MSC_VER < MSVC_VER_2010) + CDocument *pDoc = CMultiDocTemplate::OpenDocumentFile(path, makeVisible); + #else + CDocument *pDoc = CMultiDocTemplate::OpenDocumentFile(path, addToMru, makeVisible); + #endif if (pDoc) { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2011-08-19 19:03:11 UTC (rev 985) +++ trunk/OpenMPT/mptrack/Mptrack.h 2011-08-19 19:57:42 UTC (rev 986) @@ -127,6 +127,17 @@ static MEMORYSTATUS gMemStatus; static CDLSBank *gpDLSBanks[MAX_DLS_BANKS]; +#if (_MSC_VER < MSVC_VER_2010) + virtual CDocument* OpenDocumentFile(LPCTSTR lpszFileName, BOOL bAddToMRU = TRUE) + { + CDocument* pDoc = CWinApp::OpenDocumentFile(lpszFileName); + if (pDoc && bAddToMRU != TRUE) + RemoveMruItem(0); // This doesn't result to the same behaviour as not adding to MRU + // (if the new item got added, it might have already dropped the last item out) + return pDoc; + } +#endif + protected: CMultiDocTemplate *m_pModTemplate; CVstPluginManager *m_pPluginManager; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-21 10:58:39
|
Revision: 987 http://modplug.svn.sourceforge.net/modplug/?rev=987&view=rev Author: saga-games Date: 2011-08-21 10:58:32 +0000 (Sun, 21 Aug 2011) Log Message: ----------- [Fix] Fixed some crashes in the new treeview code. [Mod] OpenMPT: Version is now 1.20.00.09 Modified Paths: -------------- trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2011-08-19 19:57:42 UTC (rev 986) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2011-08-21 10:58:32 UTC (rev 987) @@ -1924,8 +1924,8 @@ BOOL CModTree::GetDropInfo(LPDRAGONDROP pdropinfo, LPSTR pszFullPath) //------------------------------------------------------------------- { - PMODTREEDOCINFO pInfo = DocInfo[m_nDragDocNdx]; - pdropinfo->pModDoc = (pInfo) ? pInfo->pModDoc : NULL; + PMODTREEDOCINFO pInfo = (m_nDragDocNdx < DocInfo.size() ? DocInfo[m_nDragDocNdx] : nullptr); + pdropinfo->pModDoc = (pInfo) ? pInfo->pModDoc : nullptr; pdropinfo->dwDropType = DRAGONDROP_NOTHING; pdropinfo->dwDropItem = GetModItemID(m_qwItemDrag); pdropinfo->lDropParam = 0; @@ -1957,14 +1957,14 @@ if (m_szSongName[0]) { CHAR s[32]; - lstrcpyn(s, GetItemText(m_hItemDrag), sizeof(s)); + lstrcpyn(s, GetItemText(m_hItemDrag), CountOf(s)); UINT n = 0; if (s[0] >= '0') n += (s[0] - '0'); if ((s[1] >= '0') && (s[1] <= '9')) n = n*10 + (s[1] - '0'); if ((s[2] >= '0') && (s[2] <= '9')) n = n*10 + (s[2] - '0'); pdropinfo->dwDropType = ((m_qwItemDrag & 0xFFFF) == MODITEM_INSLIB_SAMPLE) ? DRAGONDROP_SAMPLE : DRAGONDROP_INSTRUMENT; pdropinfo->dwDropItem = n; - pdropinfo->pModDoc = NULL; + pdropinfo->pModDoc = nullptr; pdropinfo->lDropParam = (LPARAM)&m_SongFile; } else { @@ -2022,8 +2022,8 @@ const uint32 modItemDragType = GetModItemType(m_qwItemDrag); const uint32 modItemDragID = GetModItemID(m_qwItemDrag); - const PMODTREEDOCINFO pInfoDrag = DocInfo[m_nDragDocNdx]; - const PMODTREEDOCINFO pInfoDrop = DocInfo[m_nDocNdx]; + const PMODTREEDOCINFO pInfoDrag = (m_nDragDocNdx < DocInfo.size() ? DocInfo[m_nDragDocNdx] : nullptr); + const PMODTREEDOCINFO pInfoDrop = (m_nDocNdx < DocInfo.size() ? DocInfo[m_nDocNdx] : nullptr); CModDoc *pModDoc = (pInfoDrop) ? pInfoDrop->pModDoc : nullptr; CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; @@ -2062,7 +2062,7 @@ // At the moment, only dropping sequences into another module is possible. if((modItemDragType == MODITEM_SEQUENCE || modItemDragType == MODITEM_HDR_ORDERS) && pSndFile && pInfoDrag && pModDoc != pInfoDrag->pModDoc) { - if(bDoDrop) + if(bDoDrop && pInfoDrag != nullptr) { // copy mod sequence over. CModDoc *pDragDoc = pInfoDrag->pModDoc; Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-08-19 19:57:42 UTC (rev 986) +++ trunk/OpenMPT/mptrack/version.h 2011-08-21 10:58:32 UTC (rev 987) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 08 +#define VER_MINORMINOR 09 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-21 11:37:59
|
Revision: 988 http://modplug.svn.sourceforge.net/modplug/?rev=988&view=rev Author: saga-games Date: 2011-08-21 11:37:52 +0000 (Sun, 21 Aug 2011) Log Message: ----------- [Fix] More treeview crashes fixed Modified Paths: -------------- trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2011-08-21 10:58:32 UTC (rev 987) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2011-08-21 11:37:52 UTC (rev 988) @@ -124,7 +124,7 @@ CModTree::~CModTree() //------------------- { - vector<PMODTREEDOCINFO>::iterator iter; + vector<ModTreeDocInfo *>::iterator iter; for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { delete (*iter); @@ -280,7 +280,7 @@ //------------------------------------------ { // Check if document is already in the list - vector<PMODTREEDOCINFO>::iterator iter; + vector<ModTreeDocInfo *>::iterator iter; for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { if ((*iter)->pModDoc == pModDoc) @@ -289,7 +289,7 @@ } } - PMODTREEDOCINFO pInfo = new MODTREEDOCINFO(pModDoc->GetSoundFile()); + ModTreeDocInfo *pInfo = new ModTreeDocInfo(pModDoc->GetSoundFile()); pInfo->pModDoc = pModDoc; pInfo->nSeqSel = SEQUENCEINDEX_INVALID; pInfo->nOrdSel = ORDERINDEX_INVALID; @@ -308,7 +308,7 @@ void CModTree::RemoveDocument(CModDoc *pModDoc) //--------------------------------------------- { - vector<PMODTREEDOCINFO>::iterator iter; + vector<ModTreeDocInfo *>::iterator iter; for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { if((*iter)->pModDoc == pModDoc) @@ -322,6 +322,7 @@ } +// Get CModDoc that is associated with a tree item CModDoc *CModTree::GetDocumentFromItem(HTREEITEM hItem) //----------------------------------------------------- { @@ -333,7 +334,7 @@ } if (hItem != NULL) { - vector<PMODTREEDOCINFO>::iterator iter; + vector<ModTreeDocInfo *>::iterator iter; for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { if (hItem == (*iter)->hSong) return (*iter)->pModDoc; @@ -343,11 +344,11 @@ } -PMODTREEDOCINFO CModTree::GetDocumentInfoFromModDoc(CModDoc *pModDoc) +// Get modtree doc information for a given CModDoc +ModTreeDocInfo *CModTree::GetDocumentInfoFromModDoc(CModDoc *pModDoc) //------------------------------------------------------------------- { - // returns DocInfo[] information - vector<PMODTREEDOCINFO>::iterator iter; + vector<ModTreeDocInfo *>::iterator iter; for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { if ((*iter)->pModDoc == pModDoc) @@ -596,7 +597,7 @@ } -void CModTree::UpdateView(PMODTREEDOCINFO pInfo, DWORD lHint) +void CModTree::UpdateView(ModTreeDocInfo *pInfo, DWORD lHint) //---------------------------------------------------------- { CModDoc *pDoc; @@ -1070,7 +1071,7 @@ for (size_t i = 0; i < DocInfo.size(); i++) { m_nDocNdx = i; - PMODTREEDOCINFO pInfo = DocInfo[i]; + ModTreeDocInfo *pInfo = DocInfo[i]; if (hItem == pInfo->hSong) return MODITEM_HDR_SONG; if (hRootParent == pInfo->hSong) { @@ -1156,7 +1157,7 @@ const uint64 modItem = GetModItem(hItem); const uint32 modItemType = GetModItemType(modItem); uint32 modItemID = GetModItemID(modItem); - PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx]; + ModTreeDocInfo *pInfo = (m_nDocNdx < DocInfo.size() ? DocInfo[m_nDocNdx] : nullptr); CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL; switch(modItemType) { @@ -1225,7 +1226,7 @@ const uint64 modItem = GetModItem(hItem); const uint32 modItemType = GetModItemType(modItem); uint32 modItemID = GetModItemID(modItem); - PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx]; + ModTreeDocInfo *pInfo = (m_nDocNdx < DocInfo.size() ? DocInfo[m_nDocNdx] : nullptr); CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL; switch(modItemType) { @@ -1390,7 +1391,7 @@ const uint32 modItemID = GetModItemID(modItem); TCHAR s[64]; - PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx]; + ModTreeDocInfo *pInfo = (m_nDocNdx < DocInfo.size() ? DocInfo[m_nDocNdx] : nullptr); CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : nullptr; CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; switch(modItemType) @@ -1924,7 +1925,7 @@ BOOL CModTree::GetDropInfo(LPDRAGONDROP pdropinfo, LPSTR pszFullPath) //------------------------------------------------------------------- { - PMODTREEDOCINFO pInfo = (m_nDragDocNdx < DocInfo.size() ? DocInfo[m_nDragDocNdx] : nullptr); + ModTreeDocInfo *pInfo = (m_nDragDocNdx < DocInfo.size() ? DocInfo[m_nDragDocNdx] : nullptr); pdropinfo->pModDoc = (pInfo) ? pInfo->pModDoc : nullptr; pdropinfo->dwDropType = DRAGONDROP_NOTHING; pdropinfo->dwDropItem = GetModItemID(m_qwItemDrag); @@ -2022,8 +2023,8 @@ const uint32 modItemDragType = GetModItemType(m_qwItemDrag); const uint32 modItemDragID = GetModItemID(m_qwItemDrag); - const PMODTREEDOCINFO pInfoDrag = (m_nDragDocNdx < DocInfo.size() ? DocInfo[m_nDragDocNdx] : nullptr); - const PMODTREEDOCINFO pInfoDrop = (m_nDocNdx < DocInfo.size() ? DocInfo[m_nDocNdx] : nullptr); + const ModTreeDocInfo *pInfoDrag = (m_nDragDocNdx < DocInfo.size() ? DocInfo[m_nDragDocNdx] : nullptr); + const ModTreeDocInfo *pInfoDrop = (m_nDocNdx < DocInfo.size() ? DocInfo[m_nDocNdx] : nullptr); CModDoc *pModDoc = (pInfoDrop) ? pInfoDrop->pModDoc : nullptr; CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; @@ -2135,7 +2136,7 @@ void CModTree::UpdatePlayPos(CModDoc *pModDoc, PMPTNOTIFICATION pNotify) //---------------------------------------------------------------------- { - PMODTREEDOCINFO pInfo = GetDocumentInfoFromModDoc(pModDoc); + ModTreeDocInfo *pInfo = GetDocumentInfoFromModDoc(pModDoc); if(pInfo == nullptr) return; ORDERINDEX nNewOrd = (pNotify) ? pNotify->nOrder : ORDERINDEX_INVALID; @@ -2212,7 +2213,7 @@ dwHint &= (HINT_PATNAMES|HINT_SMPNAMES|HINT_INSNAMES|HINT_MODTYPE|HINT_MODGENERAL|HINT_MODSEQUENCE|HINT_MIXPLUGINS|HINT_MPTOPTIONS|HINT_MASK_ITEM|HINT_SEQNAMES); if ((pHint != this) && (dwHint & HINT_MASK_FLAGS)) { - vector<PMODTREEDOCINFO>::iterator iter; + vector<ModTreeDocInfo *>::iterator iter; for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { if (((*iter)->pModDoc == pModDoc) || (!pModDoc)) @@ -2269,7 +2270,7 @@ case MODITEM_HDR_ORDERS: // can we drag an order header? (only in MPTM format and if there's only one sequence) { - CModDoc *pModDoc = DocInfo[m_nDragDocNdx]->pModDoc; + CModDoc *pModDoc = (m_nDragDocNdx < DocInfo.size() ? DocInfo[m_nDragDocNdx]->pModDoc : nullptr); CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; if(pSndFile && pSndFile->Order.GetNumSequences() == 1) bDrag = true; @@ -2787,7 +2788,7 @@ //---------------------------- { BeginWaitCursor(); - vector<PMODTREEDOCINFO>::iterator iter; + vector<ModTreeDocInfo *>::iterator iter; for (iter = DocInfo.begin(); iter != DocInfo.end(); iter++) { UpdateView((*iter), HINT_MODTYPE); Modified: trunk/OpenMPT/mptrack/View_tre.h =================================================================== --- trunk/OpenMPT/mptrack/View_tre.h 2011-08-21 10:58:32 UTC (rev 987) +++ trunk/OpenMPT/mptrack/View_tre.h 2011-08-21 11:37:52 UTC (rev 988) @@ -42,7 +42,7 @@ #define MODTREE_MAX_DOCUMENTS 32 -struct MODTREEDOCINFO +struct ModTreeDocInfo { CModDoc *pModDoc; // Module information @@ -59,7 +59,7 @@ bool bIsSamplePlaying[MAX_SAMPLES]; bool bIsInstrPlaying[MAX_INSTRUMENTS]; - MODTREEDOCINFO(const CSoundFile* const pSndFile) + ModTreeDocInfo(const CSoundFile* const pSndFile) { pModDoc = NULL; nSeqSel = SEQUENCEINDEX_INVALID; @@ -83,10 +83,7 @@ } }; -typedef MODTREEDOCINFO _MODTREEDOCINFO; -typedef MODTREEDOCINFO* PMODTREEDOCINFO; - //============================================= class CModTreeDropTarget: public COleDropTarget //============================================= @@ -124,7 +121,7 @@ HTREEITEM m_tiDLS[MAX_DLS_BANKS]; HTREEITEM m_tiMidi[128]; HTREEITEM m_tiPerc[128]; - vector<PMODTREEDOCINFO> DocInfo; + vector<ModTreeDocInfo *> DocInfo; CHAR m_szInstrLibPath[_MAX_PATH], m_szOldPath[_MAX_PATH], m_szSongName[_MAX_PATH]; public: @@ -156,7 +153,7 @@ void OnOptionsChanged(); void AddDocument(CModDoc *pModDoc); void RemoveDocument(CModDoc *pModDoc); - void UpdateView(PMODTREEDOCINFO pInfo, DWORD dwHint); + void UpdateView(ModTreeDocInfo *pInfo, DWORD dwHint); void OnUpdate(CModDoc *pModDoc, DWORD dwHint, CObject *pHint); bool CanDrop(HTREEITEM hItem, bool bDoDrop); void UpdatePlayPos(CModDoc *pModDoc, PMPTNOTIFICATION pNotify); @@ -180,7 +177,7 @@ static int CALLBACK ModTreeDrumCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); void ModTreeBuildTVIParam(TV_INSERTSTRUCT &tvis, LPCSTR lpszName, int iImage); CModDoc *GetDocumentFromItem(HTREEITEM hItem); - PMODTREEDOCINFO GetDocumentInfoFromModDoc(CModDoc *pModDoc); + ModTreeDocInfo *GetDocumentInfoFromModDoc(CModDoc *pModDoc); // Generated message map functions protected: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-21 21:21:55
|
Revision: 989 http://modplug.svn.sourceforge.net/modplug/?rev=989&view=rev Author: saga-games Date: 2011-08-21 21:21:48 +0000 (Sun, 21 Aug 2011) Log Message: ----------- [Imp] OpenMPT tries to close the audio driver and rescue unsaved work if an unhandled exception is encountered. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-21 11:37:52 UTC (rev 988) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-21 21:21:48 UTC (rev 989) @@ -679,9 +679,11 @@ CMainFrame *pMainFrm = (CMainFrame *)theApp.m_pMainWnd; if (gbStopSent) return FALSE; BEGIN_CRITICAL(); - if ((pMainFrm) && (pMainFrm->IsPlaying()) && (CMainFrame::gpSoundDevice)) { + if ((pMainFrm) && (pMainFrm->IsPlaying()) && (CMainFrame::gpSoundDevice)) + { bOk = CMainFrame::gpSoundDevice->FillAudioBuffer(&gMPTSoundSource, gdwPlayLatency, dwUser); - }/* else { + }/* else + { CMainFrame::gpSoundDevice->SilenceAudioBuffer(&gMPTSoundSource, gdwPlayLatency, dwUser); }*/ if (!bOk) @@ -694,18 +696,6 @@ } -void Terminate_AudioThread() -//---------------------------------------------- -{ - //TODO: Why does this not get called. - AfxMessageBox("Audio thread terminated unexpectedly. Attempting to shut down audio device"); - CMainFrame* pMainFrame = CMainFrame::GetMainFrame(); - if (pMainFrame->gpSoundDevice) pMainFrame->gpSoundDevice->Reset(); - pMainFrame->audioCloseDevice(); - exit(-1); -} - - // Audio thread DWORD WINAPI CMainFrame::AudioThread(LPVOID) //------------------------------------------ @@ -714,7 +704,9 @@ BOOL bWait; UINT nSleep; - set_terminate(Terminate_AudioThread); +#ifdef WIN32 + ::SetUnhandledExceptionFilter(CTrackApp::UnhandledExceptionFilter); +#endif // WIN32 // -> CODE#0021 // -> DESC="use multimedia timer instead of Sleep() in audio thread" Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-21 11:37:52 UTC (rev 988) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-21 21:21:48 UTC (rev 989) @@ -1,3 +1,4 @@ +MB_ICONERROR // mptrack.cpp : Defines the class behaviors for the application. // @@ -587,6 +588,12 @@ #if (_MSC_VER >= 1400) _CrtSetDebugFillThreshold(0); // Disable buffer filling in secure enhanced CRT functions. #endif + + +#ifdef WIN32 + ::SetUnhandledExceptionFilter(UnhandledExceptionFilter); +#endif // WIN32 + m_pModTemplate = NULL; m_pPluginManager = NULL; m_bInitialized = FALSE; @@ -2967,6 +2974,54 @@ } +#ifdef WIN32 +// Try to close the audio device and rescue unsaved work if an unhandled exception occours... +LONG CTrackApp::UnhandledExceptionFilter(_EXCEPTION_POINTERS *) +//------------------------------------------------------------- +{ + CMainFrame* pMainFrame = CMainFrame::GetMainFrame(); + if(pMainFrame) + { + if(pMainFrame->gpSoundDevice) pMainFrame->gpSoundDevice->Reset(); + pMainFrame->audioCloseDevice(); + } + + // Rescue modified files... + CDocTemplate *pDocTmpl = theApp.GetModDocTemplate(); + if(pDocTmpl) + { + POSITION pos = pDocTmpl->GetFirstDocPosition(); + CDocument *pDoc; + + int fileID = 0; + const CString timeStamp = (CTime::GetCurrentTime()).Format("%Y%m%d.%H%M%S"); + + while((pos != NULL) && ((pDoc = pDocTmpl->GetNextDoc(pos)) != NULL)) + { + CModDoc *pModDoc = (CModDoc *)pDoc; + if(pModDoc->IsModified() && pModDoc->GetSoundFile() != nullptr) + { + fileID++; + CString filename; + filename.Format("%scrash_%s_%d.%s", theApp.GetConfigPath(), timeStamp, fileID, pModDoc->GetSoundFile()->GetModSpecifications().fileExtension); + pModDoc->OnSaveDocument(filename); + } + } + + if(fileID > 0) + { + CString message; + message.Format("A crash has been detected.\n%d modified file%s been rescued to %s", fileID, (fileID == 1 ? " has" : "s have"), theApp.GetConfigPath()); + ::MessageBox((pMainFrame ? pMainFrame->m_hWnd : NULL), message, "OpenMPT Crash", MB_ICONERROR); + } + } + + // Let Windows handle the exception... + return EXCEPTION_CONTINUE_SEARCH; +} +#endif // WIN32 + + ////////////////////////////////////////////////////////////////////////////////// // Localized strings Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2011-08-21 11:37:52 UTC (rev 988) +++ trunk/OpenMPT/mptrack/Mptrack.h 2011-08-21 21:21:48 UTC (rev 989) @@ -275,9 +275,16 @@ private: static void LoadRegistryDLS(); - #ifdef WIN32 // Legacy stuff +#ifdef WIN32 // Legacy stuff bool MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH] = "", TCHAR sNewFileName[_MAX_PATH] = ""); - #endif +#endif // WIN32 + +// Exception handling +#ifdef WIN32 +public: + static LONG WINAPI UnhandledExceptionFilter(_EXCEPTION_POINTERS *); +#endif // WIN32 + }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-22 14:14:16
|
Revision: 992 http://modplug.svn.sourceforge.net/modplug/?rev=992&view=rev Author: saga-games Date: 2011-08-22 14:14:03 +0000 (Mon, 22 Aug 2011) Log Message: ----------- [Mod] Warnings for known troublesome plugins are now shown when adding the plugin to the plugin library instead of when adding them to a song. [Ref] Moved plugin selection dialog code to a separate file. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.h trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters Added Paths: ----------- trunk/OpenMPT/mptrack/SelectPluginDialog.cpp trunk/OpenMPT/mptrack/SelectPluginDialog.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-08-22 14:14:03 UTC (rev 992) @@ -10,7 +10,7 @@ #include "tuningDialog.h" #include "misc_util.h" #include "../soundlib/StringFixer.h" -#include "Vstplug.h" +#include "SelectPluginDialog.h" #pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-22 14:14:03 UTC (rev 992) @@ -26,6 +26,7 @@ #include "ctrl_pat.h" #include "UpdateCheck.h" #include "CloseMainDialog.h" +#include "SelectPluginDialog.h" #ifdef _DEBUG #define new DEBUG_NEW Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.h =================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.h 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.h 2011-08-22 14:14:03 UTC (rev 992) @@ -7,9 +7,9 @@ * OpenMPT Devs */ +#pragma once #ifndef SAMPLEEDITORDIALOGS_H #define SAMPLEEDITORDIALOGS_H -#pragma once ////////////////////////////////////////////////////////////////////////// // Sample amplification dialog Added: trunk/OpenMPT/mptrack/SelectPluginDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/SelectPluginDialog.cpp (rev 0) +++ trunk/OpenMPT/mptrack/SelectPluginDialog.cpp 2011-08-22 14:14:03 UTC (rev 992) @@ -0,0 +1,471 @@ +/* + * + * SelectPluginDialog.cpp + * ---------------------- + * Purpose: Implementation of the plugin selection dialog + * Notes : (currently none) + * Authors: Olivier Lapicque + * OpenMPT Devs + * + */ + +#include "stdafx.h" +#include "Mptrack.h" +#include "Mainfrm.h" +#include "Moddoc.h" +#include "SelectPluginDialog.h" + + +///////////////////////////////////////////////////////////////////////////////// +// Plugin selection dialog + + +BEGIN_MESSAGE_MAP(CSelectPluginDlg, CDialog) + ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelChanged) + ON_NOTIFY(NM_DBLCLK, IDC_TREE1, OnSelDblClk) + ON_COMMAND(IDC_BUTTON1, OnAddPlugin) + ON_COMMAND(IDC_BUTTON2, OnRemovePlugin) + ON_EN_CHANGE(IDC_NAMEFILTER, OnNameFilterChanged) + ON_WM_SIZE() + ON_WM_GETMINMAXINFO() +END_MESSAGE_MAP() + + +void CSelectPluginDlg::DoDataExchange(CDataExchange* pDX) +//------------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_TREE1, m_treePlugins); + DDX_Text(pDX, IDC_NAMEFILTER, m_sNameFilter); +} + + +CSelectPluginDlg::CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent) : CDialog(IDD_SELECTMIXPLUGIN, parent) +//---------------------------------------------------------------------------------------------------------------------- +{ + m_pPlugin = NULL; + m_pModDoc = pModDoc; + m_nPlugSlot = nPlugSlot; + + if (m_pModDoc) + { + CSoundFile* pSndFile = pModDoc->GetSoundFile(); + if (pSndFile && (0 <= m_nPlugSlot && m_nPlugSlot < MAX_MIXPLUGINS)) + { + m_pPlugin = &pSndFile->m_MixPlugins[m_nPlugSlot]; + } + } +} + + +BOOL CSelectPluginDlg::OnInitDialog() +//----------------------------------- +{ + DWORD dwRemove = TVS_EDITLABELS|TVS_SINGLEEXPAND; + DWORD dwAdd = TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS; + + CDialog::OnInitDialog(); + m_treePlugins.ModifyStyle(dwRemove, dwAdd); + m_treePlugins.SetImageList(CMainFrame::GetMainFrame()->GetImageList(), TVSIL_NORMAL); + + if (m_pPlugin) { + CString targetSlot; + targetSlot.Format("Put in FX%02d", m_nPlugSlot+1); + SetDlgItemText(IDOK, targetSlot); + ::EnableWindow(::GetDlgItem(m_hWnd, IDOK), TRUE); + } else { + ::EnableWindow(::GetDlgItem(m_hWnd, IDOK), FALSE); + } + + MoveWindow(CMainFrame::GetSettings().gnPlugWindowX, + CMainFrame::GetSettings().gnPlugWindowY, + CMainFrame::GetSettings().gnPlugWindowWidth, + CMainFrame::GetSettings().gnPlugWindowHeight); + + UpdatePluginsList(); + OnSelChanged(NULL, NULL); + return TRUE; +} + + +void CSelectPluginDlg::OnOK() +//--------------------------- +{ + // -> CODE#0002 + // -> DESC="list box to choose VST plugin presets (programs)" + if(m_pPlugin==NULL) { CDialog::OnOK(); return; } + // -! NEW_FEATURE#0002 + + BOOL bChanged = FALSE; + CVstPluginManager *pManager = theApp.GetPluginManager(); + PVSTPLUGINLIB pNewPlug = (PVSTPLUGINLIB)m_treePlugins.GetItemData(m_treePlugins.GetSelectedItem()); + PVSTPLUGINLIB pFactory = NULL; + CVstPlugin *pCurrentPlugin = NULL; + if (m_pPlugin) pCurrentPlugin = (CVstPlugin *)m_pPlugin->pMixPlugin; + if ((pManager) && (pManager->IsValidPlugin(pNewPlug))) pFactory = pNewPlug; + // Plugin selected + if (pFactory) + { + if ((!pCurrentPlugin) || (pCurrentPlugin->GetPluginFactory() != pFactory)) + { + BEGIN_CRITICAL(); + if (pCurrentPlugin) pCurrentPlugin->Release(); + // Just in case... + m_pPlugin->pMixPlugin = NULL; + m_pPlugin->pMixState = NULL; + // Remove old state + m_pPlugin->nPluginDataSize = 0; + if (m_pPlugin->pPluginData) delete[] m_pPlugin->pPluginData; + m_pPlugin->pPluginData = NULL; + // Initialize plugin info + MemsetZero(m_pPlugin->Info); + m_pPlugin->Info.dwPluginId1 = pFactory->dwPluginId1; + m_pPlugin->Info.dwPluginId2 = pFactory->dwPluginId2; + + switch(m_pPlugin->Info.dwPluginId2) + { + // Enable drymix by default for these known plugins + case CCONST('S', 'c', 'o', 'p'): + m_pPlugin->Info.dwInputRouting |= MIXPLUG_INPUTF_WETMIX; + break; + } + + lstrcpyn(m_pPlugin->Info.szName, pFactory->szLibraryName, 32); + lstrcpyn(m_pPlugin->Info.szLibraryName, pFactory->szLibraryName, 64); + END_CRITICAL(); + // Now, create the new plugin + if (pManager) + { + pManager->CreateMixPlugin(m_pPlugin, (m_pModDoc) ? m_pModDoc->GetSoundFile() : 0); + if (m_pPlugin->pMixPlugin) + { + CHAR s[128]; + CVstPlugin *p = (CVstPlugin *)m_pPlugin->pMixPlugin; + s[0] = 0; + if ((p->GetDefaultEffectName(s)) && (s[0])) + { + s[31] = 0; + lstrcpyn(m_pPlugin->Info.szName, s, 32); + } + } + } + bChanged = TRUE; + } + } else + // No effect + { + BEGIN_CRITICAL(); + if (pCurrentPlugin) + { + pCurrentPlugin->Release(); + bChanged = TRUE; + } + // Just in case... + m_pPlugin->pMixPlugin = NULL; + m_pPlugin->pMixState = NULL; + // Remove old state + m_pPlugin->nPluginDataSize = 0; + if (m_pPlugin->pPluginData) delete[] m_pPlugin->pPluginData; + m_pPlugin->pPluginData = NULL; + // Clear plugin info + MemsetZero(m_pPlugin->Info); + END_CRITICAL(); + } + + //remember window size: + RECT rect; + GetWindowRect(&rect); + CMainFrame::GetSettings().gnPlugWindowX = rect.left; + CMainFrame::GetSettings().gnPlugWindowY = rect.top; + CMainFrame::GetSettings().gnPlugWindowWidth = rect.right - rect.left; + CMainFrame::GetSettings().gnPlugWindowHeight = rect.bottom - rect.top; + + if (bChanged) { + CMainFrame::GetSettings().gnPlugWindowLast = m_pPlugin->Info.dwPluginId2; + CDialog::OnOK(); + } + else { + CDialog::OnCancel(); + } +} + +void CSelectPluginDlg::OnCancel() +//------------------------------- +{ + //remember window size: + RECT rect; + GetWindowRect(&rect); + CMainFrame::GetSettings().gnPlugWindowX = rect.left; + CMainFrame::GetSettings().gnPlugWindowY = rect.top; + CMainFrame::GetSettings().gnPlugWindowWidth = rect.right - rect.left; + CMainFrame::GetSettings().gnPlugWindowHeight = rect.bottom - rect.top; + + CDialog::OnCancel(); +} + +void CSelectPluginDlg::OnNameFilterChanged() +//------------------------------------------ +{ + GetDlgItem(IDC_NAMEFILTER)->GetWindowText(m_sNameFilter); + m_sNameFilter = m_sNameFilter.MakeLower(); + UpdatePluginsList(); +} + +void CSelectPluginDlg::UpdatePluginsList(DWORD forceSelect/*=0*/) +//--------------------------------------------------------------- +{ + CVstPluginManager *pManager = theApp.GetPluginManager(); + HTREEITEM cursel, hDmo, hVst, hSynth; + + m_treePlugins.SetRedraw(FALSE); + m_treePlugins.DeleteAllItems(); + + hSynth = AddTreeItem("VST Instruments", IMAGE_FOLDER, false); + hDmo = AddTreeItem("DirectX Media Audio Effects", IMAGE_FOLDER, false); + hVst = AddTreeItem("VST Audio Effects", IMAGE_FOLDER, false); + cursel = AddTreeItem("No plugin (empty slot)", IMAGE_NOPLUGIN, false); + + if (pManager) + { + PVSTPLUGINLIB pCurrent = NULL; + PVSTPLUGINLIB p = pManager->GetFirstPlugin(); + while (p) + { + // Apply name filter + if (m_sNameFilter != "") { + CString displayName = p->szLibraryName; + if (displayName.MakeLower().Find(m_sNameFilter) == -1) { + p = p->pNext; + continue; + } + } + + HTREEITEM hParent; + if (p->dwPluginId1 == kDmoMagic) { + hParent = hDmo; + } else { + hParent = (p->bIsInstrument) ? hSynth : hVst; + } + + HTREEITEM h = AddTreeItem(p->szLibraryName, p->bIsInstrument ? IMAGE_PLUGININSTRUMENT : IMAGE_EFFECTPLUGIN, true, hParent, (LPARAM)p); + + //If filter is active, expand nodes. + if (m_sNameFilter != "") m_treePlugins.EnsureVisible(h); + + //Which plugin should be selected? + if (m_pPlugin) + { + + //forced selection (e.g. just after add plugin) + if (forceSelect != 0) + { + if (p->dwPluginId2 == forceSelect) + { + pCurrent = p; + } + } + + //Current slot's plugin + else if (m_pPlugin->pMixPlugin) + { + CVstPlugin *pVstPlug = (CVstPlugin *)m_pPlugin->pMixPlugin; + if (pVstPlug->GetPluginFactory() == p) pCurrent = p; + } + + //Plugin with matching ID to current slot's plug + else if (/* (!pCurrent) && */ m_pPlugin->Info.dwPluginId1 !=0 || m_pPlugin->Info.dwPluginId2 != 0) + { + if ((p->dwPluginId1 == m_pPlugin->Info.dwPluginId1) + && (p->dwPluginId2 == m_pPlugin->Info.dwPluginId2)) { + pCurrent = p; + } + } + + //Last selected plugin + else + { + if (p->dwPluginId2 == CMainFrame::GetSettings().gnPlugWindowLast) { + pCurrent = p; + } + } + } + if (pCurrent == p) cursel = h; + p = p->pNext; + } + } + m_treePlugins.SetRedraw(TRUE); + if (cursel) { + m_treePlugins.SelectItem(cursel); + m_treePlugins.SetItemState(cursel, TVIS_BOLD, TVIS_BOLD); + m_treePlugins.EnsureVisible(cursel); + } +} + +HTREEITEM CSelectPluginDlg::AddTreeItem(LPSTR szTitle, int iImage, bool bSort, HTREEITEM hParent, LPARAM lParam) +//-------------------------------------------------------------------------------------------------------------- +{ + TVINSERTSTRUCT tvis; + MemsetZero(tvis); + + tvis.hParent = hParent; + tvis.hInsertAfter = (bSort) ? TVI_SORT : TVI_FIRST; + tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_TEXT; + tvis.item.pszText = szTitle; + tvis.item.iImage = tvis.item.iSelectedImage = iImage; + tvis.item.lParam = lParam; + return m_treePlugins.InsertItem(&tvis); +} + + +void CSelectPluginDlg::OnSelDblClk(NMHDR *, LRESULT *result) +//---------------------------------------------------------- +{ + // -> CODE#0002 + // -> DESC="list box to choose VST plugin presets (programs)" + if(m_pPlugin == NULL) return; + // -! NEW_FEATURE#0002 + + HTREEITEM hSel = m_treePlugins.GetSelectedItem(); + int nImage, nSelectedImage; + m_treePlugins.GetItemImage(hSel, nImage, nSelectedImage); + + if ((hSel) && (nImage != IMAGE_FOLDER)) OnOK(); + if (result) *result = 0; +} + + +void CSelectPluginDlg::OnSelChanged(NMHDR *, LRESULT *result) +//----------------------------------------------------------- +{ + CVstPluginManager *pManager = theApp.GetPluginManager(); + PVSTPLUGINLIB pPlug = (PVSTPLUGINLIB)m_treePlugins.GetItemData(m_treePlugins.GetSelectedItem()); + if ((pManager) && (pManager->IsValidPlugin(pPlug))) + { + SetDlgItemText(IDC_TEXT_CURRENT_VSTPLUG, pPlug->szDllPath); + } else + { + SetDlgItemText(IDC_TEXT_CURRENT_VSTPLUG, ""); + } + if (result) *result = 0; +} + + +struct PROBLEMATIC_PLUG +{ + DWORD id1; + DWORD id2; + DWORD version; + LPCSTR name; + LPCSTR problem; +}; + +//TODO: Check whether the list is still valid. +static PROBLEMATIC_PLUG gProblemPlugs[] = +{ + {kEffectMagic, CCONST('N', 'i', '4', 'S'), 1, "Native Instruments B4", "* v1.1.1 hangs on playback. Do not proceed unless you have v1.1.5. *"}, + {kEffectMagic, CCONST('m', 'd', 'a', 'C'), 1, "MDA Degrade", "* This plugin can cause OpenMPT to behave erratically.\r\nYou should try SoundHack's Decimate, ConcreteFX's Lowbit or Subtek's LoFi Plus instead. *"}, + {kEffectMagic, CCONST('f', 'V', '2', 's'), 1, "Farbrausch V2", "* This plugin can cause OpenMPT to freeze when closing a module that uses V2 in a combination with various other plugins.\r\nIt is recommended to not use V2 in combination with any other plugins. *"}, + {kEffectMagic, CCONST('f', 'r', 'V', '2'), 1, "Farbrausch V2", "* This plugin can cause OpenMPT to freeze when closing a module that uses V2 in a combination with various other plugins.\r\nIt is recommended to not use V2 in combination with any other plugins. *"}, +}; + +bool CSelectPluginDlg::VerifyPlug(PVSTPLUGINLIB plug) + //--------------------------------------------------- +{ + CString s; + for (size_t p = 0; p < CountOf(gProblemPlugs); p++) + { + if ( (gProblemPlugs[p].id2 == plug->dwPluginId2) + /*&& (gProblemPlugs[p].id1 == plug->dwPluginId1)*/) + { + s.Format("WARNING: This plugin has been identified as %s,\r\nwhich is known to have the following problem with OpenMPT:\r\n\r\n%s\r\n\r\nWould you still like to add this plugin to the library?", gProblemPlugs[p].name, gProblemPlugs[p].problem); + return (AfxMessageBox(s, MB_YESNO) == IDYES); + } + } + + return true; +} + + +void CSelectPluginDlg::OnAddPlugin() +//---------------------------------- +{ + FileDlgResult files = CTrackApp::ShowOpenSaveFileDialog(true, "dll", "", + "VST Plugins (*.dll)|*.dll||", + CMainFrame::GetSettings().GetWorkingDirectory(DIR_PLUGINS), + true); + if(files.abort) return; + + CMainFrame::GetSettings().SetWorkingDirectory(files.workingDirectory.c_str(), DIR_PLUGINS, true); + + CVstPluginManager *pManager = theApp.GetPluginManager(); + bool bOk = false; + + PVSTPLUGINLIB plugLib = nullptr; + for(size_t counter = 0; counter < files.filenames.size(); counter++) + { + + CString sFilename = files.filenames[counter].c_str(); + + if (pManager) { + plugLib = pManager->AddPlugin(sFilename, FALSE); + if (plugLib) + { + bOk = true; + if(!VerifyPlug(plugLib)) + { + pManager->RemovePlugin(plugLib); + } + } + } + } + if (bOk) + { + // Force selection to last added plug. + UpdatePluginsList(plugLib ? plugLib->dwPluginId2 : 0); + } else + { + MessageBox("At least one selected file was not a valid VST-Plugin", NULL, MB_ICONERROR | MB_OK); + } +} + + +void CSelectPluginDlg::OnRemovePlugin() +//------------------------------------- +{ + CVstPluginManager *pManager = theApp.GetPluginManager(); + PVSTPLUGINLIB pPlug = (PVSTPLUGINLIB)m_treePlugins.GetItemData(m_treePlugins.GetSelectedItem()); + if ((pManager) && (pPlug)) + { + pManager->RemovePlugin(pPlug); + UpdatePluginsList(); + } +} + + +void CSelectPluginDlg::OnSize(UINT nType, int cx, int cy) +//------------------------------------------------------- +{ + CDialog::OnSize(nType, cx, cy); + + if (m_treePlugins) { + m_treePlugins.MoveWindow(8, 36, cx - 104, cy - 63, FALSE); + + ::MoveWindow(GetDlgItem(IDC_STATIC_VSTNAMEFILTER)->m_hWnd, 8, 11, 40, 21, FALSE); + ::MoveWindow(GetDlgItem(IDC_NAMEFILTER)->m_hWnd, 40, 8, cx - 136, 21, FALSE); + + ::MoveWindow(GetDlgItem(IDC_TEXT_CURRENT_VSTPLUG)->m_hWnd, 8, cy - 20, cx - 22, 25, FALSE); + ::MoveWindow(GetDlgItem(IDOK)->m_hWnd, cx-85, 8, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDCANCEL)->m_hWnd, cx-85, 39, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_BUTTON1)->m_hWnd , cx-85, cy-80, 75, 23, FALSE); + ::MoveWindow(GetDlgItem(IDC_BUTTON2)->m_hWnd, cx-85, cy-52, 75, 23, FALSE); + Invalidate(); + } +} + +void CSelectPluginDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) +//------------------------------------------------------- +{ + lpMMI->ptMinTrackSize.x = 300; + lpMMI->ptMinTrackSize.y = 270; + CDialog::OnGetMinMaxInfo(lpMMI); +} Added: trunk/OpenMPT/mptrack/SelectPluginDialog.h =================================================================== --- trunk/OpenMPT/mptrack/SelectPluginDialog.h (rev 0) +++ trunk/OpenMPT/mptrack/SelectPluginDialog.h 2011-08-22 14:14:03 UTC (rev 992) @@ -0,0 +1,50 @@ +/* + * + * SelectPluginDialog.h + * -------------------- + * Purpose: Headers for the plugin selection dialog + * Notes : (currently none) + * Authors: Olivier Lapicque + * OpenMPT Devs + * + */ + +#pragma once +#ifndef SELECTPLUGINDIALOG_H +#define SELECTPLUGINDIALOG_H + +#include "Vstplug.h" + +//==================================== +class CSelectPluginDlg: public CDialog +//==================================== +{ +protected: + int m_nPlugSlot; + PSNDMIXPLUGIN m_pPlugin; + CModDoc *m_pModDoc; + CTreeCtrl m_treePlugins; + CString m_sNameFilter; + + HTREEITEM AddTreeItem(LPSTR szTitle, int iImage, bool bSort, HTREEITEM hParent = TVI_ROOT, LPARAM lParam = NULL); + +public: + CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent); //rewbs.plugDocAware + void DoClose(); + void UpdatePluginsList(DWORD forceSelect=0); + bool VerifyPlug(PVSTPLUGINLIB plug); + virtual void DoDataExchange(CDataExchange* pDX); + virtual BOOL OnInitDialog(); + virtual void OnOK(); + virtual void OnCancel(); + afx_msg void OnAddPlugin(); + afx_msg void OnRemovePlugin(); + afx_msg void OnNameFilterChanged(); + afx_msg void OnSelChanged(NMHDR *pNotifyStruct, LRESULT * result); + afx_msg void OnSelDblClk(NMHDR *pNotifyStruct, LRESULT * result); + DECLARE_MESSAGE_MAP() + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI); +}; + +#endif // SELECTPLUGINDIALOG_H Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2011-08-22 14:14:03 UTC (rev 992) @@ -10,8 +10,8 @@ #include "EffectVis.h" #include "movefxslotdialog.h" #include "ChannelManagerDlg.h" +#include "SelectPluginDialog.h" #include "../soundlib/StringFixer.h" -#include ".\view_gen.h" #define ID_FXCOMMANDS_BASE 41000 Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2011-08-22 14:14:03 UTC (rev 992) @@ -795,7 +795,7 @@ timeInfo.flags |= kVstPpqPosValid; if (timeInfo.flags & kVstTransportPlaying) { - timeInfo.ppqPos = (timeInfo.samplePos/timeInfo.sampleRate)*(pSndFile->GetCurrentBPM()/60.0); + timeInfo.ppqPos = (timeInfo.samplePos / timeInfo.sampleRate) * (pSndFile->GetCurrentBPM() / 60.0); } else { timeInfo.ppqPos = 0; @@ -1278,466 +1278,7 @@ va_end(va); } -///////////////////////////////////////////////////////////////////////////////// -// -// CSelectPluginDlg -// -BEGIN_MESSAGE_MAP(CSelectPluginDlg, CDialog) - ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelChanged) - ON_NOTIFY(NM_DBLCLK, IDC_TREE1, OnSelDblClk) - ON_COMMAND(IDC_BUTTON1, OnAddPlugin) - ON_COMMAND(IDC_BUTTON2, OnRemovePlugin) - ON_EN_CHANGE(IDC_NAMEFILTER, OnNameFilterChanged) - ON_WM_SIZE() - ON_WM_GETMINMAXINFO() -END_MESSAGE_MAP() - -void CSelectPluginDlg::DoDataExchange(CDataExchange* pDX) -//------------------------------------------------------- -{ - CDialog::DoDataExchange(pDX); - DDX_Control(pDX, IDC_TREE1, m_treePlugins); - DDX_Text(pDX, IDC_NAMEFILTER, m_sNameFilter); -} - - -CSelectPluginDlg::CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent):CDialog(IDD_SELECTMIXPLUGIN, parent) -//---------------------------------------------------------------------------------------------------------- -{ - m_pPlugin = NULL; - m_pModDoc = pModDoc; - m_nPlugSlot = nPlugSlot; - - if (m_pModDoc) - { - CSoundFile* pSndFile = pModDoc->GetSoundFile(); - if (pSndFile && (0 <= m_nPlugSlot && m_nPlugSlot < MAX_MIXPLUGINS)) - { - m_pPlugin = &pSndFile->m_MixPlugins[m_nPlugSlot]; - } - } -} - - -BOOL CSelectPluginDlg::OnInitDialog() -//----------------------------------- -{ - DWORD dwRemove = TVS_EDITLABELS|TVS_SINGLEEXPAND; - DWORD dwAdd = TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS; - - CDialog::OnInitDialog(); - m_treePlugins.ModifyStyle(dwRemove, dwAdd); - m_treePlugins.SetImageList(CMainFrame::GetMainFrame()->GetImageList(), TVSIL_NORMAL); - - if (m_pPlugin) { - CString targetSlot; - targetSlot.Format("Put in FX%02d", m_nPlugSlot+1); - SetDlgItemText(IDOK, targetSlot); - ::EnableWindow(::GetDlgItem(m_hWnd, IDOK), TRUE); - } else { - ::EnableWindow(::GetDlgItem(m_hWnd, IDOK), FALSE); - } - - MoveWindow(CMainFrame::GetSettings().gnPlugWindowX, - CMainFrame::GetSettings().gnPlugWindowY, - CMainFrame::GetSettings().gnPlugWindowWidth, - CMainFrame::GetSettings().gnPlugWindowHeight); - - UpdatePluginsList(); - OnSelChanged(NULL, NULL); - return TRUE; -} - - -struct PROBLEMATIC_PLUG -{ - DWORD id1; - DWORD id2; - DWORD version; - LPCSTR name; - LPCSTR problem; -}; - -//TODO: Check whether the list is still valid. -static PROBLEMATIC_PLUG gProblemPlugs[] = -{ - {kEffectMagic, CCONST('N', 'i', '4', 'S'), 1, "Native Instruments B4", "* v1.1.1 hangs on playback. Do not proceed unless you have v1.1.5. *"}, - {kEffectMagic, CCONST('m', 'd', 'a', 'C'), 1, "MDA Degrade", "* This plugin can cause OpenMPT to behave erratically.\r\nYou should try SoundHack's Decimate, ConcreteFX's Lowbit or Subtek's LoFi Plus instead. *"}, -}; - -bool CSelectPluginDlg::VerifyPlug(PVSTPLUGINLIB plug) -//--------------------------------------------------- -{ - CString s; - for (size_t p = 0; p < CountOf(gProblemPlugs); p++) - { - if ( (gProblemPlugs[p].id2 == plug->dwPluginId2) - /*&& (gProblemPlugs[p].id1 == plug->dwPluginId1)*/) - { - s.Format("WARNING: This plugin has been identified as %s,\r\nwhich is known to have the following problem with OpenMPT:\r\n\r\n%s\r\n\r\nWould you like to continue to load this plugin?", gProblemPlugs[p].name, gProblemPlugs[p].problem); - return (AfxMessageBox(s, MB_YESNO) == IDYES); - } - } - - // OK, this is a very specific problem with Superwave P8 and Farbrausch V2... - const CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - if((CCONST('f', 'V', '2', 's') == plug->dwPluginId2 || CCONST('f', 'r', 'V', '2') == plug->dwPluginId2) && pSndFile != nullptr && m_nPlugSlot >= 0 && m_nPlugSlot < MAX_MIXPLUGINS) - { - for(PLUGINDEX i = 0; i < m_nPlugSlot; i++) - { - if(CCONST('S', 'W', 'P', '8') == pSndFile->m_MixPlugins[i].Info.dwPluginId2) - { - return (AfxMessageBox("WARNING: Using Farbrausch V2 in a plugin slot after Superwave P8 will freeze OpenMPT when closing this module.\nThis problem is not specific to OpenMPT but happens in other music softwares as well.\nWould you still like to continue to load Farbrausch V2?", MB_YESNO) == IDYES); - } - } - } - - return true; -} - -VOID CSelectPluginDlg::OnOK() -//--------------------------- -{ -// -> CODE#0002 -// -> DESC="list box to choose VST plugin presets (programs)" - if(m_pPlugin==NULL) { CDialog::OnOK(); return; } -// -! NEW_FEATURE#0002 - - BOOL bChanged = FALSE; - CVstPluginManager *pManager = theApp.GetPluginManager(); - PVSTPLUGINLIB pNewPlug = (PVSTPLUGINLIB)m_treePlugins.GetItemData(m_treePlugins.GetSelectedItem()); - PVSTPLUGINLIB pFactory = NULL; - CVstPlugin *pCurrentPlugin = NULL; - if (m_pPlugin) pCurrentPlugin = (CVstPlugin *)m_pPlugin->pMixPlugin; - if ((pManager) && (pManager->IsValidPlugin(pNewPlug))) pFactory = pNewPlug; - // Plugin selected - if (pFactory) - { - if (!VerifyPlug(pFactory)) - { - CDialog::OnCancel(); - return; - } - - if ((!pCurrentPlugin) || (pCurrentPlugin->GetPluginFactory() != pFactory)) - { - BEGIN_CRITICAL(); - if (pCurrentPlugin) pCurrentPlugin->Release(); - // Just in case... - m_pPlugin->pMixPlugin = NULL; - m_pPlugin->pMixState = NULL; - // Remove old state - m_pPlugin->nPluginDataSize = 0; - if (m_pPlugin->pPluginData) delete[] m_pPlugin->pPluginData; - m_pPlugin->pPluginData = NULL; - // Initialize plugin info - MemsetZero(m_pPlugin->Info); - m_pPlugin->Info.dwPluginId1 = pFactory->dwPluginId1; - m_pPlugin->Info.dwPluginId2 = pFactory->dwPluginId2; - - switch(m_pPlugin->Info.dwPluginId2) - { - // Enable drymix by default for these known plugins - case CCONST('S', 'c', 'o', 'p'): - m_pPlugin->Info.dwInputRouting |= MIXPLUG_INPUTF_WETMIX; - break; - } - - lstrcpyn(m_pPlugin->Info.szName, pFactory->szLibraryName, 32); - lstrcpyn(m_pPlugin->Info.szLibraryName, pFactory->szLibraryName, 64); - END_CRITICAL(); - // Now, create the new plugin - if (pManager) - { - pManager->CreateMixPlugin(m_pPlugin, (m_pModDoc) ? m_pModDoc->GetSoundFile() : 0); - if (m_pPlugin->pMixPlugin) - { - CHAR s[128]; - CVstPlugin *p = (CVstPlugin *)m_pPlugin->pMixPlugin; - s[0] = 0; - if ((p->GetDefaultEffectName(s)) && (s[0])) - { - s[31] = 0; - lstrcpyn(m_pPlugin->Info.szName, s, 32); - } - } - } - bChanged = TRUE; - } - } else - // No effect - { - BEGIN_CRITICAL(); - if (pCurrentPlugin) - { - pCurrentPlugin->Release(); - bChanged = TRUE; - } - // Just in case... - m_pPlugin->pMixPlugin = NULL; - m_pPlugin->pMixState = NULL; - // Remove old state - m_pPlugin->nPluginDataSize = 0; - if (m_pPlugin->pPluginData) delete[] m_pPlugin->pPluginData; - m_pPlugin->pPluginData = NULL; - // Clear plugin info - MemsetZero(m_pPlugin->Info); - END_CRITICAL(); - } - - //remember window size: - RECT rect; - GetWindowRect(&rect); - CMainFrame::GetSettings().gnPlugWindowX = rect.left; - CMainFrame::GetSettings().gnPlugWindowY = rect.top; - CMainFrame::GetSettings().gnPlugWindowWidth = rect.right - rect.left; - CMainFrame::GetSettings().gnPlugWindowHeight = rect.bottom - rect.top; - - if (bChanged) { - CMainFrame::GetSettings().gnPlugWindowLast = m_pPlugin->Info.dwPluginId2; - CDialog::OnOK(); - } - else { - CDialog::OnCancel(); - } -} - -VOID CSelectPluginDlg::OnCancel() -//------------------------------- -{ - //remember window size: - RECT rect; - GetWindowRect(&rect); - CMainFrame::GetSettings().gnPlugWindowX = rect.left; - CMainFrame::GetSettings().gnPlugWindowY = rect.top; - CMainFrame::GetSettings().gnPlugWindowWidth = rect.right - rect.left; - CMainFrame::GetSettings().gnPlugWindowHeight = rect.bottom - rect.top; - - CDialog::OnCancel(); -} - -void CSelectPluginDlg::OnNameFilterChanged() -//------------------------------------------ -{ - GetDlgItem(IDC_NAMEFILTER)->GetWindowText(m_sNameFilter); - m_sNameFilter = m_sNameFilter.MakeLower(); - UpdatePluginsList(); -} - -VOID CSelectPluginDlg::UpdatePluginsList(DWORD forceSelect/*=0*/) -//--------------------------------------------------------------- -{ - CVstPluginManager *pManager = theApp.GetPluginManager(); - HTREEITEM cursel, hDmo, hVst, hSynth; - - m_treePlugins.SetRedraw(FALSE); - m_treePlugins.DeleteAllItems(); - - hSynth = AddTreeItem("VST Instruments", IMAGE_FOLDER, false); - hDmo = AddTreeItem("DirectX Media Audio Effects", IMAGE_FOLDER, false); - hVst = AddTreeItem("VST Audio Effects", IMAGE_FOLDER, false); - cursel = AddTreeItem("No plugin (empty slot)", IMAGE_NOPLUGIN, false); - - if (pManager) - { - PVSTPLUGINLIB pCurrent = NULL; - PVSTPLUGINLIB p = pManager->GetFirstPlugin(); - while (p) - { - // Apply name filter - if (m_sNameFilter != "") { - CString displayName = p->szLibraryName; - if (displayName.MakeLower().Find(m_sNameFilter) == -1) { - p = p->pNext; - continue; - } - } - - HTREEITEM hParent; - if (p->dwPluginId1 == kDmoMagic) { - hParent = hDmo; - } else { - hParent = (p->bIsInstrument) ? hSynth : hVst; - } - - HTREEITEM h = AddTreeItem(p->szLibraryName, p->bIsInstrument ? IMAGE_PLUGININSTRUMENT : IMAGE_EFFECTPLUGIN, true, hParent, (LPARAM)p); - - //If filter is active, expand nodes. - if (m_sNameFilter != "") m_treePlugins.EnsureVisible(h); - - //Which plugin should be selected? - if (m_pPlugin) - { - - //forced selection (e.g. just after add plugin) - if (forceSelect != 0) - { - if (p->dwPluginId2 == forceSelect) - { - pCurrent = p; - } - } - - //Current slot's plugin - else if (m_pPlugin->pMixPlugin) - { - CVstPlugin *pVstPlug = (CVstPlugin *)m_pPlugin->pMixPlugin; - if (pVstPlug->GetPluginFactory() == p) pCurrent = p; - } - - //Plugin with matching ID to current slot's plug - else if (/* (!pCurrent) && */ m_pPlugin->Info.dwPluginId1 !=0 || m_pPlugin->Info.dwPluginId2 != 0) - { - if ((p->dwPluginId1 == m_pPlugin->Info.dwPluginId1) - && (p->dwPluginId2 == m_pPlugin->Info.dwPluginId2)) { - pCurrent = p; - } - } - - //Last selected plugin - else - { - if (p->dwPluginId2 == CMainFrame::GetSettings().gnPlugWindowLast) { - pCurrent = p; - } - } - } - if (pCurrent == p) cursel = h; - p = p->pNext; - } - } - m_treePlugins.SetRedraw(TRUE); - if (cursel) { - m_treePlugins.SelectItem(cursel); - m_treePlugins.SetItemState(cursel, TVIS_BOLD, TVIS_BOLD); - m_treePlugins.EnsureVisible(cursel); - } -} - -HTREEITEM CSelectPluginDlg::AddTreeItem(LPSTR szTitle, int iImage, bool bSort, HTREEITEM hParent, LPARAM lParam) -//-------------------------------------------------------------------------------------------------------------- -{ - TVINSERTSTRUCT tvis; - MemsetZero(tvis); - - tvis.hParent = hParent; - tvis.hInsertAfter = (bSort) ? TVI_SORT : TVI_FIRST; - tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_TEXT; - tvis.item.pszText = szTitle; - tvis.item.iImage = tvis.item.iSelectedImage = iImage; - tvis.item.lParam = lParam; - return m_treePlugins.InsertItem(&tvis); -} - - -VOID CSelectPluginDlg::OnSelDblClk(NMHDR *, LRESULT *result) -//---------------------------------------------------------- -{ -// -> CODE#0002 -// -> DESC="list box to choose VST plugin presets (programs)" - if(m_pPlugin == NULL) return; -// -! NEW_FEATURE#0002 - - HTREEITEM hSel = m_treePlugins.GetSelectedItem(); - int nImage, nSelectedImage; - m_treePlugins.GetItemImage(hSel, nImage, nSelectedImage); - - if ((hSel) && (nImage != IMAGE_FOLDER)) OnOK(); - if (result) *result = 0; -} - - -VOID CSelectPluginDlg::OnSelChanged(NMHDR *, LRESULT *result) -//----------------------------------------------------------- -{ - CVstPluginManager *pManager = theApp.GetPluginManager(); - PVSTPLUGINLIB pPlug = (PVSTPLUGINLIB)m_treePlugins.GetItemData(m_treePlugins.GetSelectedItem()); - if ((pManager) && (pManager->IsValidPlugin(pPlug))) - { - SetDlgItemText(IDC_TEXT_CURRENT_VSTPLUG, pPlug->szDllPath); - } else - { - SetDlgItemText(IDC_TEXT_CURRENT_VSTPLUG, ""); - } - if (result) *result = 0; -} - -VOID CSelectPluginDlg::OnAddPlugin() -//---------------------------------- -{ - FileDlgResult files = CTrackApp::ShowOpenSaveFileDialog(true, "dll", "", - "VST Plugins (*.dll)|*.dll||", - CMainFrame::GetSettings().GetWorkingDirectory(DIR_PLUGINS), - true); - if(files.abort) return; - - CMainFrame::GetSettings().SetWorkingDirectory(files.workingDirectory.c_str(), DIR_PLUGINS, true); - - CVstPluginManager *pManager = theApp.GetPluginManager(); - bool bOk = false; - - PVSTPLUGINLIB plugLib = NULL; - for(size_t counter = 0; counter < files.filenames.size(); counter++) - { - - CString sFilename = files.filenames[counter].c_str(); - - if (pManager) { - plugLib = pManager->AddPlugin(sFilename, FALSE); - if (plugLib) bOk = true; - } - } - if (bOk) { - UpdatePluginsList(plugLib->dwPluginId2); //force selection to last added plug. - } else { - MessageBox("At least one selected file was not a valid VST-Plugin", NULL, MB_ICONERROR|MB_OK); - } -} - - -VOID CSelectPluginDlg::OnRemovePlugin() -//------------------------------------- -{ - CVstPluginManager *pManager = theApp.GetPluginManager(); - PVSTPLUGINLIB pPlug = (PVSTPLUGINLIB)m_treePlugins.GetItemData(m_treePlugins.GetSelectedItem()); - if ((pManager) && (pPlug)) - { - pManager->RemovePlugin(pPlug); - UpdatePluginsList(); - } -} - - -void CSelectPluginDlg::OnSize(UINT nType, int cx, int cy) -//------------------------------------------------------- -{ - CDialog::OnSize(nType, cx, cy); - - if (m_treePlugins) { - m_treePlugins.MoveWindow(8, 36, cx - 104, cy - 63, FALSE); - - ::MoveWindow(GetDlgItem(IDC_STATIC_VSTNAMEFILTER)->m_hWnd, 8, 11, 40, 21, FALSE); - ::MoveWindow(GetDlgItem(IDC_NAMEFILTER)->m_hWnd, 40, 8, cx - 136, 21, FALSE); - - ::MoveWindow(GetDlgItem(IDC_TEXT_CURRENT_VSTPLUG)->m_hWnd, 8, cy - 20, cx - 22, 25, FALSE); - ::MoveWindow(GetDlgItem(IDOK)->m_hWnd, cx-85, 8, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDCANCEL)->m_hWnd, cx-85, 39, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDC_BUTTON1)->m_hWnd , cx-85, cy-80, 75, 23, FALSE); - ::MoveWindow(GetDlgItem(IDC_BUTTON2)->m_hWnd, cx-85, cy-52, 75, 23, FALSE); - Invalidate(); - } -} - -void CSelectPluginDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) -{ - lpMMI->ptMinTrackSize.x=300; - lpMMI->ptMinTrackSize.y=270; - CDialog::OnGetMinMaxInfo(lpMMI); -} - - - ////////////////////////////////////////////////////////////////////////////// // // CVstPlugin Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/Vstplug.h 2011-08-22 14:14:03 UTC (rev 992) @@ -1,3 +1,4 @@ +#pragma once #ifndef _VST_PLUGIN_MANAGER_H_ #define _VST_PLUGIN_MANAGER_H_ @@ -18,7 +19,8 @@ class CModDoc; class CSoundFile; -enum { +enum +{ effBuzzGetNumCommands=0x1000, effBuzzGetCommandName, effBuzzExecuteCommand, @@ -270,37 +272,4 @@ }; -//==================================== -class CSelectPluginDlg: public CDialog -//==================================== -{ -protected: - int m_nPlugSlot; - PSNDMIXPLUGIN m_pPlugin; - CModDoc *m_pModDoc; - CTreeCtrl m_treePlugins; - CString m_sNameFilter; - - HTREEITEM AddTreeItem(LPSTR szTitle, int iImage, bool bSort, HTREEITEM hParent = TVI_ROOT, LPARAM lParam = NULL); - -public: - CSelectPluginDlg(CModDoc *pModDoc, int nPlugSlot, CWnd *parent); //rewbs.plugDocAware - VOID DoClose(); - VOID UpdatePluginsList(DWORD forceSelect=0); - bool VerifyPlug(PVSTPLUGINLIB plug); - virtual void DoDataExchange(CDataExchange* pDX); - virtual BOOL OnInitDialog(); - virtual VOID OnOK(); - virtual VOID OnCancel(); - afx_msg void OnAddPlugin(); - afx_msg void OnRemovePlugin(); - afx_msg void OnNameFilterChanged(); - afx_msg void OnSelChanged(NMHDR *pNotifyStruct, LRESULT * result); - afx_msg void OnSelDblClk(NMHDR *pNotifyStruct, LRESULT * result); - DECLARE_MESSAGE_MAP() - afx_msg void OnSize(UINT nType, int cx, int cy); - afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI); -}; - - #endif // _VST_PLUGIN_MANAGER_H_ Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2011-08-22 14:14:03 UTC (rev 992) @@ -370,6 +370,9 @@ RelativePath=".\ScaleEnvPointsDlg.cpp"> </File> <File + RelativePath=".\SelectPluginDialog.cpp"> + </File> + <File RelativePath=".\serialization_utils.cpp"> </File> <File @@ -822,6 +825,9 @@ RelativePath=".\ScaleEnvPointsDlg.h"> </File> <File + RelativePath=".\SelectPluginDialog.h"> + </File> + <File RelativePath=".\serialization_utils.h"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-08-22 14:14:03 UTC (rev 992) @@ -497,6 +497,10 @@ > </File> <File + RelativePath=".\SelectPluginDialog.cpp" + > + </File> + <File RelativePath=".\serialization_utils.cpp" > </File> @@ -1095,6 +1099,10 @@ > </File> <File + RelativePath=".\SelectPluginDialog.h" + > + </File> + <File RelativePath=".\serialization_utils.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-22 14:14:03 UTC (rev 992) @@ -228,6 +228,7 @@ <ClCompile Include="SampleEditorDialogs.cpp" /> <ClCompile Include="..\soundlib\Sampleio.cpp" /> <ClCompile Include="ScaleEnvPointsDlg.cpp" /> + <ClCompile Include="SelectPluginDialog.cpp" /> <ClCompile Include="serialization_utils.cpp" /> <ClCompile Include="..\soundlib\snd_dsp.cpp" /> <ClCompile Include="..\soundlib\snd_eq.cpp" /> @@ -326,6 +327,7 @@ <ClInclude Include="Graph.h" /> <ClInclude Include="InstrumentNode.h" /> <ClInclude Include="Node.h" /> + <ClInclude Include="SelectPluginDialog.h" /> <ClInclude Include="Vertex.h" /> <ClInclude Include="view_graph.h" /> <ClInclude Include="AbstractVstEditor.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2011-08-22 13:42:10 UTC (rev 991) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2011-08-22 14:14:03 UTC (rev 992) @@ -418,6 +418,9 @@ <ClCompile Include="Undo.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="SelectPluginDialog.cpp"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="AbstractVstEditor.h"> @@ -729,6 +732,9 @@ <ClInclude Include="UpdateCheck.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="SelectPluginDialog.h"> + <Filter>Header Files\Dialogs</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-08-22 18:21:48
|
Revision: 993 http://modplug.svn.sourceforge.net/modplug/?rev=993&view=rev Author: saga-games Date: 2011-08-22 18:21:40 +0000 (Mon, 22 Aug 2011) Log Message: ----------- [Mod] Project settings: Changed exception handling style (bloats EXE a bit, but catches exceptions in VST plugins again) [Mod] If an unhandled exception is encountered, a minidump is created. [Ref] Moved ACM code to separate file. [Mod] OpenMPT: Version is now 1.20.00.11 Modified Paths: -------------- trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/mptrack/version.h Added Paths: ----------- trunk/OpenMPT/mptrack/ACMConvert.cpp trunk/OpenMPT/mptrack/ACMConvert.h Added: trunk/OpenMPT/mptrack/ACMConvert.cpp =================================================================== --- trunk/OpenMPT/mptrack/ACMConvert.cpp (rev 0) +++ trunk/OpenMPT/mptrack/ACMConvert.cpp 2011-08-22 18:21:40 UTC (rev 993) @@ -0,0 +1,544 @@ +/* + * + * ACMConvert.cpp + * -------------- + * Purpose: MPEG Layer-3 Functions through ACM - access to LAMEenc and BLADEenc is emulated through the ACM interface + * Notes : (currently none) + * Authors: Olivier Lapicque + * OpenMPT Devs + * + */ + + +#include "stdafx.h" +#include "bladedll.h" +#include "Mptrack.h" +#include "ACMConvert.h" + + +typedef struct BLADEENCSTREAMINFO +{ + BE_CONFIG beCfg; + LONGLONG dummy; + DWORD dwInputSamples; + DWORD dwOutputSamples; + HBE_STREAM hBeStream; + SHORT *pPCMBuffer; + DWORD dwReadPos; +} BLADEENCSTREAMINFO, *PBLADEENCSTREAMINFO; + +static PBLADEENCSTREAMINFO gpbeBladeCfg = NULL; +static PBLADEENCSTREAMINFO gpbeLameCfg = NULL; +BOOL ACMConvert::layer3Present = FALSE; + + +#define TRAP_ACM_FAULTS + +#ifdef TRAP_ACM_FAULTS +void ACMConvert::AcmExceptionHandler() +//------------------------------------ +{ + theApp.GetACMConvert().m_hACMInst = NULL; + theApp.WriteProfileInt("Settings", "DisableACM", 1); +} +#endif + +BOOL ACMConvert::InitializeACM(BOOL bNoAcm) +//----------------------------------------- +{ + DWORD (ACMAPI *pfnAcmGetVersion)(void); + DWORD dwVersion; + UINT fuErrorMode; + BOOL bOk = FALSE; + + fuErrorMode = SetErrorMode(SEM_NOOPENFILEERRORBOX); + try { + m_hBladeEnc = LoadLibrary(TEXT("BLADEENC.DLL")); + m_hLameEnc = LoadLibrary(TEXT("LAME_ENC.DLL")); + } catch(...) {} + if (!bNoAcm) + { +#ifdef TRAP_ACM_FAULTS + try { +#endif + m_hACMInst = LoadLibrary(TEXT("MSACM32.DLL")); +#ifdef TRAP_ACM_FAULTS + } catch(...) {} +#endif + } + SetErrorMode(fuErrorMode); + if (m_hBladeEnc != NULL) + { + BEVERSION pfnBeVersion = (BEVERSION)GetProcAddress(m_hBladeEnc, TEXT_BEVERSION); + if (!pfnBeVersion) + { + FreeLibrary(m_hBladeEnc); + m_hBladeEnc = NULL; + } else + { + layer3Present = TRUE; + bOk = TRUE; + } + } + if (m_hLameEnc != NULL) + { + BEVERSION pfnBeVersion = (BEVERSION)GetProcAddress(m_hLameEnc, TEXT_BEVERSION); + if (!pfnBeVersion) + { + FreeLibrary(m_hLameEnc); + m_hLameEnc = NULL; + } else + { + layer3Present = TRUE; + bOk = TRUE; + } + } + if ((m_hACMInst < (HINSTANCE)HINSTANCE_ERROR) || (!m_hACMInst)) + { + m_hACMInst = NULL; + return bOk; + } +#ifdef TRAP_ACM_FAULTS + try { +#endif + *(FARPROC *)&pfnAcmGetVersion = GetProcAddress(m_hACMInst, "acmGetVersion"); + dwVersion = 0; + if (pfnAcmGetVersion) dwVersion = pfnAcmGetVersion(); + if (HIWORD(dwVersion) < 0x0200) + { + FreeLibrary(m_hACMInst); + m_hACMInst = NULL; + return bOk; + } + // Load Function Pointers + m_pfnAcmFormatEnum = (PFNACMFORMATENUM)GetProcAddress(m_hACMInst, "acmFormatEnumA"); + // Enumerate formats + if (m_pfnAcmFormatEnum) + { + ACMFORMATDETAILS afd; + BYTE wfx[256]; + WAVEFORMATEX *pwfx = (WAVEFORMATEX *)&wfx; + + MemsetZero(afd); + MemsetZero(*pwfx); + afd.cbStruct = sizeof(ACMFORMATDETAILS); + afd.dwFormatTag = WAVE_FORMAT_PCM; + afd.pwfx = pwfx; + afd.cbwfx = sizeof(wfx); + pwfx->wFormatTag = WAVE_FORMAT_PCM; + pwfx->nChannels = 2; + pwfx->nSamplesPerSec = 44100; + pwfx->wBitsPerSample = 16; + pwfx->nBlockAlign = (WORD)((pwfx->nChannels * pwfx->wBitsPerSample) / 8); + pwfx->nAvgBytesPerSec = pwfx->nSamplesPerSec * pwfx->nBlockAlign; + m_pfnAcmFormatEnum(NULL, &afd, AcmFormatEnumCB, NULL, ACM_FORMATENUMF_CONVERT); + } +#ifdef TRAP_ACM_FAULTS + } catch(...){} +#endif + return TRUE; +} + + +BOOL ACMConvert::UninitializeACM() +//-------------------------------- +{ + if (m_hACMInst) + { + FreeLibrary(m_hACMInst); + m_hACMInst = NULL; + } + if (m_hLameEnc) + { + FreeLibrary(m_hLameEnc); + m_hLameEnc = NULL; + } + if (m_hBladeEnc) + { + FreeLibrary(m_hBladeEnc); + m_hBladeEnc = NULL; + } + return TRUE; +} + + +MMRESULT ACMConvert::AcmFormatEnum(HACMDRIVER had, LPACMFORMATDETAILSA pafd, ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum) +//---------------------------------------------------------------------------------------------------------------------------------------- +{ + MMRESULT err = MMSYSERR_INVALPARAM; + if ((m_hBladeEnc) || (m_hLameEnc)) + { + HACMDRIVER hBlade = (HACMDRIVER)&m_hBladeEnc; + HACMDRIVER hLame = (HACMDRIVER)&m_hLameEnc; + if (((had == hBlade) || (had == hLame) || (had == NULL)) && (pafd) && (fnCallback) + && (fdwEnum & ACM_FORMATENUMF_CONVERT) && (pafd->dwFormatTag == WAVE_FORMAT_PCM)) + { + ACMFORMATDETAILS afd; + MPEGLAYER3WAVEFORMAT wfx; + + afd.dwFormatIndex = 0; + for (UINT iFmt=0; iFmt<0x40; iFmt++) + { + afd.cbStruct = sizeof(afd); + afd.dwFormatTag = WAVE_FORMAT_MPEGLAYER3; + afd.fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + afd.pwfx = (LPWAVEFORMATEX)&wfx; + afd.cbwfx = sizeof(wfx); + wfx.wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; + wfx.wfx.nChannels = (WORD)((iFmt & 0x20) ? 1 : 2); + wfx.wfx.nSamplesPerSec = 0; + wfx.wfx.nBlockAlign = 1; + wfx.wfx.wBitsPerSample = 0; + wfx.wfx.cbSize = MPEGLAYER3_WFX_EXTRA_BYTES; + wfx.wID = MPEGLAYER3_ID_MPEG; + wfx.fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; + wfx.nBlockSize = 384; + wfx.nFramesPerBlock = 1; + wfx.nCodecDelay = 1000; + switch((iFmt >> 3) & 0x03) + { + case 0x00: wfx.wfx.nSamplesPerSec = 48000; break; + case 0x01: wfx.wfx.nSamplesPerSec = 44100; break; + case 0x02: wfx.wfx.nSamplesPerSec = 32000; break; + } + switch(iFmt & 7) + { + case 5: wfx.wfx.nAvgBytesPerSec = 320/8; break; + case 4: wfx.wfx.nAvgBytesPerSec = 64/8; break; + case 3: wfx.wfx.nAvgBytesPerSec = 96/8; break; + case 2: wfx.wfx.nAvgBytesPerSec = 128/8; break; + case 1: if (wfx.wfx.nChannels == 2) { wfx.wfx.nAvgBytesPerSec = 192/8; break; } + case 0: if (wfx.wfx.nChannels == 2) { wfx.wfx.nAvgBytesPerSec = 256/8; break; } + default: wfx.wfx.nSamplesPerSec = 0; + } + wsprintf(afd.szFormat, "%dkbps, %dHz, %s", wfx.wfx.nAvgBytesPerSec*8, wfx.wfx.nSamplesPerSec, (wfx.wfx.nChannels == 2) ? "stereo" : "mono"); + if (wfx.wfx.nSamplesPerSec) + { + if (m_hBladeEnc) fnCallback((HACMDRIVERID)hBlade, &afd, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC); + if (m_hLameEnc) fnCallback((HACMDRIVERID)hLame, &afd, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC); + afd.dwFormatIndex++; + } + } + err = MMSYSERR_NOERROR; + } + } + if (m_pfnAcmFormatEnum) + { + err = m_pfnAcmFormatEnum(had, pafd, fnCallback, dwInstance, fdwEnum); + } + return err; +} + + +BOOL ACMConvert::AcmFormatEnumCB(HACMDRIVERID, LPACMFORMATDETAILS pafd, DWORD, DWORD fdwSupport) +//---------------------------------------------------------------------------------------------- +{ + if ((pafd) && (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC)) + { + if (pafd->dwFormatTag == WAVE_FORMAT_MPEGLAYER3) layer3Present = TRUE; + } + return TRUE; +} + + +MMRESULT ACMConvert::AcmDriverOpen(LPHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen) +//-------------------------------------------------------------------------------------- +{ + if ((m_hBladeEnc) && (hadid == (HACMDRIVERID)&m_hBladeEnc)) + { + *phad = (HACMDRIVER)&m_hBladeEnc; + return MMSYSERR_NOERROR; + } + if ((m_hLameEnc) && (hadid == (HACMDRIVERID)&m_hLameEnc)) + { + *phad = (HACMDRIVER)&m_hLameEnc; + return MMSYSERR_NOERROR; + } + if (m_hACMInst) + { + PFNACMDRIVEROPEN pfnAcmDriverOpen = (PFNACMDRIVEROPEN)GetProcAddress(m_hACMInst, "acmDriverOpen"); + if (pfnAcmDriverOpen) return pfnAcmDriverOpen(phad, hadid, fdwOpen); + } + return MMSYSERR_INVALPARAM; +} + + +MMRESULT ACMConvert::AcmDriverClose(HACMDRIVER had, DWORD fdwClose) +//----------------------------------------------------------------- +{ + if ((m_hBladeEnc) && (had == (HACMDRIVER)&m_hBladeEnc)) + { + return MMSYSERR_NOERROR; + } + if ((m_hLameEnc) && (had == (HACMDRIVER)&m_hLameEnc)) + { + return MMSYSERR_NOERROR; + } + if (m_hACMInst) + { + PFNACMDRIVERCLOSE pfnAcmDriverClose = (PFNACMDRIVERCLOSE)GetProcAddress(m_hACMInst, "acmDriverClose"); + if (pfnAcmDriverClose) return pfnAcmDriverClose(had, fdwClose); + } + return MMSYSERR_INVALPARAM; +} + + +MMRESULT ACMConvert::AcmDriverDetails(HACMDRIVERID hadid, LPACMDRIVERDETAILS padd, DWORD fdwDetails) +//-------------------------------------------------------------------------------------------------- +{ + if (((m_hBladeEnc) && (hadid == (HACMDRIVERID)(&m_hBladeEnc))) + || ((m_hLameEnc) && (hadid == (HACMDRIVERID)(&m_hLameEnc)))) + { + if (!padd) return MMSYSERR_INVALPARAM; + padd->cbStruct = sizeof(ACMDRIVERDETAILS); + padd->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC; + padd->fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED; + padd->wMid = 0; + padd->wPid = 0; + padd->vdwACM = 0x04020000; + padd->vdwDriver = 0x04020000; + padd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; + padd->cFormatTags = 1; + padd->cFilterTags = 0; + padd->hicon = NULL; + strcpy(padd->szShortName, (hadid == (HACMDRIVERID)(&m_hBladeEnc)) ? "BladeEnc MP3" : "LAME Encoder"); + strcpy(padd->szLongName, padd->szShortName); + padd->szCopyright[0] = 0; + padd->szLicensing[0] = 0; + padd->szFeatures[0] = 0; + return MMSYSERR_NOERROR; + } + if (m_hACMInst) + { + PFNACMDRIVERDETAILS pfnAcmDriverDetails = (PFNACMDRIVERDETAILS)GetProcAddress(m_hACMInst, "acmDriverDetailsA"); + if (pfnAcmDriverDetails) return pfnAcmDriverDetails(hadid, padd, fdwDetails); + } + return MMSYSERR_INVALPARAM; +} + + +MMRESULT ACMConvert::AcmStreamOpen( + LPHACMSTREAM phas, // pointer to stream handle + HACMDRIVER had, // optional driver handle + LPWAVEFORMATEX pwfxSrc, // source format to convert + LPWAVEFORMATEX pwfxDst, // required destination format + LPWAVEFILTER pwfltr, // optional filter + DWORD dwCallback, // callback + DWORD dwInstance, // callback instance data + DWORD fdwOpen) // ACM_STREAMOPENF_* and CALLBACK_* +//-------------------------------------------------------------------------- +{ + PBLADEENCSTREAMINFO *ppbeCfg = NULL; + HINSTANCE hLib = NULL; + + if ((m_hBladeEnc) && (had == (HACMDRIVER)&m_hBladeEnc)) + { + ppbeCfg = &gpbeBladeCfg; + hLib = m_hBladeEnc; + } + if ((m_hLameEnc) && (had == (HACMDRIVER)&m_hLameEnc)) + { + ppbeCfg = &gpbeLameCfg; + hLib = m_hLameEnc; + } + if ((ppbeCfg) && (hLib)) + { + BEINITSTREAM pfnbeInitStream = (BEINITSTREAM)GetProcAddress(hLib, TEXT_BEINITSTREAM); + if (!pfnbeInitStream) return MMSYSERR_INVALPARAM; + PBLADEENCSTREAMINFO pbeCfg = new BLADEENCSTREAMINFO; + if ((pbeCfg) && (pwfxSrc) && (pwfxDst) && (pwfxSrc->nChannels == pwfxDst->nChannels) + && (pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) && (pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) + && (pwfxSrc->wBitsPerSample == 16)) + { + pbeCfg->dwInputSamples = 2048; + pbeCfg->dwOutputSamples = 2048; + pbeCfg->beCfg.dwConfig = BE_CONFIG_MP3; + pbeCfg->beCfg.format.mp3.dwSampleRate = pwfxDst->nSamplesPerSec; // 48000, 44100 and 32000 allowed + pbeCfg->beCfg.format.mp3.byMode = (BYTE)((pwfxSrc->nChannels == 2) ? BE_MP3_MODE_STEREO : BE_MP3_MODE_MONO); + pbeCfg->beCfg.format.mp3.wBitrate = (WORD)(pwfxDst->nAvgBytesPerSec * 8); // 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 and 320 allowed + pbeCfg->beCfg.format.mp3.bPrivate = FALSE; + pbeCfg->beCfg.format.mp3.bCRC = FALSE; + pbeCfg->beCfg.format.mp3.bCopyright = FALSE; + pbeCfg->beCfg.format.mp3.bOriginal = TRUE; + pbeCfg->hBeStream = NULL; + if (pfnbeInitStream(&pbeCfg->beCfg, &pbeCfg->dwInputSamples, &pbeCfg->dwOutputSamples, &pbeCfg->hBeStream) == BE_ERR_SUCCESSFUL) + { + *phas = (HACMSTREAM)had; + *ppbeCfg = pbeCfg; + pbeCfg->pPCMBuffer = (SHORT *)GlobalAllocPtr(GHND, pbeCfg->dwInputSamples * sizeof(SHORT)); + pbeCfg->dwReadPos = 0; + return MMSYSERR_NOERROR; + } + } + if (pbeCfg) delete pbeCfg; + return MMSYSERR_INVALPARAM; + } + if (m_hACMInst) + { + PFNACMSTREAMOPEN pfnAcmStreamOpen = (PFNACMSTREAMOPEN)GetProcAddress(m_hACMInst, "acmStreamOpen"); + if (pfnAcmStreamOpen) return pfnAcmStreamOpen(phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen); + } + return MMSYSERR_INVALPARAM; +} + + +MMRESULT ACMConvert::AcmStreamClose(HACMSTREAM has, DWORD fdwClose) +//----------------------------------------------------------------- +{ + if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) + || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) + { + HINSTANCE hLib = *(HINSTANCE *)has; + PBLADEENCSTREAMINFO pbeCfg = (has == (HACMSTREAM)&m_hBladeEnc) ? gpbeBladeCfg : gpbeLameCfg; + BECLOSESTREAM pfnbeCloseStream = (BECLOSESTREAM)GetProcAddress(hLib, TEXT_BECLOSESTREAM); + if ((pbeCfg) && (pfnbeCloseStream)) + { + pfnbeCloseStream(pbeCfg->hBeStream); + if (pbeCfg->pPCMBuffer) + { + GlobalFreePtr(pbeCfg->pPCMBuffer); + pbeCfg->pPCMBuffer = NULL; + } + delete pbeCfg; + pbeCfg = NULL; + return MMSYSERR_NOERROR; + } + return MMSYSERR_INVALPARAM; + } + if (m_hACMInst) + { + PFNACMSTREAMCLOSE pfnAcmStreamClose = (PFNACMSTREAMCLOSE)GetProcAddress(m_hACMInst, "acmStreamClose"); + if (pfnAcmStreamClose) return pfnAcmStreamClose(has, fdwClose); + } + return MMSYSERR_INVALPARAM; +} + + +MMRESULT ACMConvert::AcmStreamSize(HACMSTREAM has, DWORD cbInput, LPDWORD pdwOutputBytes, DWORD fdwSize) +//------------------------------------------------------------------------------------------------------ +{ + if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) + || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) + { + PBLADEENCSTREAMINFO pbeCfg = (has == (HACMSTREAM)&m_hBladeEnc) ? gpbeBladeCfg : gpbeLameCfg; + + if ((pbeCfg) && (pdwOutputBytes)) + { + if (fdwSize & ACM_STREAMSIZEF_DESTINATION) + { + *pdwOutputBytes = pbeCfg->dwOutputSamples * sizeof(short); + } else + if (fdwSize & ACM_STREAMSIZEF_SOURCE) + { + *pdwOutputBytes = pbeCfg->dwInputSamples * sizeof(short); + } + return MMSYSERR_NOERROR; + } + return MMSYSERR_INVALPARAM; + } + if (m_hACMInst) + { + if (fdwSize & ACM_STREAMSIZEF_DESTINATION) // Why does acmStreamSize return ACMERR_NOTPOSSIBLE in this case? + return MMSYSERR_NOERROR; + PFNACMSTREAMSIZE pfnAcmStreamSize = (PFNACMSTREAMSIZE)GetProcAddress(m_hACMInst, "acmStreamSize"); + if (pfnAcmStreamSize) return pfnAcmStreamSize(has, cbInput, pdwOutputBytes, fdwSize); + } + return MMSYSERR_INVALPARAM; +} + + +MMRESULT ACMConvert::AcmStreamPrepareHeader(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwPrepare) +//--------------------------------------------------------------------------------------------------- +{ + if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) + || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) + { + pash->fdwStatus = ACMSTREAMHEADER_STATUSF_PREPARED; + return MMSYSERR_NOERROR; + } + if (m_hACMInst) + { + PFNACMSTREAMCONVERT pfnAcmStreamPrepareHeader = (PFNACMSTREAMCONVERT)GetProcAddress(m_hACMInst, "acmStreamPrepareHeader"); + if (pfnAcmStreamPrepareHeader) return pfnAcmStreamPrepareHeader(has, pash, fdwPrepare); + } + return MMSYSERR_INVALPARAM; +} + + +MMRESULT ACMConvert::AcmStreamUnprepareHeader(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwUnprepare) +//------------------------------------------------------------------------------------------------------- +{ + if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) + || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) + { + pash->fdwStatus &= ~ACMSTREAMHEADER_STATUSF_PREPARED; + return MMSYSERR_NOERROR; + } + if (m_hACMInst) + { + PFNACMSTREAMCONVERT pfnAcmStreamUnprepareHeader = (PFNACMSTREAMCONVERT)GetProcAddress(m_hACMInst, "acmStreamUnprepareHeader"); + if (pfnAcmStreamUnprepareHeader) return pfnAcmStreamUnprepareHeader(has, pash, fdwUnprepare); + } + return MMSYSERR_INVALPARAM; +} + + +MMRESULT ACMConvert::AcmStreamConvert(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwConvert) +//--------------------------------------------------------------------------------------------- +{ + static BEENCODECHUNK pfnbeEncodeChunk = NULL; + static BEDEINITSTREAM pfnbeDeinitStream = NULL; + static HINSTANCE hInstEncode = NULL; + + if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) + || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) + { + PBLADEENCSTREAMINFO pbeCfg = (has == (HACMSTREAM)&m_hBladeEnc) ? gpbeBladeCfg : gpbeLameCfg; + HINSTANCE hLib = *(HINSTANCE *)has; + + if (hInstEncode != hLib) + { + pfnbeEncodeChunk = (BEENCODECHUNK)GetProcAddress(hLib, TEXT_BEENCODECHUNK); + pfnbeDeinitStream = (BEDEINITSTREAM)GetProcAddress(hLib, TEXT_BEDEINITSTREAM); + hInstEncode = hLib; + } + pash->fdwStatus |= ACMSTREAMHEADER_STATUSF_DONE; + if (fdwConvert & ACM_STREAMCONVERTF_END) + { + if ((pfnbeDeinitStream) && (pbeCfg)) + { + pfnbeDeinitStream(pbeCfg->hBeStream, pash->pbDst, &pash->cbDstLengthUsed); + return MMSYSERR_NOERROR; + } + } else + { + if ((pfnbeEncodeChunk) && (pbeCfg)) + { + DWORD dwBytesLeft = pbeCfg->dwInputSamples*2 - pbeCfg->dwReadPos; + if (!dwBytesLeft) + { + dwBytesLeft = pbeCfg->dwInputSamples*2; + pbeCfg->dwReadPos = 0; + } + if (dwBytesLeft > pash->cbSrcLength) dwBytesLeft = pash->cbSrcLength; + memcpy(&pbeCfg->pPCMBuffer[pbeCfg->dwReadPos/2], pash->pbSrc, dwBytesLeft); + pbeCfg->dwReadPos += dwBytesLeft; + pash->cbSrcLengthUsed = dwBytesLeft; + pash->cbDstLengthUsed = 0; + if (pbeCfg->dwReadPos == pbeCfg->dwInputSamples*2) + { + if (pfnbeEncodeChunk(pbeCfg->hBeStream, pbeCfg->dwInputSamples, pbeCfg->pPCMBuffer, pash->pbDst, &pash->cbDstLengthUsed) != 0) return MMSYSERR_INVALPARAM; + pbeCfg->dwReadPos = 0; + } + return MMSYSERR_NOERROR; + } + } + return MMSYSERR_INVALPARAM; + } + if (m_hACMInst) + { + PFNACMSTREAMCONVERT pfnAcmStreamConvert = (PFNACMSTREAMCONVERT)GetProcAddress(m_hACMInst, "acmStreamConvert"); + if (pfnAcmStreamConvert) return pfnAcmStreamConvert(has, pash, fdwConvert); + } + return MMSYSERR_INVALPARAM; +} Added: trunk/OpenMPT/mptrack/ACMConvert.h =================================================================== --- trunk/OpenMPT/mptrack/ACMConvert.h (rev 0) +++ trunk/OpenMPT/mptrack/ACMConvert.h 2011-08-22 18:21:40 UTC (rev 993) @@ -0,0 +1,69 @@ +/* + * + * ACMConvert.h + * ------------ + * Purpose: Header for ACM and MPEG Layer-3 conversion + * Notes : (currently none) + * Authors: Olivier Lapicque + * OpenMPT Devs + * + */ + + +#pragma once +#ifndef ACMCONVERT_H +#define ACMCONVERT_H + +///////////////////////////////////////////////////////////////////////////// +// ACM Functions (for dynamic linking) + +typedef VOID (ACMAPI *PFNACMMETRICS)(HACMOBJ, UINT, LPVOID); +typedef MMRESULT (ACMAPI *PFNACMFORMATENUM)(HACMDRIVER, LPACMFORMATDETAILSA, ACMFORMATENUMCBA, DWORD dwInstance, DWORD fdwEnum); +typedef MMRESULT (ACMAPI *PFNACMDRIVEROPEN)(LPHACMDRIVER, HACMDRIVERID, DWORD); +typedef MMRESULT (ACMAPI *PFNACMDRIVERCLOSE)(HACMDRIVER, DWORD); +typedef MMRESULT (ACMAPI *PFNACMSTREAMOPEN)(LPHACMSTREAM, HACMDRIVER, LPWAVEFORMATEX, LPWAVEFORMATEX, LPWAVEFILTER, DWORD, DWORD, DWORD); +typedef MMRESULT (ACMAPI *PFNACMSTREAMCLOSE)(HACMSTREAM, DWORD); +typedef MMRESULT (ACMAPI *PFNACMSTREAMSIZE)(HACMSTREAM, DWORD, LPDWORD, DWORD); +typedef MMRESULT (ACMAPI *PFNACMSTREAMCONVERT)(HACMSTREAM, LPACMSTREAMHEADER, DWORD); +typedef MMRESULT (ACMAPI *PFNACMDRIVERDETAILS)(HACMDRIVERID, LPACMDRIVERDETAILS, DWORD); + + +//============== +class ACMConvert +//============== +{ +protected: + HINSTANCE m_hACMInst; + HINSTANCE m_hBladeEnc, m_hLameEnc; + PFNACMFORMATENUM m_pfnAcmFormatEnum; + static BOOL layer3Present; + +public: + BOOL InitializeACM(BOOL bNoAcm = FALSE); + BOOL UninitializeACM(); + static void AcmExceptionHandler(); + MMRESULT AcmFormatEnum(HACMDRIVER had, LPACMFORMATDETAILSA pafd, ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum); + MMRESULT AcmDriverOpen(LPHACMDRIVER, HACMDRIVERID, DWORD); + MMRESULT AcmDriverDetails(HACMDRIVERID hadid, LPACMDRIVERDETAILS padd, DWORD fdwDetails); + MMRESULT AcmDriverClose(HACMDRIVER, DWORD); + MMRESULT AcmStreamOpen(LPHACMSTREAM, HACMDRIVER, LPWAVEFORMATEX, LPWAVEFORMATEX, LPWAVEFILTER pwfltr, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); + MMRESULT AcmStreamClose(HACMSTREAM, DWORD); + MMRESULT AcmStreamSize(HACMSTREAM has, DWORD cbInput, LPDWORD pdwOutputBytes, DWORD fdwSize); + MMRESULT AcmStreamPrepareHeader(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwPrepare); + MMRESULT AcmStreamUnprepareHeader(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwUnprepare); + MMRESULT AcmStreamConvert(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwConvert); + BOOL IsLayer3Present() const { return layer3Present; }; + + ACMConvert() + { + m_hBladeEnc = NULL; + m_hLameEnc = NULL; + m_hACMInst = NULL; + } + +protected: + static BOOL CALLBACK AcmFormatEnumCB(HACMDRIVERID, LPACMFORMATDETAILS, DWORD, DWORD); + +}; + +#endif // ACMCONVERT_H Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp 2011-08-22 14:14:03 UTC (rev 992) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp 2011-08-22 18:21:40 UTC (rev 993) @@ -371,7 +371,7 @@ pwfx->wBitsPerSample = 16; pwfx->nBlockAlign = (pwfx->nChannels * pwfx->wBitsPerSample) / 8; pwfx->nAvgBytesPerSec = pwfx->nSamplesPerSec * pwfx->nBlockAlign; - theApp.AcmFormatEnum(NULL, &afd, AcmFormatEnumCB, (DWORD)this, ACM_FORMATENUMF_CONVERT); + theApp.GetACMConvert().AcmFormatEnum(NULL, &afd, AcmFormatEnumCB, (DWORD)this, ACM_FORMATENUMF_CONVERT); m_bDriversEnumerated = TRUE; m_CbnDriver.SetCurSel(m_nDriverIndex); if (m_bSaveInfoField) CheckDlgButton(IDC_CHECK3, MF_CHECKED); @@ -413,7 +413,7 @@ pwfx->wBitsPerSample = 16; pwfx->nBlockAlign = pwfx->nChannels * pwfx->wBitsPerSample / 8; pwfx->nAvgBytesPerSec = pwfx->nSamplesPerSec * pwfx->nBlockAlign; - theApp.AcmFormatEnum(NULL, &afd, AcmFormatEnumCB, (DWORD)this, ACM_FORMATENUMF_CONVERT); + theApp.GetACMConvert().AcmFormatEnum(NULL, &afd, AcmFormatEnumCB, (DWORD)this, ACM_FORMATENUMF_CONVERT); m_CbnFormat.SetCurSel(m_nFormatIndex); } @@ -454,7 +454,7 @@ } MemsetZero(add); add.cbStruct = sizeof(add); - if (theApp.AcmDriverDetails(hdid, &add, 0L) == MMSYSERR_NOERROR) + if (theApp.GetACMConvert().AcmDriverDetails(hdid, &add, 0L) == MMSYSERR_NOERROR) { Drivers[m_nNumDrivers] = hdid; CHAR *pszName = ((add.szLongName[0]) && (strlen(add.szLongName) < 40)) ? add.szLongName : add.szShortName; @@ -978,12 +978,12 @@ wfxSrc.cbSize = 0; dwDstBufSize = WAVECONVERTBUFSIZE; // Open the ACM Driver - if (theApp.AcmDriverOpen(&hADriver, m_hadid, 0L) != MMSYSERR_NOERROR) goto OnError; - if (theApp.AcmStreamOpen(&hAStream, hADriver, &wfxSrc, m_pwfx, NULL, 0L, 0L, ACM_STREAMOPENF_NONREALTIME) != MMSYSERR_NOERROR) goto OnError; + if (theApp.GetACMConvert().AcmDriverOpen(&hADriver, m_hadid, 0L) != MMSYSERR_NOERROR) goto OnError; + if (theApp.GetACMConvert().AcmStreamOpen(&hAStream, hADriver, &wfxSrc, m_pwfx, NULL, 0L, 0L, ACM_STREAMOPENF_NONREALTIME) != MMSYSERR_NOERROR) goto OnError; // This call is useless for BLADEenc/LAMEenc, but required for ACM codecs! - if (theApp.AcmStreamSize(hAStream, WAVECONVERTBUFSIZE, &dwDstBufSize, ACM_STREAMSIZEF_SOURCE) != MMSYSERR_NOERROR) goto OnError; + if (theApp.GetACMConvert().AcmStreamSize(hAStream, WAVECONVERTBUFSIZE, &dwDstBufSize, ACM_STREAMSIZEF_SOURCE) != MMSYSERR_NOERROR) goto OnError; // This call is useless for ACM, but required for BLADEenc/LAMEenc codecs! - if (theApp.AcmStreamSize(hAStream, WAVECONVERTBUFSIZE, &dwDstBufSize, ACM_STREAMSIZEF_DESTINATION) != MMSYSERR_NOERROR) goto OnError; + if (theApp.GetACMConvert().AcmStreamSize(hAStream, WAVECONVERTBUFSIZE, &dwDstBufSize, ACM_STREAMSIZEF_DESTINATION) != MMSYSERR_NOERROR) goto OnError; //if (dwDstBufSize > 0x10000) dwDstBufSize = 0x10000; pcmBuffer = new BYTE[WAVECONVERTBUFSIZE]; dstBuffer = new BYTE[dwDstBufSize]; @@ -996,7 +996,7 @@ ash.cbSrcLength = WAVECONVERTBUFSIZE; ash.pbDst = dstBuffer; ash.cbDstLength = dwDstBufSize; - if (theApp.AcmStreamPrepareHeader(hAStream, &ash, 0L) != MMSYSERR_NOERROR) goto OnError; + if (theApp.GetACMConvert().AcmStreamPrepareHeader(hAStream, &ash, 0L) != MMSYSERR_NOERROR) goto OnError; bPrepared = true; // Creating the output file if ((f = fopen(m_lpszFileName, "wb")) == NULL) @@ -1080,7 +1080,7 @@ ullSamples += lRead; ash.cbSrcLength = lRead * wfxSrc.nBlockAlign + WAVECONVERTBUFSIZE - pcmBufSize; ash.cbDstLengthUsed = 0; - if (theApp.AcmStreamConvert(hAStream, &ash, (lRead) ? ACM_STREAMCONVERTF_BLOCKALIGN : ACM_STREAMCONVERTF_END) != MMSYSERR_NOERROR) break; + if (theApp.GetACMConvert().AcmStreamConvert(hAStream, &ash, (lRead) ? ACM_STREAMCONVERTF_BLOCKALIGN : ACM_STREAMCONVERTF_END) != MMSYSERR_NOERROR) break; do { if (::PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE)) @@ -1152,9 +1152,9 @@ fclose(f); if (!m_bAbort) retval = IDOK; OnError: - if (bPrepared) theApp.AcmStreamUnprepareHeader(hAStream, &ash, 0L); - if (hAStream != NULL) theApp.AcmStreamClose(hAStream, 0L); - if (hADriver != NULL) theApp.AcmDriverClose(hADriver, 0L); + if (bPrepared) theApp.GetACMConvert().AcmStreamUnprepareHeader(hAStream, &ash, 0L); + if (hAStream != NULL) theApp.GetACMConvert().AcmStreamClose(hAStream, 0L); + if (hADriver != NULL) theApp.GetACMConvert().AcmDriverClose(hADriver, 0L); if (pcmBuffer) delete[] pcmBuffer; if (dstBuffer) delete[] dstBuffer; //rewbs: reduce to normal priority during debug for easier hang debugging Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-22 14:14:03 UTC (rev 992) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-22 18:21:40 UTC (rev 993) @@ -1,4 +1,3 @@ -MB_ICONERROR // mptrack.cpp : Defines the class behaviors for the application. // @@ -13,14 +12,13 @@ #include "vstplug.h" #include "CreditStatic.h" #include "hyperEdit.h" -#include "bladedll.h" #include "commctrl.h" #include "version.h" #include "test/test.h" -#include <shlwapi.h> #include <afxadv.h> #include "UpdateCheck.h" #include "../soundlib/StringFixer.h" +#include "dbghelp.h" // rewbs.memLeak #define _CRTDBG_MAP_ALLOC @@ -596,12 +594,8 @@ m_pModTemplate = NULL; m_pPluginManager = NULL; m_bInitialized = FALSE; - m_bLayer3Present = FALSE; m_bExWaveSupport = FALSE; m_bDebugMode = FALSE; - m_hBladeEnc = NULL; - m_hLameEnc = NULL; - m_hACMInst = NULL; m_hAlternateResourceHandle = NULL; m_szConfigFileName[0] = 0; for (UINT i=0; i<MAX_DLS_BANKS; i++) gpDLSBanks[i] = NULL; @@ -645,17 +639,6 @@ ///////////////////////////////////////////////////////////////////////////// // CTrackApp initialization -void Terminate_AppThread() -//---------------------------------------------- -{ - //TODO: Why does this not get called. - AfxMessageBox("Application thread terminated unexpectedly. Attempting to shut down audio device"); - CMainFrame* pMainFrame = CMainFrame::GetMainFrame(); - if (pMainFrame->gpSoundDevice) pMainFrame->gpSoundDevice->Reset(); - pMainFrame->audioCloseDevice(); - exit(-1); -} - #ifdef WIN32 // Legacy stuff // Move a config file called sFileName from the App's directory (or one of its sub directories specified by sSubDir) to // %APPDATA%. If specified, it will be renamed to sNewFileName. Existing files are never overwritten. @@ -802,8 +785,6 @@ //---------------------------- { - set_terminate(Terminate_AppThread); - // Initialize OLE MFC support AfxOleInit(); // Standard initialization @@ -906,7 +887,7 @@ // Initialize ACM Support if (GetProfileInt("Settings", "DisableACM", 0)) cmdInfo.m_bNoAcm = true; - if (!cmdInfo.m_bNoMp3) InitializeACM(cmdInfo.m_bNoAcm); + if (!cmdInfo.m_bNoMp3) GetACMConvert().InitializeACM(cmdInfo.m_bNoAcm); // Initialize DXPlugins if (!cmdInfo.m_bNoPlugins) InitializeDXPlugins(); @@ -987,7 +968,7 @@ UninitializeDXPlugins(); // Uninitialize ACM - UninitializeACM(); + GetACMConvert().UninitializeACM(); return CWinApp::ExitInstance(); } @@ -2294,534 +2275,6 @@ } -///////////////////////////////////////////////////////////////////////////////////////// -// MPEG Layer-3 Functions (through ACM - access to LAMEenc and BLADEenc is emulated through the ACM interface) - -typedef struct BLADEENCSTREAMINFO -{ - BE_CONFIG beCfg; - LONGLONG dummy; - DWORD dwInputSamples; - DWORD dwOutputSamples; - HBE_STREAM hBeStream; - SHORT *pPCMBuffer; - DWORD dwReadPos; -} BLADEENCSTREAMINFO, *PBLADEENCSTREAMINFO; - -static PBLADEENCSTREAMINFO gpbeBladeCfg = NULL; -static PBLADEENCSTREAMINFO gpbeLameCfg = NULL; - -#define TRAP_ACM_FAULTS - -#ifdef TRAP_ACM_FAULTS -void CTrackApp::AcmExceptionHandler() -{ - theApp.m_hACMInst = NULL; - theApp.WriteProfileInt("Settings", "DisableACM", 1); -} -#endif - -BOOL CTrackApp::InitializeACM(BOOL bNoAcm) -//---------------------------------------- -{ - DWORD (ACMAPI *pfnAcmGetVersion)(void); - DWORD dwVersion; - UINT fuErrorMode; - BOOL bOk = FALSE; - - fuErrorMode = SetErrorMode(SEM_NOOPENFILEERRORBOX); - try { - m_hBladeEnc = LoadLibrary(TEXT("BLADEENC.DLL")); - m_hLameEnc = LoadLibrary(TEXT("LAME_ENC.DLL")); - } catch(...) {} - if (!bNoAcm) - { - #ifdef TRAP_ACM_FAULTS - try { - #endif - m_hACMInst = LoadLibrary(TEXT("MSACM32.DLL")); - #ifdef TRAP_ACM_FAULTS - } catch(...) {} - #endif - } - SetErrorMode(fuErrorMode); - if (m_hBladeEnc != NULL) - { - BEVERSION pfnBeVersion = (BEVERSION)GetProcAddress(m_hBladeEnc, TEXT_BEVERSION); - if (!pfnBeVersion) - { - FreeLibrary(m_hBladeEnc); - m_hBladeEnc = NULL; - } else - { - m_bLayer3Present = TRUE; - bOk = TRUE; - } - } - if (m_hLameEnc != NULL) - { - BEVERSION pfnBeVersion = (BEVERSION)GetProcAddress(m_hLameEnc, TEXT_BEVERSION); - if (!pfnBeVersion) - { - FreeLibrary(m_hLameEnc); - m_hLameEnc = NULL; - } else - { - m_bLayer3Present = TRUE; - bOk = TRUE; - } - } - if ((m_hACMInst < (HINSTANCE)HINSTANCE_ERROR) || (!m_hACMInst)) - { - m_hACMInst = NULL; - return bOk; - } -#ifdef TRAP_ACM_FAULTS - try { -#endif - *(FARPROC *)&pfnAcmGetVersion = GetProcAddress(m_hACMInst, "acmGetVersion"); - dwVersion = 0; - if (pfnAcmGetVersion) dwVersion = pfnAcmGetVersion(); - if (HIWORD(dwVersion) < 0x0200) - { - FreeLibrary(m_hACMInst); - m_hACMInst = NULL; - return bOk; - } - // Load Function Pointers - m_pfnAcmFormatEnum = (PFNACMFORMATENUM)GetProcAddress(m_hACMInst, "acmFormatEnumA"); - // Enumerate formats - if (m_pfnAcmFormatEnum) - { - ACMFORMATDETAILS afd; - BYTE wfx[256]; - WAVEFORMATEX *pwfx = (WAVEFORMATEX *)&wfx; - - MemsetZero(afd); - MemsetZero(*pwfx); - afd.cbStruct = sizeof(ACMFORMATDETAILS); - afd.dwFormatTag = WAVE_FORMAT_PCM; - afd.pwfx = pwfx; - afd.cbwfx = sizeof(wfx); - pwfx->wFormatTag = WAVE_FORMAT_PCM; - pwfx->nChannels = 2; - pwfx->nSamplesPerSec = 44100; - pwfx->wBitsPerSample = 16; - pwfx->nBlockAlign = (WORD)((pwfx->nChannels * pwfx->wBitsPerSample) / 8); - pwfx->nAvgBytesPerSec = pwfx->nSamplesPerSec * pwfx->nBlockAlign; - m_pfnAcmFormatEnum(NULL, &afd, AcmFormatEnumCB, NULL, ACM_FORMATENUMF_CONVERT); - } -#ifdef TRAP_ACM_FAULTS - } catch(...){} -#endif - return TRUE; -} - - -BOOL CTrackApp::UninitializeACM() -//------------------------------- -{ - if (m_hACMInst) - { - FreeLibrary(m_hACMInst); - m_hACMInst = NULL; - } - if (m_hLameEnc) - { - FreeLibrary(m_hLameEnc); - m_hLameEnc = NULL; - } - if (m_hBladeEnc) - { - FreeLibrary(m_hBladeEnc); - m_hBladeEnc = NULL; - } - return TRUE; -} - - -MMRESULT CTrackApp::AcmFormatEnum(HACMDRIVER had, LPACMFORMATDETAILSA pafd, ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum) -//--------------------------------------------------------------------------------------------------------------------------------------- -{ - MMRESULT err = MMSYSERR_INVALPARAM; - if ((m_hBladeEnc) || (m_hLameEnc)) - { - HACMDRIVER hBlade = (HACMDRIVER)&m_hBladeEnc; - HACMDRIVER hLame = (HACMDRIVER)&m_hLameEnc; - if (((had == hBlade) || (had == hLame) || (had == NULL)) && (pafd) && (fnCallback) - && (fdwEnum & ACM_FORMATENUMF_CONVERT) && (pafd->dwFormatTag == WAVE_FORMAT_PCM)) - { - ACMFORMATDETAILS afd; - MPEGLAYER3WAVEFORMAT wfx; - - afd.dwFormatIndex = 0; - for (UINT iFmt=0; iFmt<0x40; iFmt++) - { - afd.cbStruct = sizeof(afd); - afd.dwFormatTag = WAVE_FORMAT_MPEGLAYER3; - afd.fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; - afd.pwfx = (LPWAVEFORMATEX)&wfx; - afd.cbwfx = sizeof(wfx); - wfx.wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; - wfx.wfx.nChannels = (WORD)((iFmt & 0x20) ? 1 : 2); - wfx.wfx.nSamplesPerSec = 0; - wfx.wfx.nBlockAlign = 1; - wfx.wfx.wBitsPerSample = 0; - wfx.wfx.cbSize = MPEGLAYER3_WFX_EXTRA_BYTES; - wfx.wID = MPEGLAYER3_ID_MPEG; - wfx.fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; - wfx.nBlockSize = 384; - wfx.nFramesPerBlock = 1; - wfx.nCodecDelay = 1000; - switch((iFmt >> 3) & 0x03) - { - case 0x00: wfx.wfx.nSamplesPerSec = 48000; break; - case 0x01: wfx.wfx.nSamplesPerSec = 44100; break; - case 0x02: wfx.wfx.nSamplesPerSec = 32000; break; - } - switch(iFmt & 7) - { - case 5: wfx.wfx.nAvgBytesPerSec = 320/8; break; - case 4: wfx.wfx.nAvgBytesPerSec = 64/8; break; - case 3: wfx.wfx.nAvgBytesPerSec = 96/8; break; - case 2: wfx.wfx.nAvgBytesPerSec = 128/8; break; - case 1: if (wfx.wfx.nChannels == 2) { wfx.wfx.nAvgBytesPerSec = 192/8; break; } - case 0: if (wfx.wfx.nChannels == 2) { wfx.wfx.nAvgBytesPerSec = 256/8; break; } - default: wfx.wfx.nSamplesPerSec = 0; - } - wsprintf(afd.szFormat, "%dkbps, %dHz, %s", wfx.wfx.nAvgBytesPerSec*8, wfx.wfx.nSamplesPerSec, (wfx.wfx.nChannels == 2) ? "stereo" : "mono"); - if (wfx.wfx.nSamplesPerSec) - { - if (m_hBladeEnc) fnCallback((HACMDRIVERID)hBlade, &afd, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC); - if (m_hLameEnc) fnCallback((HACMDRIVERID)hLame, &afd, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC); - afd.dwFormatIndex++; - } - } - err = MMSYSERR_NOERROR; - } - } - if (m_pfnAcmFormatEnum) - { - err = m_pfnAcmFormatEnum(had, pafd, fnCallback, dwInstance, fdwEnum); - } - return err; -} - - -BOOL CTrackApp::AcmFormatEnumCB(HACMDRIVERID, LPACMFORMATDETAILS pafd, DWORD, DWORD fdwSupport) -//--------------------------------------------------------------------------------------------- -{ - if ((pafd) && (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC)) - { - if (pafd->dwFormatTag == WAVE_FORMAT_MPEGLAYER3) theApp.m_bLayer3Present = TRUE; - } - return TRUE; -} - - -MMRESULT CTrackApp::AcmDriverOpen(LPHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen) -//------------------------------------------------------------------------------------- -{ - if ((m_hBladeEnc) && (hadid == (HACMDRIVERID)&m_hBladeEnc)) - { - *phad = (HACMDRIVER)&m_hBladeEnc; - return MMSYSERR_NOERROR; - } - if ((m_hLameEnc) && (hadid == (HACMDRIVERID)&m_hLameEnc)) - { - *phad = (HACMDRIVER)&m_hLameEnc; - return MMSYSERR_NOERROR; - } - if (m_hACMInst) - { - PFNACMDRIVEROPEN pfnAcmDriverOpen = (PFNACMDRIVEROPEN)GetProcAddress(m_hACMInst, "acmDriverOpen"); - if (pfnAcmDriverOpen) return pfnAcmDriverOpen(phad, hadid, fdwOpen); - } - return MMSYSERR_INVALPARAM; -} - - -MMRESULT CTrackApp::AcmDriverClose(HACMDRIVER had, DWORD fdwClose) -//---------------------------------------------------------------- -{ - if ((m_hBladeEnc) && (had == (HACMDRIVER)&m_hBladeEnc)) - { - return MMSYSERR_NOERROR; - } - if ((m_hLameEnc) && (had == (HACMDRIVER)&m_hLameEnc)) - { - return MMSYSERR_NOERROR; - } - if (m_hACMInst) - { - PFNACMDRIVERCLOSE pfnAcmDriverClose = (PFNACMDRIVERCLOSE)GetProcAddress(m_hACMInst, "acmDriverClose"); - if (pfnAcmDriverClose) return pfnAcmDriverClose(had, fdwClose); - } - return MMSYSERR_INVALPARAM; -} - - -MMRESULT CTrackApp::AcmDriverDetails(HACMDRIVERID hadid, LPACMDRIVERDETAILS padd, DWORD fdwDetails) -//------------------------------------------------------------------------------------------------- -{ - if (((m_hBladeEnc) && (hadid == (HACMDRIVERID)(&m_hBladeEnc))) - || ((m_hLameEnc) && (hadid == (HACMDRIVERID)(&m_hLameEnc)))) - { - if (!padd) return MMSYSERR_INVALPARAM; - padd->cbStruct = sizeof(ACMDRIVERDETAILS); - padd->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC; - padd->fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED; - padd->wMid = 0; - padd->wPid = 0; - padd->vdwACM = 0x04020000; - padd->vdwDriver = 0x04020000; - padd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; - padd->cFormatTags = 1; - padd->cFilterTags = 0; - padd->hicon = NULL; - strcpy(padd->szShortName, (hadid == (HACMDRIVERID)(&m_hBladeEnc)) ? "BladeEnc MP3" : "LAME Encoder"); - strcpy(padd->szLongName, padd->szShortName); - padd->szCopyright[0] = 0; - padd->szLicensing[0] = 0; - padd->szFeatures[0] = 0; - return MMSYSERR_NOERROR; - } - if (m_hACMInst) - { - PFNACMDRIVERDETAILS pfnAcmDriverDetails = (PFNACMDRIVERDETAILS)GetProcAddress(m_hACMInst, "acmDriverDetailsA"); - if (pfnAcmDriverDetails) return pfnAcmDriverDetails(hadid, padd, fdwDetails); - } - return MMSYSERR_INVALPARAM; -} - - -MMRESULT CTrackApp::AcmStreamOpen( - LPHACMSTREAM phas, // pointer to stream handle - HACMDRIVER had, // optional driver handle - LPWAVEFORMATEX pwfxSrc, // source format to convert - LPWAVEFORMATEX pwfxDst, // required destination format - LPWAVEFILTER pwfltr, // optional filter - DWORD dwCallback, // callback - DWORD dwInstance, // callback instance data - DWORD fdwOpen) // ACM_STREAMOPENF_* and CALLBACK_* -//------------------------------------------------------------------------- -{ - PBLADEENCSTREAMINFO *ppbeCfg = NULL; - HINSTANCE hLib = NULL; - - if ((m_hBladeEnc) && (had == (HACMDRIVER)&m_hBladeEnc)) - { - ppbeCfg = &gpbeBladeCfg; - hLib = m_hBladeEnc; - } - if ((m_hLameEnc) && (had == (HACMDRIVER)&m_hLameEnc)) - { - ppbeCfg = &gpbeLameCfg; - hLib = m_hLameEnc; - } - if ((ppbeCfg) && (hLib)) - { - BEINITSTREAM pfnbeInitStream = (BEINITSTREAM)GetProcAddress(hLib, TEXT_BEINITSTREAM); - if (!pfnbeInitStream) return MMSYSERR_INVALPARAM; - PBLADEENCSTREAMINFO pbeCfg = new BLADEENCSTREAMINFO; - if ((pbeCfg) && (pwfxSrc) && (pwfxDst) && (pwfxSrc->nChannels == pwfxDst->nChannels) - && (pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) && (pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) - && (pwfxSrc->wBitsPerSample == 16)) - { - pbeCfg->dwInputSamples = 2048; - pbeCfg->dwOutputSamples = 2048; - pbeCfg->beCfg.dwConfig = BE_CONFIG_MP3; - pbeCfg->beCfg.format.mp3.dwSampleRate = pwfxDst->nSamplesPerSec; // 48000, 44100 and 32000 allowed - pbeCfg->beCfg.format.mp3.byMode = (BYTE)((pwfxSrc->nChannels == 2) ? BE_MP3_MODE_STEREO : BE_MP3_MODE_MONO); - pbeCfg->beCfg.format.mp3.wBitrate = (WORD)(pwfxDst->nAvgBytesPerSec * 8); // 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 and 320 allowed - pbeCfg->beCfg.format.mp3.bPrivate = FALSE; - pbeCfg->beCfg.format.mp3.bCRC = FALSE; - pbeCfg->beCfg.format.mp3.bCopyright = FALSE; - pbeCfg->beCfg.format.mp3.bOriginal = TRUE; - pbeCfg->hBeStream = NULL; - if (pfnbeInitStream(&pbeCfg->beCfg, &pbeCfg->dwInputSamples, &pbeCfg->dwOutputSamples, &pbeCfg->hBeStream) == BE_ERR_SUCCESSFUL) - { - *phas = (HACMSTREAM)had; - *ppbeCfg = pbeCfg; - pbeCfg->pPCMBuffer = (SHORT *)GlobalAllocPtr(GHND, pbeCfg->dwInputSamples * sizeof(SHORT)); - pbeCfg->dwReadPos = 0; - return MMSYSERR_NOERROR; - } - } - if (pbeCfg) delete pbeCfg; - return MMSYSERR_INVALPARAM; - } - if (m_hACMInst) - { - PFNACMSTREAMOPEN pfnAcmStreamOpen = (PFNACMSTREAMOPEN)GetProcAddress(m_hACMInst, "acmStreamOpen"); - if (pfnAcmStreamOpen) return pfnAcmStreamOpen(phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen); - } - return MMSYSERR_INVALPARAM; -} - - -MMRESULT CTrackApp::AcmStreamClose(HACMSTREAM has, DWORD fdwClose) -//---------------------------------------------------------------- -{ - if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) - || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) - { - HINSTANCE hLib = *(HINSTANCE *)has; - PBLADEENCSTREAMINFO pbeCfg = (has == (HACMSTREAM)&m_hBladeEnc) ? gpbeBladeCfg : gpbeLameCfg; - BECLOSESTREAM pfnbeCloseStream = (BECLOSESTREAM)GetProcAddress(hLib, TEXT_BECLOSESTREAM); - if ((pbeCfg) && (pfnbeCloseStream)) - { - pfnbeCloseStream(pbeCfg->hBeStream); - if (pbeCfg->pPCMBuffer) - { - GlobalFreePtr(pbeCfg->pPCMBuffer); - pbeCfg->pPCMBuffer = NULL; - } - delete pbeCfg; - pbeCfg = NULL; - return MMSYSERR_NOERROR; - } - return MMSYSERR_INVALPARAM; - } - if (m_hACMInst) - { - PFNACMSTREAMCLOSE pfnAcmStreamClose = (PFNACMSTREAMCLOSE)GetProcAddress(m_hACMInst, "acmStreamClose"); - if (pfnAcmStreamClose) return pfnAcmStreamClose(has, fdwClose); - } - return MMSYSERR_INVALPARAM; -} - - -MMRESULT CTrackApp::AcmStreamSize(HACMSTREAM has, DWORD cbInput, LPDWORD pdwOutputBytes, DWORD fdwSize) -//----------------------------------------------------------------------------------------------------- -{ - if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) - || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) - { - PBLADEENCSTREAMINFO pbeCfg = (has == (HACMSTREAM)&m_hBladeEnc) ? gpbeBladeCfg : gpbeLameCfg; - - if ((pbeCfg) && (pdwOutputBytes)) - { - if (fdwSize & ACM_STREAMSIZEF_DESTINATION) - { - *pdwOutputBytes = pbeCfg->dwOutputSamples * sizeof(short); - } else - if (fdwSize & ACM_STREAMSIZEF_SOURCE) - { - *pdwOutputBytes = pbeCfg->dwInputSamples * sizeof(short); - } - return MMSYSERR_NOERROR; - } - return MMSYSERR_INVALPARAM; - } - if (m_hACMInst) - { - if (fdwSize & ACM_STREAMSIZEF_DESTINATION) // Why does acmStreamSize return ACMERR_NOTPOSSIBLE in this case? - return MMSYSERR_NOERROR; - PFNACMSTREAMSIZE pfnAcmStreamSize = (PFNACMSTREAMSIZE)GetProcAddress(m_hACMInst, "acmStreamSize"); - if (pfnAcmStreamSize) return pfnAcmStreamSize(has, cbInput, pdwOutputBytes, fdwSize); - } - return MMSYSERR_INVALPARAM; -} - - -MMRESULT CTrackApp::AcmStreamPrepareHeader(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwPrepare) -//-------------------------------------------------------------------------------------------------- -{ - if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) - || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) - { - pash->fdwStatus = ACMSTREAMHEADER_STATUSF_PREPARED; - return MMSYSERR_NOERROR; - } - if (m_hACMInst) - { - PFNACMSTREAMCONVERT pfnAcmStreamPrepareHeader = (PFNACMSTREAMCONVERT)GetProcAddress(m_hACMInst, "acmStreamPrepareHeader"); - if (pfnAcmStreamPrepareHeader) return pfnAcmStreamPrepareHeader(has, pash, fdwPrepare); - } - return MMSYSERR_INVALPARAM; -} - - -MMRESULT CTrackApp::AcmStreamUnprepareHeader(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwUnprepare) -//------------------------------------------------------------------------------------------------------ -{ - if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) - || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) - { - pash->fdwStatus &= ~ACMSTREAMHEADER_STATUSF_PREPARED; - return MMSYSERR_NOERROR; - } - if (m_hACMInst) - { - PFNACMSTREAMCONVERT pfnAcmStreamUnprepareHeader = (PFNACMSTREAMCONVERT)GetProcAddress(m_hACMInst, "acmStreamUnprepareHeader"); - if (pfnAcmStreamUnprepareHeader) return pfnAcmStreamUnprepareHeader(has, pash, fdwUnprepare); - } - return MMSYSERR_INVALPARAM; -} - - -MMRESULT CTrackApp::AcmStreamConvert(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwConvert) -//-------------------------------------------------------------------------------------------- -{ - static BEENCODECHUNK pfnbeEncodeChunk = NULL; - static BEDEINITSTREAM pfnbeDeinitStream = NULL; - static HINSTANCE hInstEncode = NULL; - - if (((m_hBladeEnc) && (has == (HACMSTREAM)&m_hBladeEnc)) - || ((m_hLameEnc) && (has == (HACMSTREAM)&m_hLameEnc))) - { - PBLADEENCSTREAMINFO pbeCfg = (has == (HACMSTREAM)&m_hBladeEnc) ? gpbeBladeCfg : gpbeLameCfg; - HINSTANCE hLib = *(HINSTANCE *)has; - - if (hInstEncode != hLib) - { - pfnbeEncodeChunk = (BEENCODECHUNK)GetProcAddress(hLib, TEXT_BEENCODECHUNK); - pfnbeDeinitStream = (BEDEINITSTREAM)GetProcAddress(hLib, TEXT_BEDEINITSTREAM); - hInstEncode = hLib; - } - pash->fdwStatus |= ACMSTREAMHEADER_STATUSF_DONE; - if (fdwConvert & ACM_STREAMCONVERTF_END) - { - if ((pfnbeDeinitStream) && (pbeCfg)) - { - pfnbeDeinitStream(pbeCfg->hBeStream, pash->pbDst, &pash->cbDstLengthUsed); - return MMSYSERR_NOERROR; - } - } else - { - if ((pfnbeEncodeChunk) && (pbeCfg)) - { - DWORD dwBytesLeft = pbeCfg->dwInputSamples*2 - pbeCfg->dwReadPos; - if (!dwBytesLeft) - { - dwBytesLeft = pbeCfg->dwInputSamples*2; - pbeCfg->dwReadPos = 0; - } - if (dwBytesLeft > pash->cbSrcLength) dwBytesLeft = pash->cbSrcLength; - memcpy(&pbeCfg->pPCMBuffer[pbeCfg->dwReadPos/2], pash->pbSrc, dwBytesLeft); - pbeCfg->dwReadPos += dwBytesLeft; - pash->cbSrcLengthUsed = dwBytesLeft; - pash->cbDstLengthUsed = 0; - if (pbeCfg->dwReadPos == pbeCfg->dwInputSamples*2) - { - if (pfnbeEncodeChunk(pbeCfg->hBeStream, pbeCfg->dwInputSamples, pbeCfg->pPCMBuffer, pash->pbDst, &pash->cbDstLengthUsed) != 0) return MMSYSERR_INVALPARAM; - pbeCfg->dwReadPos = 0; - } - return MMSYSERR_NOERROR; - } - } - return MMSYSERR_INVALPARAM; - } - if (m_hACMInst) - { - PFNACMSTREAMCONVERT pfnAcmStreamConvert = (PFNACMSTREAMCONVERT)GetProcAddress(m_hACMInst, "acmStreamConvert"); - if (pfnAcmStreamConvert) return pfnAcmStreamConvert(has, pash, fdwConvert); - } - return MMSYSERR_INVALPARAM; -} - - /////////////////////////////////////////////////////////////////////////////////// // // DirectX Plugins @@ -2974,11 +2427,20 @@ #ifdef WIN32 + +typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam + ); + // Try to close the audio device and rescue unsaved work if an unhandled exception occours... -LONG CTrackApp::UnhandledExceptionFilter(_EXCEPTION_POINTERS *) -//------------------------------------------------------------- +LONG CTrackApp::UnhandledExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo) +//--------------------------------------------------------------------------- { CMainFrame* pMainFrame = CMainFrame::GetMainFrame(); + const HWND window = (pMainFrame ? pMainFrame->m_hWnd : NULL); + // Shut down audio device... if(pMainFrame) { @@ -2986,6 +2448,46 @@ pMainFrame->audioCloseDevice(); } + const CString timestampDir = (CTime::GetCurrentTime()).Format("%Y-%m-%d %H.%M.%S\\"); + CString baseRescuePath; + { + // Create a crash directory + TCHAR tempPath[_MAX_PATH]; + GetTempPath(CountOf(tempPath), tempPath); + baseRescuePath.Format("%sOpenMPT Crash Files\\", tempPath); + CreateDirectory(baseRescuePath, nullptr); + baseRescuePath.Append(timestampDir); + if(!CreateDirectory(baseRescuePath, nullptr)) + { + ::MessageBox(window, "A crash has been detected and OpenMPT will be closed.\nOpenMPT was unable to create a directory for saving debug information and modified files to.", "OpenMPT Crash", MB_ICONERROR); + } + } + + // Create minidump... + HMODULE hDll = ::LoadLibrary("DBGHELP.DLL"); + if (hDll) + { + MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump"); + if (pDump) + { + const CString filename = baseRescuePath + "crash.dmp"; + + HANDLE hFile = ::CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile != INVALID_HANDLE_VALUE) + { + _MINIDUMP_EXCEPTION_INFORMATION ExInfo; + + ExInfo.ThreadId = ::GetCurrentThreadId(); + ExInfo.ExceptionPointers = pExceptionInfo; + ExInfo.ClientPointers = NULL; + + pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); + ::CloseHandle(hFile); + } + } + ::FreeLibrary(hDll); + } + // Rescue modified files... CDocTemplate *pDocTmpl = theApp.GetModDocTemplate(); if(pDocTmpl) @@ -2993,9 +2495,6 @@ POSITION pos = pDocTmpl->GetFirstDocPosition(); CDocument *pDoc; - const HWND window = (pMainFrame ? pMainFrame->m_hWnd : NULL); - const CString timestampDir = (CTime::GetCurrentTime()).Format("%Y-%m-%d %H.%M.%S\\"); - CString baseRescuePath; int numFiles = 0; while((pos != NULL) && ((pDoc = pDocTmpl->GetNextDoc(pos)) != NULL)) @@ -3005,17 +2504,8 @@ { if(numFiles == 0) { - // Need to create a rescue directory first - TCHAR tempPath[_MAX_PATH]; - GetTempPath(CountOf(tempPath), tempPath); - baseRescuePath.Format("%sOpenMPT Crash Files\\", tempPath); - CreateDirectory(baseRescuePath, nullptr); - baseRescuePath.Append(timestampDir); - if(!CreateDirectory(baseRescuePath, nullptr)) - { - ::MessageBox(window, "A crash has been detected and OpenMPT will be closed.\nThere are still some modified files open, but OpenMPT could not create a directory for rescueing them.", "OpenMPT Crash", MB_ICONERROR); - break; - } + // Show the rescue directory in Explorer... + OpenDirectory(baseRescuePath); } CString filename; filename.Format("%s%d_%s.%s", baseRescuePath, ++numFiles, pModDoc->GetTitle(), pModDoc->GetSoundFile()->GetModSpecifications().fileExtension); @@ -3028,7 +2518,6 @@ CString message; message.Format("A crash has been detected and OpenMPT will be closed.\n%d modified file%s been rescued to\n\n%s\n\nNote: It cannot be guaranteed that rescued files are still intact.", numFiles, (numFiles == 1 ? " has" : "s have"), baseRescuePath); ::MessageBox(window, message, "OpenMPT Crash", MB_ICONERROR); - OpenDirectory(baseRescuePath); } } Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2011-08-22 14:14:03 UTC (rev 992) +++ trunk/OpenMPT/mptrack/Mptrack.h 2011-08-22 18:21:40 UTC (rev 993) @@ -14,26 +14,13 @@ #include "resource.h" // main symbols #include "../soundlib/Sndfile.h" +#include "ACMConvert.h" #include <windows.h> class CModDoc; class CVstPluginManager; ///////////////////////////////////////////////////////////////////////////// -// ACM Functions (for dynamic linking) - -typedef VOID (ACMAPI *PFNACMMETRICS)(HACMOBJ, UINT, LPVOID); -typedef MMRESULT (ACMAPI *PFNACMFORMATENUM)(HACMDRIVER, LPACMFORMATDETAILSA, ACMFORMATENUMCBA, DWORD dwInstance, DWORD fdwEnum); -typedef MMRESULT (ACMAPI *PFNACMDRIVEROPEN)(LPHACMDRIVER, HACMDRIVERID, DWORD); -typedef MMRESULT (ACMAPI *PFNACMDRIVERCLOSE)(HACMDRIVER, DWORD); -typedef MMRESULT (ACMAPI *PFNACMSTREAMOPEN)(LPHACMSTREAM, HACMDRIVER, LPWAVEFORMATEX, LPWAVEFORMATEX, LPWAVEFILTER, DWORD, DWORD, DWORD); -typedef MMRESULT (ACMAPI *PFNACMSTREAMCLOSE)(HACMSTREAM, DWORD); -typedef MMRESULT (ACMAPI *PFNACMSTREAMSIZE)(HACMSTREAM, DWORD, LPDWORD, DWORD); -typedef MMRESULT (ACMAPI *PFNACMSTREAMCONVERT)(HACMSTREAM, LPACMSTREAMHEADER, DWORD); -typedef MMRESULT (ACMAPI *PFNACMDRIVERDETAILS)(HACMDRIVERID, LPACMDRIVERDETAILS, DWORD); - - -///////////////////////////////////////////////////////////////////////////// // 16-colors DIB typedef struct MODPLUGDIB { @@ -141,7 +128,7 @@ protected: CMultiDocTemplate *m_pModTemplate; CVstPluginManager *m_pPluginManager; - BOOL m_bInitialized, m_bLayer3Present, m_bExWaveSupport, m_bDebugMode; + BOOL m_bInitialized, m_bExWaveSupport, m_bDebugMode; DWORD m_dwTimeStarted, m_dwLastPluginIdleCall; HANDLE m_hAlternateResourceHandle; // Default macro configuration @@ -152,6 +139,7 @@ TCHAR m_szPluginCacheFileName[_MAX_PATH]; TCHAR m_szStringsFileName[_MAX_PATH]; static bool m_bPortableMode; + ACMConvert acmConvert; public: CTrackApp(); @@ -188,7 +176,7 @@ void SetDefaultMidiMacro(const MODMIDICFG *pcfg) { m_MidiCfg = *pcfg; } void LoadChords(PMPTCHORD pChords); void SaveChords(PMPTCHORD pChords); - BOOL CanEncodeLayer3() const { return m_bLayer3Present; } + BOOL CanEncodeLayer3() const { return acmConvert.IsLayer3Present(); } BOOL IsWaveExEnabled() const { return m_bExWaveSupport; } BOOL IsDebug() const { return m_bDebugMode; } LPCTSTR GetConfigFileName() const { return m_szConfigFileName; } @@ -207,6 +195,8 @@ /// Removes item from MRU-list; most recent item has index zero. void RemoveMruItem(const int nItem); + ACMConvert &GetACMConvert() { return acmConvert; }; + // Splash Screen protected: VOID StartSplashScreen(); @@ -217,32 +207,6 @@ VOID ImportLocalizedStrings(); BOOL GetLocalizedString(LPCSTR pszName, LPSTR pszStr, UINT cbSize); -// ACM and MPEG Layer3 support -protected: - HINSTANCE m_hACMInst; - HINSTANCE m_hBladeEnc, m_hLameEnc; - PFNACMFORMATENUM m_pfnAcmFormatEnum; - -public: - BOOL InitializeACM(BOOL bNoAcm=FALSE); - BOOL UninitializeACM(); - BOOL InitializeDXPlugins(); - BOOL UninitializeDXPlugins(); - static void AcmExceptionHandler(); - MMRESULT AcmFormatEnum(HACMDRIVER had, LPACMFORMATDETAILSA pafd, ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum); - MMRESULT AcmDriverOpen(LPHACMDRIVER, HACMDRIVERID, DWORD); - MMRESULT AcmDriverDetails(HACMDRIVERID hadid, LPACMDRIVERDETAILS padd, DWORD fdwDetails); - MMRESULT AcmDriverClose(HACMDRIVER, DWORD); - MMRESULT AcmStreamOpen(LPHACMSTREAM, HACMDRIVER, LPWAVEFORMATEX, LPWAVEFORMATEX, LPWAVEFILTER pwfltr, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); - MMRESULT AcmStreamClose(HACMSTREAM, DWORD); - MMRESULT AcmStreamSize(HACMSTREAM has, DWORD cbInput, LPDWORD pdwOutputBytes, DWORD fdwSize); - MMRESULT AcmStreamPrepareHeader(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwPrepare); - MMRESULT AcmStreamUnprepareHeader(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwUnprepare); - MMRESULT AcmStreamConvert(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwConvert); - -protected: - static BOOL CALLBACK AcmFormatEnumCB(HACMDRIVERID, LPACMFORMATDETAILS, DWORD, DWORD); - // Overrides public: // ClassWizard generated virtual function overrides @@ -274,9 +238,14 @@ DECLARE_MESSAGE_MAP() virtual LRESULT ProcessWndProcException(CException* e, const MSG* pMsg); -private: +protected: static void LoadRegistryDLS(); +protected: + BOOL InitializeDXPlugins(); + BOOL UninitializeDXPlugins(); + + #ifdef WIN32 // Legacy stuff bool MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH] = "", TCHAR sNewFileName[_MAX_PATH] = ""); #endif // WIN32 @@ -284,7 +253,7 @@ // Exception handling #ifdef WIN32 public: - static LONG WINAPI UnhandledExceptionFilter(_EXCEPTION_POINTERS *); + static LONG WINAPI UnhandledExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo); #endif // WIN32 }; Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2011-08-22 14:14:03 UTC (rev 992) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2011-08-22 18:21:40 UTC (rev 993) @@ -178,6 +178,9 @@ RelativePath=".\AbstractVstEditor.cpp"> </File> <File + RelativePath=".\ACMConvert.cpp"> + </File> + <File RelativePath=".\ArrayUtils.cpp"> </File> <File @@ -660,6 +663,9 @@ RelativePath=".\AbstractVstEditor.h"> </File> <File + RelativePath=".\ACMConvert.h"> + </File> + <File RelativePath=".\ArrayUtils.h"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-08-22 14:14:03 UTC (rev 992) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-08-22 18:21:40 UTC (rev 993) @@ -241,6 +241,10 @@ > </File> <File + RelativePath=".\ACMConvert.cpp" + > + </File> + <File RelativePath=".\ArrayUtils.cpp" > </File> @@ -875,6 +879,10 @@ > </File> <File + RelativePath=".\ACMConvert.h" + > + </File> + <File RelativePath=".\ArrayUtils.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-22 14:14:03 UTC (rev 992) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-22 18:21:40 UTC (rev 993) @@ -117,7 +117,6 @@ <TypeLibraryName>.\Bin/mptrack.tlb</TypeLibraryName> </Midl> <ClCompile> - <AdditionalOptions>/EHsc /O2 %(AdditionalOptions)</AdditionalOptions> <Optimization>MaxSpeed</Optimization> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <AdditionalIncludeDirectories>..\unlha;..\unzip;..\unrar;..\soundlib;..\include;..\xsoundlib;..\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> @@ -137,6 +136,8 @@ <SuppressStartupBanner>false</SuppressStartupBanner> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <CompileAs>Default</CompileAs> + <ExceptionHandling>Async</ExceptionHandling> + <AdditionalOptions>/O2 %(AdditionalOptions)</AdditionalOptions> </ClCompile> <ResourceCompile> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> @@ -165,6 +166,7 @@ </ItemDefinitionGroup> <ItemGroup> <ClCompile Include="AbstractVstEditor.cpp" /> + <ClCompile Include="ACMConvert.cpp" /> <ClCompile Include="ArrayUtils.cpp" /> <ClCompile Include="AutoSaver.cpp" /> <ClCompile Include="ChannelManagerDlg.cpp" /> @@ -314,6 +316,7 @@ <ResourceCompile Include="mptrack.rc" /> </ItemGroup> <ItemGroup> + <ClInclude Include="ACMConvert.h" /> <ClInclude Include="PatternRandomizer.h" /> <ClInclude Include="PatternRandomizerGUI.h" /> <ClInclude Include="PatternRandomizerGUIEffect.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2011-08-22 14:14:03 UTC (rev 992) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2011-08-22 18:21:40 UTC (rev 993) @@ -421,6 +421,9 @@ <ClCompile Include="SelectPluginDialog.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="ACMConvert.cpp"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="AbstractVstEditor.h"> @@ -735,6 +738,9 @@ <ClInclude Include="SelectPluginDialog.h"> <Filter>Header Files\Dialogs</Filter> </ClInclude> + <ClInclude Include="ACMConvert.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-08-22 14:14:03 UTC (rev 992) +++ trunk/OpenMPT/mptrack/version.h 2011-08-22 18:21:40 UTC (rev 993) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 10 +#define VER_MINORMINOR 11 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Th... [truncated message content] |
From: <sag...@us...> - 2011-08-24 15:33:39
|
Revision: 997 http://modplug.svn.sourceforge.net/modplug/?rev=997&view=rev Author: saga-games Date: 2011-08-24 15:33:32 +0000 (Wed, 24 Aug 2011) Log Message: ----------- [Mod] Crash dumps are now named after the thread the crash occured in (f.e. "crash-audio.dmp") [Ref] Moved unhandled exception filtering code to separate file. [Mod] OpenMPT: Version is now 1.20.00.12 Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters trunk/OpenMPT/mptrack/version.h Added Paths: ----------- trunk/OpenMPT/mptrack/ExceptionHandler.cpp trunk/OpenMPT/mptrack/ExceptionHandler.h Added: trunk/OpenMPT/mptrack/ExceptionHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/ExceptionHandler.cpp (rev 0) +++ trunk/OpenMPT/mptrack/ExceptionHandler.cpp 2011-08-24 15:33:32 UTC (rev 997) @@ -0,0 +1,145 @@ +/* + * + * ExceptionHandler.cpp + * -------------------- + * Purpose: Code for handling crashes in OpenMPT. + * Notes : (currently none) + * Authors: OpenMPT Devs + */ + + +#include "stdafx.h" +#include "Mainfrm.h" +#include "snddev.h" +#include "Moddoc.h" +#include "ExceptionHandler.h" +#include "dbghelp.h" + + +void ExceptionHandler::RegisterMainThread() +//----------------------------------------- +{ + ::SetUnhandledExceptionFilter(UnhandledExceptionFilterMain); +} + + +void ExceptionHandler::RegisterAudioThread() +//------------------------------------------ +{ + ::SetUnhandledExceptionFilter(UnhandledExceptionFilterAudio); +} + + +LONG ExceptionHandler::UnhandledExceptionFilterMain(_EXCEPTION_POINTERS *pExceptionInfo) +//-------------------------------------------------------------------------------------- +{ + return UnhandledExceptionFilter(pExceptionInfo, "main"); +} + + +LONG ExceptionHandler::UnhandledExceptionFilterAudio(_EXCEPTION_POINTERS *pExceptionInfo) +//--------------------------------------------------------------------------------------- +{ + return UnhandledExceptionFilter(pExceptionInfo, "audio"); +} + + +typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam + ); + +// Try to close the audio device and rescue unsaved work if an unhandled exception occours... +LONG ExceptionHandler::UnhandledExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo, const CString threadName) +//------------------------------------------------------------------------------------------------------------ +{ + CMainFrame* pMainFrame = CMainFrame::GetMainFrame(); + const HWND window = (pMainFrame ? pMainFrame->m_hWnd : NULL); + + // Shut down audio device... + if(pMainFrame) + { + if(pMainFrame->gpSoundDevice) pMainFrame->gpSoundDevice->Reset(); + pMainFrame->audioCloseDevice(); + } + + const CString timestampDir = (CTime::GetCurrentTime()).Format("%Y-%m-%d %H.%M.%S\\"); + CString baseRescuePath; + { + // Create a crash directory + TCHAR tempPath[_MAX_PATH]; + GetTempPath(CountOf(tempPath), tempPath); + baseRescuePath.Format("%sOpenMPT Crash Files\\", tempPath); + if(!PathIsDirectory(baseRescuePath)) + { + CreateDirectory(baseRescuePath, nullptr); + } + baseRescuePath.Append(timestampDir); + if(!PathIsDirectory(baseRescuePath) && !CreateDirectory(baseRescuePath, nullptr)) + { + ::MessageBox(window, "A crash has been detected and OpenMPT will be closed.\nOpenMPT was unable to create a directory for saving debug information and modified files to.", "OpenMPT Crash", MB_ICONERROR); + } + } + + // Create minidump... + HMODULE hDll = ::LoadLibrary("DBGHELP.DLL"); + if (hDll) + { + MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump"); + if (pDump) + { + const CString filename = baseRescuePath + "crash-" + threadName + ".dmp"; + + HANDLE hFile = ::CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile != INVALID_HANDLE_VALUE) + { + _MINIDUMP_EXCEPTION_INFORMATION ExInfo; + + ExInfo.ThreadId = ::GetCurrentThreadId(); + ExInfo.ExceptionPointers = pExceptionInfo; + ExInfo.ClientPointers = NULL; + + pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); + ::CloseHandle(hFile); + } + } + ::FreeLibrary(hDll); + } + + // Rescue modified files... + CDocTemplate *pDocTmpl = theApp.GetModDocTemplate(); + if(pDocTmpl) + { + POSITION pos = pDocTmpl->GetFirstDocPosition(); + CDocument *pDoc; + + int numFiles = 0; + + while((pos != NULL) && ((pDoc = pDocTmpl->GetNextDoc(pos)) != NULL)) + { + CModDoc *pModDoc = (CModDoc *)pDoc; + if(pModDoc->IsModified() && pModDoc->GetSoundFile() != nullptr) + { + if(numFiles == 0) + { + // Show the rescue directory in Explorer... + CTrackApp::OpenDirectory(baseRescuePath); + } + CString filename; + filename.Format("%s%d_%s.%s", baseRescuePath, ++numFiles, pModDoc->GetTitle(), pModDoc->GetSoundFile()->GetModSpecifications().fileExtension); + pModDoc->OnSaveDocument(filename); + } + } + + if(numFiles > 0) + { + CString message; + message.Format("A crash has been detected in the %s thread and OpenMPT will be closed.\n%d modified file%s been rescued to\n\n%s\n\nNote: It cannot be guaranteed that rescued files are still intact.", threadName, numFiles, (numFiles == 1 ? " has" : "s have"), baseRescuePath); + ::MessageBox(window, message, "OpenMPT Crash", MB_ICONERROR); + } + } + + // Let Windows handle the exception... + return EXCEPTION_CONTINUE_SEARCH; +} Added: trunk/OpenMPT/mptrack/ExceptionHandler.h =================================================================== --- trunk/OpenMPT/mptrack/ExceptionHandler.h (rev 0) +++ trunk/OpenMPT/mptrack/ExceptionHandler.h 2011-08-24 15:33:32 UTC (rev 997) @@ -0,0 +1,32 @@ +/* + * + * ExceptionHandler.h + * ------------------ + * Purpose: Header file for crash handler. + * Notes : (currently none) + * Authors: OpenMPT Devs + */ + + +#pragma once +#ifndef EXCEPTIONHANDLER_H +#define EXCEPTIONHANDLER_H + +//==================== +class ExceptionHandler +//==================== +{ +public: + + static void RegisterMainThread(); + static void RegisterAudioThread(); + +protected: + + static LONG WINAPI UnhandledExceptionFilterMain(_EXCEPTION_POINTERS *pExceptionInfo); + static LONG WINAPI UnhandledExceptionFilterAudio(_EXCEPTION_POINTERS *pExceptionInfo); + static LONG UnhandledExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo, const CString threadName); + +}; + +#endif // EXCEPTIONHANDLER_H Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-23 21:48:22 UTC (rev 996) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-08-24 15:33:32 UTC (rev 997) @@ -27,6 +27,7 @@ #include "UpdateCheck.h" #include "CloseMainDialog.h" #include "SelectPluginDialog.h" +#include "ExceptionHandler.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -705,9 +706,7 @@ BOOL bWait; UINT nSleep; -#ifdef WIN32 - ::SetUnhandledExceptionFilter(CTrackApp::UnhandledExceptionFilter); -#endif // WIN32 + ExceptionHandler::RegisterAudioThread(); // -> CODE#0021 // -> DESC="use multimedia timer instead of Sleep() in audio thread" Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-23 21:48:22 UTC (rev 996) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-08-24 15:33:32 UTC (rev 997) @@ -19,7 +19,7 @@ #include <shlwapi.h> #include "UpdateCheck.h" #include "../soundlib/StringFixer.h" -#include "dbghelp.h" +#include "ExceptionHandler.h" // rewbs.memLeak #define _CRTDBG_MAP_ALLOC @@ -588,9 +588,7 @@ _CrtSetDebugFillThreshold(0); // Disable buffer filling in secure enhanced CRT functions. #endif -#ifdef WIN32 - ::SetUnhandledExceptionFilter(UnhandledExceptionFilter); -#endif // WIN32 + ExceptionHandler::RegisterMainThread(); m_pModTemplate = NULL; m_pPluginManager = NULL; @@ -923,7 +921,8 @@ } // Open settings if the previous execution was with an earlier version. - if (!cmdInfo.m_bNoSettingsOnNewVersion && MptVersion::ToNum(CMainFrame::GetSettings().gcsPreviousVersion) < MptVersion::num) { + if (!cmdInfo.m_bNoSettingsOnNewVersion && MptVersion::ToNum(CMainFrame::GetSettings().gcsPreviousVersion) < MptVersion::num) + { StopSplashScreen(); ShowChangesDialog(); m_pMainWnd->PostMessage(WM_COMMAND, ID_VIEW_OPTIONS); @@ -931,9 +930,9 @@ EndWaitCursor(); - #ifdef ENABLE_TESTS - MptTest::DoTests(); - #endif +#ifdef ENABLE_TESTS + MptTest::DoTests(); +#endif return TRUE; } @@ -947,8 +946,10 @@ if (glpMidiLibrary) { if (m_szConfigFileName[0]) ExportMidiConfig(m_szConfigFileName); - for (UINT iMidi=0; iMidi<256; iMidi++) { - if (glpMidiLibrary->MidiMap[iMidi]) { + for (UINT iMidi=0; iMidi<256; iMidi++) + { + if (glpMidiLibrary->MidiMap[iMidi]) + { delete[] glpMidiLibrary->MidiMap[iMidi]; } } @@ -1819,54 +1820,6 @@ } -void DrawBitmapButton(HDC hdc, LPRECT lpRect, LPMODPLUGDIB lpdib, int srcx, int srcy, BOOL bPushed) -//------------------------------------------------------------------------------------------------- -{ - RECT rect; - int x = (lpRect->right + lpRect->left) / 2 - 8; - int y = (lpRect->top + lpRect->bottom) / 2 - 8; - HGDIOBJ oldpen = SelectObject(hdc, CMainFrame::penBlack); - rect.left = lpRect->left + 1; - rect.top = lpRect->top + 1; - rect.right = lpRect->right - 1; - rect.bottom = lpRect->bottom - 1; - if (bPushed) - { - ::MoveToEx(hdc, lpRect->left, lpRect->bottom-1, NULL); - ::LineTo(hdc, lpRect->left, lpRect->top); - ::LineTo(hdc, lpRect->right-1, lpRect->top); - ::SelectObject(hdc, CMainFrame::penLightGray); - ::LineTo(hdc, lpRect->right-1, lpRect->bottom-1); - ::LineTo(hdc, lpRect->left, lpRect->bottom-1); - ::MoveToEx(hdc, lpRect->left+1, lpRect->bottom-2, NULL); - ::SelectObject(hdc, CMainFrame::penDarkGray); - ::LineTo(hdc, lpRect->left+1, lpRect->top+1); - ::LineTo(hdc, lpRect->right-2, lpRect->top+1); - rect.left++; - rect.top++; - x++; - y++; - } else - { - ::MoveToEx(hdc, lpRect->right-1, lpRect->top, NULL); - ::LineTo(hdc, lpRect->right-1, lpRect->bottom-1); - ::LineTo(hdc, lpRect->left, lpRect->bottom-1); - ::SelectObject(hdc, CMainFrame::penLightGray); - ::LineTo(hdc, lpRect->left, lpRect->top); - ::LineTo(hdc, lpRect->right-1, lpRect->top); - ::SelectObject(hdc, CMainFrame::penDarkGray); - ::MoveToEx(hdc, lpRect->right-2, lpRect->top+1, NULL); - ::LineTo(hdc, lpRect->right-2, lpRect->bottom-2); - ::LineTo(hdc, lpRect->left+1, lpRect->bottom-2); - rect.right--; - rect.bottom--; - } - ::FillRect(hdc, &rect, CMainFrame::brushGray); - ::SelectObject(hdc, oldpen); - DibBlt(hdc, x, y, 16, 15, srcx, srcy, lpdib); -} - - void DrawButtonRect(HDC hdc, LPRECT lpRect, LPCSTR lpszText, BOOL bDisabled, BOOL bPushed, DWORD dwFlags) //------------------------------------------------------------------------------------------------------- { @@ -1900,103 +1853,6 @@ } -///////////////////////////////////////////////////////////////////////////////////// -// CButtonEx: button with custom bitmap - -BEGIN_MESSAGE_MAP(CButtonEx, CButton) - //{{AFX_MSG_MAP(CButtonEx) - ON_WM_ERASEBKGND() - ON_WM_LBUTTONDBLCLK() - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - - -BOOL CButtonEx::Init(const LPMODPLUGDIB pDib, COLORREF colorkey) -//-------------------------------------------------------------- -{ - COLORREF btnface = GetSysColor(COLOR_BTNFACE); - if (!pDib) return FALSE; - m_Dib = *pDib; - m_srcRect.left = 0; - m_srcRect.top = 0; - m_srcRect.right = 16; - m_srcRect.bottom = 15; - for (UINT i=0; i<16; i++) - { - COLORREF rgb = RGB(m_Dib.bmiColors[i].rgbRed, m_Dib.bmiColors[i].rgbGreen, m_Dib.bmiColors[i].rgbBlue); - if (rgb == colorkey) - { - m_Dib.bmiColors[i].rgbRed = GetRValue(btnface); - m_Dib.bmiColors[i].rgbGreen = GetGValue(btnface); - m_Dib.bmiColors[i].rgbBlue = GetBValue(btnface); - } - } - return TRUE; -} - - -void CButtonEx::SetPushState(BOOL bPushed) -//---------------------------------------- -{ - m_bPushed = bPushed; -} - - -BOOL CButtonEx::SetSourcePos(int x, int y, int cx, int cy) -//-------------------------------------------------------- -{ - m_srcRect.left = x; - m_srcRect.top = y; - m_srcRect.right = cx; - m_srcRect.bottom = cy; - return TRUE; -} - - -BOOL CButtonEx::AlignButton(HWND hwndPrev, int dx) -//------------------------------------------------ -{ - HWND hwndParent = ::GetParent(m_hWnd); - if (!hwndParent) return FALSE; - if (hwndPrev) - { - POINT pt; - RECT rect; - SIZE sz; - ::GetWindowRect(hwndPrev, &rect); - pt.x = rect.left; - pt.y = rect.top; - sz.cx = rect.right - rect.left; - sz.cy = rect.bottom - rect.top; - ::ScreenToClient(hwndParent, &pt); - SetWindowPos(NULL, pt.x + sz.cx + dx, pt.y, 0,0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); - } - return FALSE; -} - - -BOOL CButtonEx::AlignButton(UINT nIdPrev, int dx) -//----------------------------------------------- -{ - return AlignButton(::GetDlgItem(::GetParent(m_hWnd), nIdPrev), dx); -} - - -void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpdis) -//---------------------------------------------- -{ - DrawBitmapButton(lpdis->hDC, &lpdis->rcItem, &m_Dib, m_srcRect.left, m_srcRect.top, - ((lpdis->itemState & ODS_SELECTED) || (m_bPushed)) ? TRUE : FALSE); -} - - -void CButtonEx::OnLButtonDblClk(UINT nFlags, CPoint point) -//-------------------------------------------------------- -{ - PostMessage(WM_LBUTTONDOWN, nFlags, MAKELPARAM(point.x, point.y)); -} - - ////////////////////////////////////////////////////////////////////////////////// // Misc functions @@ -2026,9 +1882,7 @@ void CFastBitmap::Init(LPMODPLUGDIB lpTextDib) //-------------------------------------------- { - m_nBlendOffset = 0; // rewbs.buildfix for pattern display bug in debug builds - // & release builds when ran directly from vs.net - + m_nBlendOffset = 0; m_pTextDib = lpTextDib; MemsetZero(m_Dib); m_nTextColor = 0; @@ -2427,107 +2281,6 @@ } -#ifdef WIN32 - -typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, - CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam - ); - -// Try to close the audio device and rescue unsaved work if an unhandled exception occours... -LONG CTrackApp::UnhandledExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo) -//--------------------------------------------------------------------------- -{ - CMainFrame* pMainFrame = CMainFrame::GetMainFrame(); - const HWND window = (pMainFrame ? pMainFrame->m_hWnd : NULL); - - // Shut down audio device... - if(pMainFrame) - { - if(pMainFrame->gpSoundDevice) pMainFrame->gpSoundDevice->Reset(); - pMainFrame->audioCloseDevice(); - } - - const CString timestampDir = (CTime::GetCurrentTime()).Format("%Y-%m-%d %H.%M.%S\\"); - CString baseRescuePath; - { - // Create a crash directory - TCHAR tempPath[_MAX_PATH]; - GetTempPath(CountOf(tempPath), tempPath); - baseRescuePath.Format("%sOpenMPT Crash Files\\", tempPath); - CreateDirectory(baseRescuePath, nullptr); - baseRescuePath.Append(timestampDir); - if(!CreateDirectory(baseRescuePath, nullptr)) - { - ::MessageBox(window, "A crash has been detected and OpenMPT will be closed.\nOpenMPT was unable to create a directory for saving debug information and modified files to.", "OpenMPT Crash", MB_ICONERROR); - } - } - - // Create minidump... - HMODULE hDll = ::LoadLibrary("DBGHELP.DLL"); - if (hDll) - { - MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump"); - if (pDump) - { - const CString filename = baseRescuePath + "crash.dmp"; - - HANDLE hFile = ::CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile != INVALID_HANDLE_VALUE) - { - _MINIDUMP_EXCEPTION_INFORMATION ExInfo; - - ExInfo.ThreadId = ::GetCurrentThreadId(); - ExInfo.ExceptionPointers = pExceptionInfo; - ExInfo.ClientPointers = NULL; - - pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); - ::CloseHandle(hFile); - } - } - ::FreeLibrary(hDll); - } - - // Rescue modified files... - CDocTemplate *pDocTmpl = theApp.GetModDocTemplate(); - if(pDocTmpl) - { - POSITION pos = pDocTmpl->GetFirstDocPosition(); - CDocument *pDoc; - - int numFiles = 0; - - while((pos != NULL) && ((pDoc = pDocTmpl->GetNextDoc(pos)) != NULL)) - { - CModDoc *pModDoc = (CModDoc *)pDoc; - if(pModDoc->IsModified() && pModDoc->GetSoundFile() != nullptr) - { - if(numFiles == 0) - { - // Show the rescue directory in Explorer... - OpenDirectory(baseRescuePath); - } - CString filename; - filename.Format("%s%d_%s.%s", baseRescuePath, ++numFiles, pModDoc->GetTitle(), pModDoc->GetSoundFile()->GetModSpecifications().fileExtension); - pModDoc->OnSaveDocument(filename); - } - } - - if(numFiles > 0) - { - CString message; - message.Format("A crash has been detected and OpenMPT will be closed.\n%d modified file%s been rescued to\n\n%s\n\nNote: It cannot be guaranteed that rescued files are still intact.", numFiles, (numFiles == 1 ? " has" : "s have"), baseRescuePath); - ::MessageBox(window, message, "OpenMPT Crash", MB_ICONERROR); - } - } - - // Let Windows handle the exception... - return EXCEPTION_CONTINUE_SEARCH; -} -#endif // WIN32 - - ////////////////////////////////////////////////////////////////////////////////// // Localized strings Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2011-08-23 21:48:22 UTC (rev 996) +++ trunk/OpenMPT/mptrack/Mptrack.h 2011-08-24 15:33:32 UTC (rev 997) @@ -247,48 +247,12 @@ #ifdef WIN32 // Legacy stuff - bool MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH] = "", TCHAR sNewFileName[_MAX_PATH] = ""); + bool MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH] = _T(""), TCHAR sNewFileName[_MAX_PATH] = _T("")); #endif // WIN32 -// Exception handling -#ifdef WIN32 -public: - static LONG WINAPI UnhandledExceptionFilter(_EXCEPTION_POINTERS *pExceptionInfo); -#endif // WIN32 - }; -//============================= -class CButtonEx: public CButton -//============================= -{ -protected: - MODPLUGDIB m_Dib; - RECT m_srcRect; - BOOL m_bPushed; - -public: - CButtonEx() { m_Dib.lpDibBits = NULL; m_bPushed = FALSE; } - BOOL Init(const LPMODPLUGDIB pDib, COLORREF colorkey=RGB(0,128,128)); - BOOL SetSourcePos(int x, int y=0, int cx=16, int cy=15); - BOOL AlignButton(UINT nIdPrev, int dx=0); - BOOL AlignButton(const CWnd &wnd, int dx=0) { return AlignButton(wnd.m_hWnd, dx); } - BOOL AlignButton(HWND hwnd, int dx=0); - BOOL GetPushState() const { return m_bPushed; } - void SetPushState(BOOL bPushed); - -protected: - //{{AFX_VIRTUAL(CButtonEx) - virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); - //}}AFX_VIRTUAL - //{{AFX_MSG(CButtonEx) - afx_msg BOOL OnEraseBkgnd(CDC *) { return TRUE; } - afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); - //}}AFX_MSG - DECLARE_MESSAGE_MAP(); -}; - extern CTrackApp theApp; @@ -366,7 +330,6 @@ RGBQUAD rgb2quad(COLORREF c); // Other bitmap functions -void DrawBitmapButton(HDC hdc, LPRECT lpRect, LPMODPLUGDIB lpdib, int srcx, int srcy, BOOL bPushed); void DrawButtonRect(HDC hdc, LPRECT lpRect, LPCSTR lpszText=NULL, BOOL bDisabled=FALSE, BOOL bPushed=FALSE, DWORD dwFlags=(DT_CENTER|DT_VCENTER)); // Misc functions Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2011-08-23 21:48:22 UTC (rev 996) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2011-08-24 15:33:32 UTC (rev 997) @@ -241,6 +241,9 @@ RelativePath=".\EffectVis.cpp"> </File> <File + RelativePath=".\ExceptionHandler.cpp"> + </File> + <File RelativePath="..\soundlib\Fastmix.cpp"> </File> <File @@ -723,6 +726,9 @@ RelativePath="..\soundlib\Endianness.h"> </File> <File + RelativePath=".\ExceptionHandler.h"> + </File> + <File RelativePath=".\fxp.h"> </File> <File Modified: trunk/OpenMPT/mptrack/mptrack_08.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-08-23 21:48:22 UTC (rev 996) +++ trunk/OpenMPT/mptrack/mptrack_08.vcproj 2011-08-24 15:33:32 UTC (rev 997) @@ -325,6 +325,10 @@ > </File> <File + RelativePath=".\ExceptionHandler.cpp" + > + </File> + <File RelativePath="..\soundlib\Fastmix.cpp" > </File> @@ -959,6 +963,10 @@ > </File> <File + RelativePath=".\ExceptionHandler.h" + > + </File> + <File RelativePath=".\fxp.h" > </File> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-23 21:48:22 UTC (rev 996) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj 2011-08-24 15:33:32 UTC (rev 997) @@ -188,6 +188,7 @@ <ClCompile Include="draw_pat.cpp" /> <ClCompile Include="EffectVis.cpp" /> <ClCompile Include="..\soundlib\Fastmix.cpp" /> + <ClCompile Include="ExceptionHandler.cpp" /> <ClCompile Include="fxp.cpp" /> <ClCompile Include="globals.cpp" /> <ClCompile Include="HyperEdit.cpp" /> @@ -317,6 +318,7 @@ </ItemGroup> <ItemGroup> <ClInclude Include="ACMConvert.h" /> + <ClInclude Include="ExceptionHandler.h" /> <ClInclude Include="PatternRandomizer.h" /> <ClInclude Include="PatternRandomizerGUI.h" /> <ClInclude Include="PatternRandomizerGUIEffect.h" /> Modified: trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters =================================================================== --- trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2011-08-23 21:48:22 UTC (rev 996) +++ trunk/OpenMPT/mptrack/mptrack_10.vcxproj.filters 2011-08-24 15:33:32 UTC (rev 997) @@ -424,6 +424,9 @@ <ClCompile Include="ACMConvert.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="ExceptionHandler.cpp"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="AbstractVstEditor.h"> @@ -741,6 +744,9 @@ <ClInclude Include="ACMConvert.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="ExceptionHandler.h"> + <Filter>Header Files</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="res\bitmap1.bmp"> Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-08-23 21:48:22 UTC (rev 996) +++ trunk/OpenMPT/mptrack/version.h 2011-08-24 15:33:32 UTC (rev 997) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 11 +#define VER_MINORMINOR 12 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |