hardour does not yet support wine-builds
[ardour.git] / gtk2_ardour / ardour_ui.cc
index a771ed48b990831201d988541847bf7bca5ba8f0..10de8e795d8953068b9cbfbc8e1863365e99544f 100644 (file)
@@ -52,6 +52,7 @@
 #include "pbd/openuri.h"
 #include "pbd/file_utils.h"
 #include "pbd/localtime_r.h"
+#include "pbd/system_exec.h"
 
 #include "gtkmm2ext/application.h"
 #include "gtkmm2ext/bindings.h"
@@ -71,6 +72,7 @@
 #include "ardour/filename_extensions.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/port.h"
+#include "ardour/plugin_manager.h"
 #include "ardour/process_thread.h"
 #include "ardour/profile.h"
 #include "ardour/recent_sessions.h"
 #include "ardour/session_utils.h"
 #include "ardour/slave.h"
 
+#ifdef WINDOWS_VST_SUPPORT
+#include <fst.h>
+#endif
+
 #include "timecode/time.h"
 
 typedef uint64_t microseconds_t;
@@ -127,7 +133,6 @@ typedef uint64_t microseconds_t;
 #include "video_server_dialog.h"
 #include "add_video_dialog.h"
 #include "transcode_video_dialog.h"
-#include "system_exec.h"
 
 #include "i18n.h"
 
@@ -166,6 +171,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
        , _was_dirty (false)
        , _mixer_on_top (false)
        , first_time_engine_run (true)
+       , blink_timeout_tag (-1)
 
          /* transport */
 
@@ -299,6 +305,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
        ARDOUR::FileSource::AmbiguousFileName.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::ambiguous_file, this, _1, _2));
 
+       /* also plugin scan messages */
+       ARDOUR::PluginScanMessage.connect (forever_connections, MISSING_INVALIDATOR, boost::bind(&ARDOUR_UI::plugin_scan_dialog, this, _1, _2), gui_context());
+
        /* lets get this party started */
 
        setup_gtk_ardour_enums ();
@@ -503,10 +512,13 @@ ARDOUR_UI::post_engine ()
 
                vector<string>::iterator n;
                vector<string>::iterator k;
-               for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
-                       cout << "Action: " << (*n) << " bound to " << (*k) << endl;
+               vector<string>::iterator p;
+               for (n = names.begin(), k = keys.begin(), p = paths.begin(); n != names.end(); ++n, ++k, ++p) {
+                       cout << "Action: '" << (*n) << "' bound to '" << (*k) << "' Path: '" << (*p) << "'" << endl;
                }
 
+               halt_connection.disconnect ();
+               AudioEngine::instance()->stop ();
                exit (0);
        }
 
@@ -1004,6 +1016,9 @@ If you still wish to quit, please use the\n\n\
 
        halt_connection.disconnect ();
        AudioEngine::instance()->stop ();
+#ifdef WINDOWS_VST_SUPPORT
+       fst_stop_threading();
+#endif
        quit ();
 }
 
@@ -2912,7 +2927,13 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
                _session->set_clean ();
        }
 
+#ifdef WINDOWS_VST_SUPPORT
+       fst_stop_threading();
+#endif
        flush_pending ();
+#ifdef WINDOWS_VST_SUPPORT
+       fst_start_threading();
+#endif
        retval = 0;
 
   out:
@@ -3272,7 +3293,7 @@ ARDOUR_UI::setup_order_hint ()
        } else {
                for (TrackSelection::iterator s = editor->get_selection().tracks.begin(); s != editor->get_selection().tracks.end(); ++s) {
                        RouteTimeAxisView* tav = dynamic_cast<RouteTimeAxisView*> (*s);
-                       if (tav->route()->order_key() > order_hint) {
+                       if (tav && tav->route() && tav->route()->order_key() > order_hint) {
                                order_hint = tav->route()->order_key();
                        }
                }
@@ -3339,10 +3360,6 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
 
        PBD::ScopedConnection idle_connection;
 
-       if (count > 8) {
-               ARDOUR::GUIIdle.connect (idle_connection, MISSING_INVALIDATOR, boost::bind (&Gtkmm2ext::UI::flush_pending, this), gui_context());
-       }
-
        string template_path = add_route_dialog->track_template();
 
        if (!template_path.empty()) {
@@ -3392,7 +3409,7 @@ void
 ARDOUR_UI::stop_video_server (bool ask_confirm)
 {
        if (!video_server_process && ask_confirm) {
-               warning << _("Video-Server was not launched by Ardour. The request to stop it is ignored.") << endmsg;
+               warning << string_compose (_("Video-Server was not launched by %1. The request to stop it is ignored."), PROGRAM_NAME) << endmsg;
        }
        if (video_server_process) {
                if(ask_confirm) {
@@ -3777,6 +3794,41 @@ quickly enough to keep up with recording.\n"), PROGRAM_NAME));
        }
 }
 
+void
+ARDOUR_UI::cancel_plugin_scan ()
+{
+       PluginManager::instance().cancel_plugin_scan();
+}
+
+static MessageDialog *scan_dlg = NULL;
+
+void
+ARDOUR_UI::plugin_scan_dialog (std::string type, std::string plugin)
+{
+       if (!Config->get_show_plugin_scan_window()) { return; }
+       if (!scan_dlg) {
+               scan_dlg = new MessageDialog("", false, MESSAGE_INFO, BUTTONS_NONE);
+               VBox* vbox = scan_dlg->get_vbox();
+               vbox->set_size_request(400,-1);
+               scan_dlg->set_title (_("Scanning for plugins"));
+
+               Gtk::Button *cancel_button = manage(new Gtk::Button(_("Cancel plugin scan")));
+               cancel_button->set_name ("EditorGTKButton");
+               cancel_button->signal_clicked().connect ( mem_fun (*this, &ARDOUR_UI::cancel_plugin_scan) );
+
+               scan_dlg->get_vbox()->pack_start ( *cancel_button, PACK_SHRINK);
+       }
+
+       if (type == X_("closeme")) {
+               scan_dlg->hide();
+       } else {
+               scan_dlg->set_message(type + ": " + Glib::path_get_basename(plugin));
+               scan_dlg->show_all();
+       }
+
+       gtk_main_iteration ();
+}
+
 void
 ARDOUR_UI::disk_underrun_handler ()
 {