diff options
Diffstat (limited to 'libs/ardour/plugin_manager.cc')
-rw-r--r-- | libs/ardour/plugin_manager.cc | 85 |
1 files changed, 55 insertions, 30 deletions
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 37eb61ef3b..04652a36c7 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -225,6 +225,12 @@ PluginManager::~PluginManager() void PluginManager::refresh (bool cache_only) { + Glib::Threads::Mutex::Lock lm (_lock, Glib::Threads::TRY_LOCK); + + if (!lm.locked()) { + return; + } + DEBUG_TRACE (DEBUG::PluginManager, "PluginManager::refresh\n"); _cancel_scan = false; @@ -236,20 +242,32 @@ PluginManager::refresh (bool cache_only) #endif #ifdef WINDOWS_VST_SUPPORT if (Config->get_use_windows_vst()) { - BootMessage (_("Scanning Windows VST Plugins")); + if (cache_only) { + BootMessage (_("Scanning Windows VST Plugins")); + } else { + BootMessage (_("Discovering Windows VST Plugins")); + } windows_vst_refresh (cache_only); } #endif // WINDOWS_VST_SUPPORT #ifdef LXVST_SUPPORT if(Config->get_use_lxvst()) { - BootMessage (_("Scanning Linux VST Plugins")); + if (cache_only) { + BootMessage (_("Scanning Linux VST Plugins")); + } else { + BootMessage (_("Discovering Linux VST Plugins")); + } lxvst_refresh(cache_only); } #endif //Native linuxVST SUPPORT #ifdef AUDIOUNIT_SUPPORT - BootMessage (_("Scanning AU Plugins")); + if (cache_only) { + BootMessage (_("Scanning AU Plugins")); + } else { + BootMessage (_("Discovering AU Plugins")); + } au_refresh (cache_only); #endif @@ -313,7 +331,7 @@ PluginManager::clear_vst_blacklist () #ifdef WINDOWS_VST_SUPPORT { vector<string> fsi_files; - find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsb$", true); + find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\" VST_EXT_BLACKLIST "$", true); for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { ::g_unlink(i->c_str()); } @@ -323,7 +341,7 @@ PluginManager::clear_vst_blacklist () #ifdef LXVST_SUPPORT { vector<string> fsi_files; - find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsb$", true); + find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\" VST_EXT_BLACKLIST "$", true); for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { ::g_unlink(i->c_str()); } @@ -335,7 +353,7 @@ PluginManager::clear_vst_blacklist () string personal = get_personal_vst_blacklist_dir(); vector<string> fsi_files; - find_files_matching_regex (fsi_files, personal, "\\.fsb$", /* flat user cache */ false); + find_files_matching_regex (fsi_files, personal, "\\" VST_EXT_BLACKLIST "$", /* flat user cache */ false); for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) { ::g_unlink(i->c_str()); } @@ -639,31 +657,17 @@ void PluginManager::au_refresh (bool cache_only) { DEBUG_TRACE (DEBUG::PluginManager, "AU: refresh\n"); - if (cache_only && !Config->get_discover_audio_units ()) { - return; - } - delete _au_plugin_info; - _au_plugin_info = AUPluginInfo::discover(); - // disable automatic scan in case we crash + // disable automatic discovery in case we crash + bool discover_at_start = Config->get_discover_audio_units (); Config->set_discover_audio_units (false); Config->save_state(); - /* note: AU require a CAComponentDescription pointer provided by the OS. - * Ardour only caches port and i/o config. It can't just 'scan' without - * 'discovering' (like we do for VST). - * - * So in case discovery fails, we assume the worst: the Description - * is broken (malicious plugins) and even a simple 'scan' would always - * crash ardour on startup. Hence we disable Auto-Scan on start. - * - * If the crash happens at any later time (description is available), - * Ardour will blacklist the plugin in question -- unless - * the crash happens during realtime-run. - */ + delete _au_plugin_info; + _au_plugin_info = AUPluginInfo::discover(cache_only && !discover_at_start); - // successful scan re-enabled automatic discovery - Config->set_discover_audio_units (true); + // successful scan re-enabled automatic discovery if it was set + Config->set_discover_audio_units (discover_at_start); Config->save_state(); } @@ -696,7 +700,11 @@ PluginManager::windows_vst_discover_from_path (string path, bool cache_only) vector<string>::iterator x; int ret = 0; - DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path)); + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering Windows VST plugins along %1\n", path)); + + if (Config->get_verbose_plugin_scan()) { + info << string_compose (_("--- Windows VST plugins Scan: %1"), path) << endmsg; + } find_files_matching_filter (plugin_objects, Config->get_plugin_path_vst(), windows_vst_filter, 0, false, true, true); @@ -705,6 +713,10 @@ PluginManager::windows_vst_discover_from_path (string path, bool cache_only) windows_vst_discover (*x, cache_only || cancelled()); } + if (Config->get_verbose_plugin_scan()) { + info << _("--- Windows VST plugins Scan Done") << endmsg; + } + return ret; } @@ -713,12 +725,22 @@ PluginManager::windows_vst_discover (string path, bool cache_only) { DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path)); + if (Config->get_verbose_plugin_scan()) { + info << string_compose (_(" * %1 %2"), path, (cache_only ? _(" (cache only)") : "")) << endmsg; + } + _cancel_timeout = false; vector<VSTInfo*> * finfos = vstfx_get_info_fst (const_cast<char *> (path.c_str()), cache_only ? VST_SCAN_CACHE_ONLY : VST_SCAN_USE_APP); + // TODO get extended error messae from vstfx_get_info_fst() e.g blacklisted, 32/64bit compat, + // .err file scanner output etc. + if (finfos->empty()) { DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Cannot get Windows VST information from '%1'\n", path)); + if (Config->get_verbose_plugin_scan()) { + info << _(" -> Cannot get Windows VST information, plugin ignored.") << endmsg; + } return -1; } @@ -728,7 +750,7 @@ PluginManager::windows_vst_discover (string path, bool cache_only) char buf[32]; if (!finfo->canProcessReplacing) { - warning << string_compose (_("VST plugin %1 does not support processReplacing, and so cannot be used in %2 at this time"), + warning << string_compose (_("VST plugin %1 does not support processReplacing, and cannot be used in %2 at this time"), finfo->name, PROGRAM_NAME) << endl; continue; @@ -762,8 +784,8 @@ PluginManager::windows_vst_discover (string path, bool cache_only) if (!_windows_vst_plugin_info->empty()) { for (PluginInfoList::iterator i =_windows_vst_plugin_info->begin(); i != _windows_vst_plugin_info->end(); ++i) { - if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) { - warning << "Ignoring duplicate Windows VST plugin " << info->name << "\n"; + if ((info->type == (*i)->type) && (info->unique_id == (*i)->unique_id)) { + warning << string_compose (_("Ignoring duplicate Windows VST plugin \"%1\""), info->name) << endmsg; duplicate = true; break; } @@ -774,6 +796,9 @@ PluginManager::windows_vst_discover (string path, bool cache_only) DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Windows VST plugin ID '%1'\n", info->unique_id)); _windows_vst_plugin_info->push_back (info); discovered++; + if (Config->get_verbose_plugin_scan()) { + PBD::info << string_compose (_(" -> OK. (VST Plugin \"%1\" added)."), info->name) << endmsg; + } } } |