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. |