VST cache rework (part one)
[ardour.git] / libs / ardour / plugin_manager.cc
index 458f7e15470e171c7f145811e096e71f79facc09..9dd1d4b6805419b1b19a54bd74016cd13b3af8c0 100644 (file)
@@ -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
 
@@ -274,8 +292,15 @@ PluginManager::cancel_plugin_timeout ()
 void
 PluginManager::clear_vst_cache ()
 {
-       // see also libs/ardour/vst_info_file.cc - vstfx_infofile_path()
+#if 1 // clean old cache and error files. (remove this code after 4.3 or 5.0)
 #ifdef WINDOWS_VST_SUPPORT
+       {
+               vector<string> fsi_files;
+               find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\" VST_EXT_INFOFILE "$", true);
+               for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+                       ::g_unlink(i->c_str());
+               }
+       }
        {
                vector<string> fsi_files;
                find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.fsi$", true);
@@ -283,9 +308,23 @@ PluginManager::clear_vst_cache ()
                        ::g_unlink(i->c_str());
                }
        }
+       {
+               vector<string> fsi_files;
+               find_files_matching_regex (fsi_files, Config->get_plugin_path_vst(), "\\.err$", true);
+               for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+                       ::g_unlink(i->c_str());
+               }
+       }
 #endif
 
 #ifdef LXVST_SUPPORT
+       {
+               vector<string> fsi_files;
+               find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\" VST_EXT_INFOFILE "$", true);
+               for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+                       ::g_unlink(i->c_str());
+               }
+       }
        {
                vector<string> fsi_files;
                find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.fsi$", true);
@@ -293,13 +332,21 @@ PluginManager::clear_vst_cache ()
                        ::g_unlink(i->c_str());
                }
        }
+       {
+               vector<string> fsi_files;
+               find_files_matching_regex (fsi_files, Config->get_plugin_path_lxvst(), "\\.err$", true);
+               for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
+                       ::g_unlink(i->c_str());
+               }
+       }
 #endif
+#endif // old cache cleanup
 
 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
        {
-               string personal = get_personal_vst_info_cache_dir();
+               string dn = Glib::build_filename (ARDOUR::user_cache_directory(), "vst");
                vector<string> fsi_files;
-               find_files_matching_regex (fsi_files, personal, "\\.fsi$", /* user cache is flat, no recursion */ false);
+               find_files_matching_regex (fsi_files, dn, "\\" VST_EXT_INFOFILE "$", /* user cache is flat, no recursion */ false);
                for (vector<string>::iterator i = fsi_files.begin(); i != fsi_files.end (); ++i) {
                        ::g_unlink(i->c_str());
                }
@@ -310,6 +357,8 @@ PluginManager::clear_vst_cache ()
 void
 PluginManager::clear_vst_blacklist ()
 {
+#if 1 // remove old blacklist files. (remove this code after 4.3 or 5.0)
+
 #ifdef WINDOWS_VST_SUPPORT
        {
                vector<string> fsi_files;
@@ -330,17 +379,17 @@ PluginManager::clear_vst_blacklist ()
        }
 #endif
 
+#endif // old blacklist cleanup
+
 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
        {
-               string personal = get_personal_vst_blacklist_dir();
-
-               vector<string> fsi_files;
-               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());
+               string fn = Glib::build_filename (ARDOUR::user_cache_directory(), VST_BLACKLIST);
+               if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+                       ::g_unlink (fn.c_str());
                }
        }
 #endif
+
 }
 
 void
@@ -639,31 +688,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();
 }
 
@@ -793,7 +828,7 @@ PluginManager::windows_vst_discover (string path, bool cache_only)
                        _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; 
+                               PBD::info << string_compose (_(" -> OK. (VST Plugin \"%1\" added)."), info->name) << endmsg;
                        }
                }
        }