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(); } }