properly handle VST scan/discover cancellation.
authorRobin Gareus <robin@gareus.org>
Wed, 26 Feb 2014 19:50:36 +0000 (20:50 +0100)
committerRobin Gareus <robin@gareus.org>
Wed, 26 Feb 2014 19:50:36 +0000 (20:50 +0100)
libs/ardour/vst_info_file.cc

index c653c38bf1b1d6011420f54aa0e52a4c45b534f1..cc0ac8431c18a7c93b753beeceb62966c75c8363 100644 (file)
@@ -347,6 +347,13 @@ vstfx_infofile_path (const char* dllpath, int personal)
        return Glib::build_filename (dir, s.str ());
 }
 
+static void
+vstfx_remove_infofile (const char *dllpath)
+{
+       ::g_unlink(vstfx_infofile_path (dllpath, 0).c_str());
+       ::g_unlink(vstfx_infofile_path (dllpath, 1).c_str());
+}
+
 static char *
 vstfx_infofile_stat (const char *dllpath, struct stat* statbuf, int personal)
 {
@@ -740,8 +747,6 @@ vstfx_get_info (const char* dllpath, int type, enum VSTScanMode mode)
 
                PBD::SystemExec scanner (scanner_bin_path, argp);
                PBD::ScopedConnectionList cons;
-               // TODO timeout.., and honor user-terminate
-               //scanner->Terminated.connect_same_thread (cons, boost::bind (&scanner_terminated))
                scanner.ReadStdout.connect_same_thread (cons, boost::bind (&parse_scanner_output, _1 ,_2));
                if (scanner.start (2 /* send stderr&stdout via signal */)) {
                        PBD::error << "Cannot launch VST scanner app '" << scanner_bin_path << "': "<< strerror(errno) << endmsg;
@@ -751,11 +756,19 @@ vstfx_get_info (const char* dllpath, int type, enum VSTScanMode mode)
                        while (scanner.is_running() && --timeout) {
                                ARDOUR::GUIIdle();
                                Glib::usleep (100000);
-                               if (ARDOUR::PluginManager::instance().cancelled()) break;
+
+                               if (ARDOUR::PluginManager::instance().cancelled()) {
+                                       // remove info file (might be incomplete)
+                                       vstfx_remove_infofile(dllpath);
+                                       // remove temporary blacklist file (scan incomplete)
+                                       vstfx_un_blacklist(dllpath);
+                                       scanner.terminate();
+                                       return infos;
+                               }
                        }
                        scanner.terminate();
                }
-               /* re-read index */
+               /* re-read index (generated by external scanner) */
                vstfx_clear_info_list(infos);
                if (!vstfx_check_blacklist(dllpath)) {
                        vstfx_get_info_from_file(dllpath, infos);