// After adding new plugins, check if they were missing in any open songs. void CSelectPluginDlg::ReloadMissingPlugins(const VSTPluginLib *lib) const //------------------------------------------------------------------------ { CVstPluginManager *pManager = theApp.GetPluginManager(); auto docs = theApp.GetOpenDocuments(); for(size_t i = 0; i < docs.size(); i++) { CModDoc &doc = *docs[i]; CSoundFile &sndFile = doc.GetrSoundFile(); bool updateDoc = false; for(PLUGINDEX plug = 0; plug < MAX_MIXPLUGINS; plug++) { SNDMIXPLUGIN &plugin = sndFile.m_MixPlugins[plug]; if(plugin.pMixPlugin == nullptr && plugin.Info.dwPluginId1 == lib->pluginId1 && plugin.Info.dwPluginId2 == lib->pluginId2) { pManager->CreateMixPlugin(plugin, sndFile); if(plugin.pMixPlugin) { plugin.pMixPlugin->RestoreAllParameters(plugin.defaultProgram); } } } if(updateDoc) { doc.UpdateAllViews(nullptr, PluginHint().Info().Names()); CMainFrame::GetMainFrame()->UpdateTree(&doc, PluginHint().Info().Names()); } } }
VSTPluginLib *CSelectPluginDlg::ScanPlugins(const mpt::PathString &path, CWnd *parent) //------------------------------------------------------------------------------------ { CVstPluginManager *pManager = theApp.GetPluginManager(); VSTPluginLib *plugLib = nullptr; bool update = false; CDialog pluginScanDlg; pluginScanDlg.Create(IDD_SCANPLUGINS, parent); pluginScanDlg.CenterWindow(parent); pluginScanDlg.ModifyStyle(0, WS_SYSMENU, WS_SYSMENU); pluginScanDlg.ShowWindow(SW_SHOW); FolderScanner scan(path, true); mpt::PathString fileName; int files = 0; while(scan.NextFile(fileName) && pluginScanDlg.IsWindowVisible()) { if(!mpt::PathString::CompareNoCase(fileName.GetFileExt(), MPT_PATHSTRING(".dll"))) { CWnd *text = pluginScanDlg.GetDlgItem(IDC_SCANTEXT); std::wstring scanStr = L"Scanning Plugin...\n" + fileName.ToWide(); ::SetWindowTextW(text->m_hWnd, scanStr.c_str()); MSG msg; while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } VSTPluginLib *lib = pManager->AddPlugin(fileName, mpt::ustring(), false); if(lib) { update = true; if(!VerifyPlug(lib, parent)) { pManager->RemovePlugin(lib); } else { plugLib = lib; files++; } } } } if(update) { // Force selection to last added plug. Reporting::Information(mpt::String::Print("Found %1 plugin%2.", files, files == 1 ? "" : "s").c_str(), parent); return plugLib; } else { Reporting::Error("Could not find any valid VST plugins."); return nullptr; } }
bool CVstPluginManager::CreateMixPluginProc(SNDMIXPLUGIN &mixPlugin, CSoundFile &sndFile) //--------------------------------------------------------------------------------------- { CVstPluginManager *that = theApp.GetPluginManager(); if(that) { return that->CreateMixPlugin(mixPlugin, sndFile); } return false; }
VstIntPtr VSTCALLBACK CVstPluginManager::MasterCallBack(AEffect *effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void *ptr, float opt) //---------------------------------------------------------------------------------------------------------------------------------------------- { CVstPluginManager *that = theApp.GetPluginManager(); if(that) { return that->VstCallback(effect, opcode, index, value, ptr, opt); } return 0; }
void CSelectPluginDlg::OnRemovePlugin() //------------------------------------- { const HTREEITEM pluginToDelete = m_treePlugins.GetSelectedItem(); VSTPluginLib *pPlug = GetSelectedPlugin(); CVstPluginManager *pManager = theApp.GetPluginManager(); if ((pManager) && (pPlug)) { if(pManager->RemovePlugin(pPlug)) { m_treePlugins.DeleteItem(pluginToDelete); } } }
void CSelectPluginDlg::OnAddPlugin() //---------------------------------- { FileDialog dlg = OpenFileDialog() .AllowMultiSelect() .DefaultExtension("dll") .ExtensionFilter("VST Plugins (*.dll)|*.dll||") .WorkingDirectory(TrackerSettings::Instance().PathPlugins.GetWorkingDir()); if(!dlg.Show(this)) return; TrackerSettings::Instance().PathPlugins.SetWorkingDir(dlg.GetWorkingDirectory()); CVstPluginManager *pManager = theApp.GetPluginManager(); VSTPluginLib *plugLib = nullptr; bool update = false; const FileDialog::PathList &files = dlg.GetFilenames(); for(size_t counter = 0; counter < files.size(); counter++) { if (pManager) { VSTPluginLib *lib = pManager->AddPlugin(files[counter], mpt::ustring(), false); if(lib != nullptr) { update = true; if(!VerifyPlug(lib, this)) { pManager->RemovePlugin(lib); } else { plugLib = lib; // If this plugin was missing anywhere, try loading it ReloadMissingPlugins(lib); } } } } if(update) { // Force selection to last added plug. UpdatePluginsList(plugLib ? plugLib->pluginId2 : 0); } else { Reporting::Error("At least one selected file was not a valid VST Plugin."); } }
void CSelectPluginDlg::OnSelChanged(NMHDR *, LRESULT *result) //----------------------------------------------------------- { CVstPluginManager *pManager = theApp.GetPluginManager(); VSTPluginLib *pPlug = GetSelectedPlugin(); bool showBoxes = false; BOOL enableTagsTextBox = FALSE; BOOL enableRemoveButton = FALSE; if (pManager != nullptr && pManager->IsValidPlugin(pPlug)) { if(pPlug->vendor.IsEmpty()) SetDlgItemText(IDC_VENDOR, _T("")); else SetDlgItemText(IDC_VENDOR, _T("Vendor: ") + pPlug->vendor); if(pPlug->dllPath.empty()) SetDlgItemText(IDC_TEXT_CURRENT_VSTPLUG, _T("Built-in plugin")); else ::SetDlgItemTextW(m_hWnd, IDC_TEXT_CURRENT_VSTPLUG, pPlug->dllPath.ToWide().c_str()); ::SetDlgItemTextW(m_hWnd, IDC_PLUGINTAGS, mpt::ToWide(pPlug->tags).c_str()); enableRemoveButton = pPlug->isBuiltIn ? FALSE : TRUE; #ifndef NO_VST if(pPlug->pluginId1 == kEffectMagic && !pPlug->isBuiltIn) { bool isBridgeAvailable = ((pPlug->GetDllBits() == 32) && IsComponentAvailable(pluginBridge32)) || ((pPlug->GetDllBits() == 64) && IsComponentAvailable(pluginBridge64)) ; if(TrackerSettings::Instance().bridgeAllPlugins || !isBridgeAvailable) { m_chkBridge.EnableWindow(FALSE); m_chkBridge.SetCheck(isBridgeAvailable ? BST_CHECKED : BST_UNCHECKED); } else { bool native = pPlug->IsNative(); m_chkBridge.EnableWindow(native ? TRUE : FALSE); m_chkBridge.SetCheck((pPlug->useBridge || !native) ? BST_CHECKED : BST_UNCHECKED); } m_chkShare.SetCheck(pPlug->shareBridgeInstance ? BST_CHECKED : BST_UNCHECKED); m_chkShare.EnableWindow(m_chkBridge.GetCheck() != BST_UNCHECKED); showBoxes = true; } enableTagsTextBox = TRUE; #endif } else { SetDlgItemText(IDC_VENDOR, _T("")); SetDlgItemText(IDC_TEXT_CURRENT_VSTPLUG, _T("")); SetDlgItemText(IDC_PLUGINTAGS, ""); } GetDlgItem(IDC_PLUGINTAGS)->EnableWindow(enableTagsTextBox); GetDlgItem(IDC_BUTTON2)->EnableWindow(enableRemoveButton); if(!showBoxes) { m_chkBridge.EnableWindow(FALSE); m_chkShare.EnableWindow(FALSE); m_chkBridge.SetCheck(BST_UNCHECKED); m_chkShare.SetCheck(BST_UNCHECKED); } if (result) *result = 0; }
void CSelectPluginDlg::OnOK() //--------------------------- { if(m_pPlugin==nullptr) { CDialog::OnOK(); return; } bool changed = false; CVstPluginManager *pManager = theApp.GetPluginManager(); VSTPluginLib *pNewPlug = GetSelectedPlugin(); VSTPluginLib *pFactory = nullptr; IMixPlugin *pCurrentPlugin = nullptr; if (m_pPlugin) pCurrentPlugin = m_pPlugin->pMixPlugin; if ((pManager) && (pManager->IsValidPlugin(pNewPlug))) pFactory = pNewPlug; if (pFactory) { // Plugin selected if ((!pCurrentPlugin) || &pCurrentPlugin->GetPluginFactory() != pFactory) { CriticalSection cs; // Destroy old plugin, if there was one. m_pPlugin->Destroy(); // Initialize plugin info MemsetZero(m_pPlugin->Info); m_pPlugin->Info.dwPluginId1 = pFactory->pluginId1; m_pPlugin->Info.dwPluginId2 = pFactory->pluginId2; m_pPlugin->editorX = m_pPlugin->editorY = int32_min; #ifndef NO_VST if(m_pPlugin->Info.dwPluginId1 == kEffectMagic) { switch(m_pPlugin->Info.dwPluginId2) { // Enable drymix by default for these known plugins case CCONST('S', 'c', 'o', 'p'): m_pPlugin->SetWetMix(); break; } } #endif // NO_VST mpt::String::Copy(m_pPlugin->Info.szName, pFactory->libraryName.ToLocale().c_str()); mpt::String::Copy(m_pPlugin->Info.szLibraryName, pFactory->libraryName.ToUTF8().c_str()); cs.Leave(); // Now, create the new plugin if(pManager && m_pModDoc) { pManager->CreateMixPlugin(*m_pPlugin, m_pModDoc->GetrSoundFile()); if (m_pPlugin->pMixPlugin) { IMixPlugin *p = m_pPlugin->pMixPlugin; const CString name = p->GetDefaultEffectName(); if(!name.IsEmpty()) { mpt::String::Copy(m_pPlugin->Info.szName, name.GetString()); } // Check if plugin slot is already assigned to any instrument, and if not, create one. if(p->IsInstrument() && m_pModDoc->HasInstrumentForPlugin(m_nPlugSlot) == INSTRUMENTINDEX_INVALID) { m_pModDoc->InsertInstrumentForPlugin(m_nPlugSlot); } } else { MemsetZero(m_pPlugin->Info); } } changed = true; } } else if(m_pPlugin->IsValidPlugin()) { // No effect CriticalSection cs; m_pPlugin->Destroy(); // Clear plugin info MemsetZero(m_pPlugin->Info); changed = true; } //remember window size: SaveWindowPos(); if(changed) { if(m_pPlugin->Info.dwPluginId2) TrackerSettings::Instance().gnPlugWindowLast = m_pPlugin->Info.dwPluginId2; if(m_pModDoc) { m_pModDoc->UpdateAllViews(nullptr, PluginHint(static_cast<PLUGINDEX>(m_nPlugSlot + 1)).Info().Names()); } CDialog::OnOK(); } else { CDialog::OnCancel(); } }