Rename windows VST stuff with a Windows prefix.
authorCarl Hetherington <carl@carlh.net>
Mon, 21 Nov 2011 17:42:29 +0000 (17:42 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 21 Nov 2011 17:42:29 +0000 (17:42 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@10738 d708f5d6-7413-0410-9779-e7cbd77b26cf

29 files changed:
gtk2_ardour/main.cc
gtk2_ardour/opts.cc
gtk2_ardour/plugin_selector.cc
gtk2_ardour/plugin_ui.cc
gtk2_ardour/plugin_ui.h
gtk2_ardour/vst_pluginui.cc [deleted file]
gtk2_ardour/vst_pluginui.h [deleted file]
gtk2_ardour/windows_vst_plugin_ui.cc [new file with mode: 0644]
gtk2_ardour/windows_vst_plugin_ui.h [new file with mode: 0644]
gtk2_ardour/wscript
libs/ardour/ardour/plugin_manager.h
libs/ardour/ardour/rc_configuration_vars.h
libs/ardour/ardour/session.h
libs/ardour/ardour/types.h
libs/ardour/ardour/vst_plugin.h [deleted file]
libs/ardour/ardour/windows_vst_plugin.h [new file with mode: 0644]
libs/ardour/buffer_set.cc
libs/ardour/enums.cc
libs/ardour/globals.cc
libs/ardour/plugin.cc
libs/ardour/plugin_insert.cc
libs/ardour/plugin_manager.cc
libs/ardour/processor.cc
libs/ardour/session_vst.cc
libs/ardour/vst_plugin.cc [deleted file]
libs/ardour/windows_vst_plugin.cc [new file with mode: 0644]
libs/ardour/wscript
vst/ardevst
wscript

index fc07758eea91e321a525613ee8aa4c59d762122a..6af714a02f1b423e08c8eec972386f8f4514c5c8 100644 (file)
@@ -452,9 +452,9 @@ sigpipe_handler (int /*signal*/)
 void close_external_ui_windows();
 #endif
 
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
 
-extern int gui_init (int* argc, char** argv[]);
+extern int windows_vst_gui_init (int* argc, char** argv[]);
 
 /* this is called from the entry point of a wine-compiled
    executable that is linked against gtk2_ardour built
@@ -474,11 +474,11 @@ int main (int argc, char *argv[])
 
        gtk_set_locale ();
 
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
        /* this does some magic that is needed to make GTK and Wine's own
           X11 client interact properly.
        */
-       gui_init (&argc, &argv);
+       windows_vst_gui_init (&argc, &argv);
 #endif
 
        (void) bindtextdomain (PACKAGE, localedir);
@@ -564,7 +564,7 @@ int main (int argc, char *argv[])
 #endif
        return 0;
 }
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
 } // end of extern C block
 #endif
 
index a0bf287d7a2784220cffd9c4bcb8fbdc36d7258e..6b4c5e9369d85932c6ed5fe576e4b464d4fdcbb7 100644 (file)
@@ -66,7 +66,7 @@ print_help (const char *execname)
             << _("  -N, --new session-name      Create a new session from the command line\n")
             << _("  -O, --no-hw-optimizations   Disable h/w specific optimizations\n")
             << _("  -S, --sync                  Draw the gui synchronously \n")
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
             << _("  -V, --novst                 Do not use VST support\n")
 #endif
             << _("  -E, --save <file>           Load the specified session, save it to <file> and then quit\n")
@@ -184,9 +184,9 @@ ARDOUR_COMMAND_LINE::parse_opts (int argc, char *argv[])
                        break;
 
                case 'V':
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
                        use_vst = false;
-#endif /* VST_SUPPORT */
+#endif /* WINDOWS_VST_SUPPORT */
                        break;
 
                case 'c':
index 71036b72da10f9d762aaaac34fbaebc390f97b11..f834e5e7d56898026ee951ab8d7be81377862698 100644 (file)
@@ -238,7 +238,7 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string&
                        case LV2:
                                compstr = X_("LV2");
                                break;
-                       case VST:
+                       case Windows_VST:
                                compstr = X_("VST");
                                break;
                        case LXVST:
@@ -351,14 +351,14 @@ PluginSelector::lv2_refiller (const std::string& filterstr)
 }
 
 void
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
 PluginSelector::vst_refiller (const std::string& filterstr)
 #else
 PluginSelector::vst_refiller (const std::string&)
 #endif
 {
-#ifdef VST_SUPPORT
-       refiller (manager.vst_plugin_info(), filterstr, "VST");
+#ifdef WINDOWS_VST_SUPPORT
+       refiller (manager.windows_vst_plugin_info(), filterstr, "VST");
 #endif
 }
 
@@ -599,8 +599,8 @@ PluginSelector::build_plugin_menu ()
        PluginInfoList all_plugs;
 
        all_plugs.insert (all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
-#ifdef VST_SUPPORT
-       all_plugs.insert (all_plugs.end(), manager.vst_plugin_info().begin(), manager.vst_plugin_info().end());
+#ifdef WINDOWS_VST_SUPPORT
+       all_plugs.insert (all_plugs.end(), manager.windows_vst_plugin_info().begin(), manager.windows_vst_plugin_info().end());
 #endif
 #ifdef LXVST_SUPPORT
        all_plugs.insert (all_plugs.end(), manager.lxvst_plugin_info().begin(), manager.lxvst_plugin_info().end());
index f7410bba3c2e5c38975232ae06ce9eb33ad86df0..66f418b6fea0120d9285c084ec5178207ff7edda 100644 (file)
@@ -46,9 +46,9 @@
 #include "ardour/plugin.h"
 #include "ardour/plugin_insert.h"
 #include "ardour/ladspa_plugin.h"
-#ifdef VST_SUPPORT
-#include "ardour/vst_plugin.h"
-#include "vst_pluginui.h"
+#ifdef WINDOWS_VST_SUPPORT
+#include "ardour/windows_vst_plugin.h"
+#include "windows_vst_plugin_ui.h"
 #endif
 #ifdef LXVST_SUPPORT
 #include "ardour/lxvst_plugin.h"
@@ -99,8 +99,8 @@ PluginUIWindow::PluginUIWindow (
                  << " editor: " << editor << std::endl;
        if (editor && insert->plugin()->has_editor()) {
                switch (insert->type()) {
-               case ARDOUR::VST:
-                       have_gui = create_vst_editor (insert);
+               case ARDOUR::Windows_VST:
+                       have_gui = create_windows_vst_editor (insert);
                        break;
                        
                case ARDOUR::LXVST:
@@ -120,7 +120,7 @@ PluginUIWindow::PluginUIWindow (
                        break;
 
                default:
-#ifndef VST_SUPPORT
+#ifndef WINDOWS_VST_SUPPORT
                        error << _("unknown type of editor-supplying plugin (note: no VST support in this version of ardour)")
                              << endmsg;
 #else
@@ -253,24 +253,24 @@ PluginUIWindow::set_title(const std::string& title)
 }
 
 bool
-#ifdef VST_SUPPORT
-PluginUIWindow::create_vst_editor(boost::shared_ptr<PluginInsert> insert)
+#ifdef WINDOWS_VST_SUPPORT
+PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PluginInsert> insert)
 #else
-PluginUIWindow::create_vst_editor(boost::shared_ptr<PluginInsert>)
+PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PluginInsert>)
 #endif
 {
-#ifndef VST_SUPPORT
+#ifndef WINDOWS_VST_SUPPORT
        return false;
 #else
 
-       boost::shared_ptr<VSTPlugin> vp;
+       boost::shared_ptr<WindowsVSTPlugin> vp;
 
-       if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (insert->plugin())) == 0) {
+       if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (insert->plugin())) == 0) {
                error << _("unknown type of editor-supplying plugin (note: no VST support in this version of ardour)")
                              << endmsg;
                throw failed_constructor ();
        } else {
-               VSTPluginUI* vpu = new VSTPluginUI (insert, vp);
+               WindowsVSTPluginUI* vpu = new WindowsVSTPluginUI (insert, vp);
 
                _pluginui = vpu;
                _pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
index 66b025527a7e3d4e4731607e5a557224b24f7f0f..95be14ceeeae26d496701d079818970ba4286611 100644 (file)
@@ -53,7 +53,7 @@
 namespace ARDOUR {
        class PluginInsert;
        class Plugin;
-       class VSTPlugin;
+       class WindowsVSTPlugin;
        class LXVSTPlugin;
        class IOProcessor;
        class AUPlugin;
@@ -297,7 +297,7 @@ class PluginUIWindow : public Gtk::Window
        void app_activated (bool);
        void plugin_going_away ();
 
-       bool create_vst_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
+       bool create_windows_vst_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
        bool create_lxvst_editor(boost::shared_ptr<ARDOUR::PluginInsert>);
        bool create_audiounit_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
        bool create_lv2_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
diff --git a/gtk2_ardour/vst_pluginui.cc b/gtk2_ardour/vst_pluginui.cc
deleted file mode 100644 (file)
index 8548c53..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
-    Copyright (C) 2004 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <fst.h>
-#include <gtk/gtk.h>
-#include <gtk/gtksocket.h>
-#include "ardour/plugin_insert.h"
-#include "ardour/vst_plugin.h"
-
-#include "vst_pluginui.h"
-
-#include <gdk/gdkx.h>
-
-using namespace Gtk;
-using namespace ARDOUR;
-using namespace PBD;
-
-VSTPluginUI::VSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VSTPlugin> vp)
-       : PlugUIBase (pi),
-         vst (vp)
-{
-       fst_run_editor (vst->fst());
-
-       preset_box.set_spacing (6);
-       preset_box.set_border_width (6);
-       preset_box.pack_end (focus_button, false, false);
-       preset_box.pack_end (bypass_button, false, false, 10);
-       preset_box.pack_end (delete_button, false, false);
-       preset_box.pack_end (save_button, false, false);
-       preset_box.pack_end (add_button, false, false);
-       preset_box.pack_end (_preset_box, false, false);
-
-       bypass_button.set_active (!insert->active());
-
-       pack_start (preset_box, false, false);
-       pack_start (socket, true, true);
-       pack_start (plugin_analysis_expander, true, true);
-}
-
-VSTPluginUI::~VSTPluginUI ()
-{
-       // plugin destructor destroys the custom GUI, via Windows fun-and-games,
-       // and then our PluginUIWindow does the rest
-}
-
-void
-VSTPluginUI::preset_selected ()
-{
-       socket.grab_focus ();
-       PlugUIBase::preset_selected ();
-}
-
-int
-VSTPluginUI::get_preferred_height ()
-{
-       return vst->fst()->height;
-}
-
-int
-VSTPluginUI::get_preferred_width ()
-{
-       return vst->fst()->width;
-}
-
-int
-VSTPluginUI::package (Gtk::Window& win)
-{
-       /* forward configure events to plugin window */
-
-       win.signal_configure_event().connect (sigc::bind (sigc::mem_fun (*this, &VSTPluginUI::configure_handler), &socket), false);
-
-       /*
-          this assumes that the window's owner understands the XEmbed protocol.
-       */
-
-       socket.add_id (fst_get_XID (vst->fst()));
-
-       fst_move_window_into_view (vst->fst());
-
-       return 0;
-}
-
-bool
-VSTPluginUI::configure_handler (GdkEventConfigure* ev, Gtk::Socket *socket)
-{
-       XEvent event;
-       gint x, y;
-       GdkWindow* w;
-
-       if (socket == 0 || ((w = socket->gobj()->plug_window) == 0)) {
-               return false;
-       }
-
-       event.xconfigure.type = ConfigureNotify;
-       event.xconfigure.event = GDK_WINDOW_XWINDOW (w);
-       event.xconfigure.window = GDK_WINDOW_XWINDOW (w);
-
-       /* The ICCCM says that synthetic events should have root relative
-        * coordinates. We still aren't really ICCCM compliant, since
-        * we don't send events when the real toplevel is moved.
-        */
-       gdk_error_trap_push ();
-       gdk_window_get_origin (w, &x, &y);
-       gdk_error_trap_pop ();
-
-       event.xconfigure.x = x;
-       event.xconfigure.y = y;
-       event.xconfigure.width = GTK_WIDGET(socket->gobj())->allocation.width;
-       event.xconfigure.height = GTK_WIDGET(socket->gobj())->allocation.height;
-
-       event.xconfigure.border_width = 0;
-       event.xconfigure.above = None;
-       event.xconfigure.override_redirect = False;
-
-       gdk_error_trap_push ();
-       XSendEvent (GDK_WINDOW_XDISPLAY (w), GDK_WINDOW_XWINDOW (w), False, StructureNotifyMask, &event);
-       gdk_error_trap_pop ();
-
-       return false;
-}
-
-void
-VSTPluginUI::forward_key_event (GdkEventKey* ev)
-{
-       if (ev->type == GDK_KEY_PRESS) {
-
-               FST* fst = vst->fst ();
-               pthread_mutex_lock (&fst->lock);
-
-               if (fst->n_pending_keys == (sizeof (fst->pending_keys) * sizeof (FSTKey))) {
-                       /* buffer full */
-                       return;
-               }
-
-               int special_windows_key = 0;
-               int character_windows_key = 0;
-
-               switch (ev->keyval) {
-               case GDK_Left:
-                       special_windows_key = 0x25;
-                       break;
-               case GDK_Right:
-                       special_windows_key = 0x27;
-                       break;
-               case GDK_Up:
-                       special_windows_key = 0x26;
-                       break;
-               case GDK_Down:
-                       special_windows_key = 0x28;
-                       break;
-               case GDK_Return:
-               case GDK_KP_Enter:
-                       special_windows_key = 0xd;
-                       break;
-               default:
-                       character_windows_key = ev->keyval;
-                       break;
-               }
-
-               fst->pending_keys[fst->n_pending_keys].special = special_windows_key;
-               fst->pending_keys[fst->n_pending_keys].character = character_windows_key;
-               fst->n_pending_keys++;
-
-               pthread_mutex_unlock (&fst->lock);
-       }
-}
-
-typedef int (*error_handler_t)( Display *, XErrorEvent *);
-static Display *the_gtk_display;
-static error_handler_t wine_error_handler;
-static error_handler_t gtk_error_handler;
-
-static int
-fst_xerror_handler( Display *disp, XErrorEvent *ev )
-{
-       if (disp == the_gtk_display) {
-               printf ("relaying error to gtk\n");
-               return gtk_error_handler (disp, ev);
-       } else {
-               printf( "relaying error to wine\n" );
-               return wine_error_handler (disp, ev);
-       }
-}
-
-void
-gui_init (int *argc, char **argv[])
-{
-       wine_error_handler = XSetErrorHandler (NULL);
-       gtk_init (argc, argv);
-       the_gtk_display = gdk_x11_display_get_xdisplay (gdk_display_get_default());
-       gtk_error_handler = XSetErrorHandler( fst_xerror_handler );
-}
-
diff --git a/gtk2_ardour/vst_pluginui.h b/gtk2_ardour/vst_pluginui.h
deleted file mode 100644 (file)
index cb77434..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-    Copyright (C) 2000-2006 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "plugin_ui.h"
-
-class VSTPluginUI : public PlugUIBase, public Gtk::VBox
-{
-  public:
-       VSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VSTPlugin>);
-       ~VSTPluginUI ();
-
-       gint get_preferred_height ();
-       gint get_preferred_width ();
-       bool start_updating(GdkEventAny*) {return false;}
-       bool stop_updating(GdkEventAny*) {return false;}
-
-       int package (Gtk::Window&);
-
-       void forward_key_event (GdkEventKey *);
-       bool non_gtk_gui () const { return true; }
-
-  private:
-       boost::shared_ptr<ARDOUR::VSTPlugin> vst;
-       Gtk::Socket socket;
-       Gtk::HBox   preset_box;
-       Gtk::VBox   vpacker;
-
-       bool configure_handler (GdkEventConfigure*, Gtk::Socket*);
-       void save_plugin_setting ();
-       void preset_selected ();
-};
diff --git a/gtk2_ardour/windows_vst_plugin_ui.cc b/gtk2_ardour/windows_vst_plugin_ui.cc
new file mode 100644 (file)
index 0000000..e764580
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+    Copyright (C) 2004 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <fst.h>
+#include <gtk/gtk.h>
+#include <gtk/gtksocket.h>
+#include "ardour/plugin_insert.h"
+#include "ardour/windows_vst_plugin.h"
+
+#include "windows_vst_plugin_ui.h"
+
+#include <gdk/gdkx.h>
+
+using namespace Gtk;
+using namespace ARDOUR;
+using namespace PBD;
+
+WindowsVSTPluginUI::WindowsVSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<WindowsVSTPlugin> vp)
+       : PlugUIBase (pi),
+         vst (vp)
+{
+       fst_run_editor (vst->fst());
+
+       preset_box.set_spacing (6);
+       preset_box.set_border_width (6);
+       preset_box.pack_end (focus_button, false, false);
+       preset_box.pack_end (bypass_button, false, false, 10);
+       preset_box.pack_end (delete_button, false, false);
+       preset_box.pack_end (save_button, false, false);
+       preset_box.pack_end (add_button, false, false);
+       preset_box.pack_end (_preset_box, false, false);
+
+       bypass_button.set_active (!insert->active());
+
+       pack_start (preset_box, false, false);
+       pack_start (socket, true, true);
+       pack_start (plugin_analysis_expander, true, true);
+}
+
+WindowsVSTPluginUI::~WindowsVSTPluginUI ()
+{
+       // plugin destructor destroys the custom GUI, via Windows fun-and-games,
+       // and then our PluginUIWindow does the rest
+}
+
+void
+WindowsVSTPluginUI::preset_selected ()
+{
+       socket.grab_focus ();
+       PlugUIBase::preset_selected ();
+}
+
+int
+WindowsVSTPluginUI::get_preferred_height ()
+{
+       return vst->fst()->height;
+}
+
+int
+WindowsVSTPluginUI::get_preferred_width ()
+{
+       return vst->fst()->width;
+}
+
+int
+WindowsVSTPluginUI::package (Gtk::Window& win)
+{
+       /* forward configure events to plugin window */
+
+       win.signal_configure_event().connect (sigc::bind (sigc::mem_fun (*this, &WindowsVSTPluginUI::configure_handler), &socket), false);
+
+       /*
+          this assumes that the window's owner understands the XEmbed protocol.
+       */
+
+       socket.add_id (fst_get_XID (vst->fst()));
+
+       fst_move_window_into_view (vst->fst());
+
+       return 0;
+}
+
+bool
+WindowsVSTPluginUI::configure_handler (GdkEventConfigure* ev, Gtk::Socket *socket)
+{
+       XEvent event;
+       gint x, y;
+       GdkWindow* w;
+
+       if (socket == 0 || ((w = socket->gobj()->plug_window) == 0)) {
+               return false;
+       }
+
+       event.xconfigure.type = ConfigureNotify;
+       event.xconfigure.event = GDK_WINDOW_XWINDOW (w);
+       event.xconfigure.window = GDK_WINDOW_XWINDOW (w);
+
+       /* The ICCCM says that synthetic events should have root relative
+        * coordinates. We still aren't really ICCCM compliant, since
+        * we don't send events when the real toplevel is moved.
+        */
+       gdk_error_trap_push ();
+       gdk_window_get_origin (w, &x, &y);
+       gdk_error_trap_pop ();
+
+       event.xconfigure.x = x;
+       event.xconfigure.y = y;
+       event.xconfigure.width = GTK_WIDGET(socket->gobj())->allocation.width;
+       event.xconfigure.height = GTK_WIDGET(socket->gobj())->allocation.height;
+
+       event.xconfigure.border_width = 0;
+       event.xconfigure.above = None;
+       event.xconfigure.override_redirect = False;
+
+       gdk_error_trap_push ();
+       XSendEvent (GDK_WINDOW_XDISPLAY (w), GDK_WINDOW_XWINDOW (w), False, StructureNotifyMask, &event);
+       gdk_error_trap_pop ();
+
+       return false;
+}
+
+void
+WindowsVSTPluginUI::forward_key_event (GdkEventKey* ev)
+{
+       if (ev->type == GDK_KEY_PRESS) {
+
+               FST* fst = vst->fst ();
+               pthread_mutex_lock (&fst->lock);
+
+               if (fst->n_pending_keys == (sizeof (fst->pending_keys) * sizeof (FSTKey))) {
+                       /* buffer full */
+                       return;
+               }
+
+               int special_windows_key = 0;
+               int character_windows_key = 0;
+
+               switch (ev->keyval) {
+               case GDK_Left:
+                       special_windows_key = 0x25;
+                       break;
+               case GDK_Right:
+                       special_windows_key = 0x27;
+                       break;
+               case GDK_Up:
+                       special_windows_key = 0x26;
+                       break;
+               case GDK_Down:
+                       special_windows_key = 0x28;
+                       break;
+               case GDK_Return:
+               case GDK_KP_Enter:
+                       special_windows_key = 0xd;
+                       break;
+               default:
+                       character_windows_key = ev->keyval;
+                       break;
+               }
+
+               fst->pending_keys[fst->n_pending_keys].special = special_windows_key;
+               fst->pending_keys[fst->n_pending_keys].character = character_windows_key;
+               fst->n_pending_keys++;
+
+               pthread_mutex_unlock (&fst->lock);
+       }
+}
+
+typedef int (*error_handler_t)( Display *, XErrorEvent *);
+static Display *the_gtk_display;
+static error_handler_t wine_error_handler;
+static error_handler_t gtk_error_handler;
+
+static int
+fst_xerror_handler( Display *disp, XErrorEvent *ev )
+{
+       if (disp == the_gtk_display) {
+               printf ("relaying error to gtk\n");
+               return gtk_error_handler (disp, ev);
+       } else {
+               printf( "relaying error to wine\n" );
+               return wine_error_handler (disp, ev);
+       }
+}
+
+void
+windows_vst_gui_init (int *argc, char **argv[])
+{
+       wine_error_handler = XSetErrorHandler (NULL);
+       gtk_init (argc, argv);
+       the_gtk_display = gdk_x11_display_get_xdisplay (gdk_display_get_default());
+       gtk_error_handler = XSetErrorHandler( fst_xerror_handler );
+}
+
diff --git a/gtk2_ardour/windows_vst_plugin_ui.h b/gtk2_ardour/windows_vst_plugin_ui.h
new file mode 100644 (file)
index 0000000..93b531f
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+    Copyright (C) 2000-2006 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "plugin_ui.h"
+
+class WindowsVSTPluginUI : public PlugUIBase, public Gtk::VBox
+{
+  public:
+       WindowsVSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::WindowsVSTPlugin>);
+       ~WindowsVSTPluginUI ();
+
+       gint get_preferred_height ();
+       gint get_preferred_width ();
+       bool start_updating(GdkEventAny*) {return false;}
+       bool stop_updating(GdkEventAny*) {return false;}
+
+       int package (Gtk::Window&);
+
+       void forward_key_event (GdkEventKey *);
+       bool non_gtk_gui () const { return true; }
+
+  private:
+       boost::shared_ptr<ARDOUR::WindowsVSTPlugin> vst;
+       Gtk::Socket socket;
+       Gtk::HBox   preset_box;
+       Gtk::VBox   vpacker;
+
+       bool configure_handler (GdkEventConfigure*, Gtk::Socket*);
+       void save_plugin_setting ();
+       void preset_selected ();
+};
index 50d617290a311fcfa2f1f0e978491c0d15630028..d9a9860ba523bbfa5d9e56496463e6628add161c 100644 (file)
@@ -345,7 +345,7 @@ def build_color_scheme(path, prefix):
 def build(bld):
     # GTK front-end; if we're using VST we build this as a shared library,
     # otherwise it's a normal executabale
-    if bld.is_defined('VST_SUPPORT'):
+    if bld.is_defined('WINDOWS_VST_SUPPORT'):
         obj = bld(features = 'cxx c cxxshlib')
     else:
         obj = bld(features = 'cxx c cxxprogram')
@@ -354,7 +354,7 @@ def build(bld):
     obj.source       = gtk2_ardour_sources
     obj.name         = 'gtk2_ardour'
     obj.linkflags    = []
-    if bld.is_defined('VST_SUPPORT'):
+    if bld.is_defined('WINDOWS_VST_SUPPORT'):
         obj.target = 'gtk2_ardour'
         obj.includes += ['../libs/fst']
     else:
@@ -392,9 +392,9 @@ def build(bld):
         obj.source +=  [ 'sfdb_freesound_mootcher.cc' ]
         obj.defines += [ 'FREESOUND' ]
 
-    if bld.is_defined('VST_SUPPORT'):
-        obj.source += [ 'vst_pluginui.cc' ]
-        obj.defines += [ 'VST_SUPPORT' ]
+    if bld.is_defined('WINDOWS_VST_SUPPORT'):
+        obj.source += [ 'windows_vst_plugin_ui.cc' ]
+        obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
         obj.uselib += ' X11 '
 
     if bld.is_defined('LXVST_SUPPORT'):
@@ -410,7 +410,7 @@ def build(bld):
         obj.source += [ 'cocoacarbon.mm', 'au_pluginui.mm' ]
         obj.use += ' libappleutility '
 
-    if bld.is_defined('VST_SUPPORT'):
+    if bld.is_defined('WINDOWS_VST_SUPPORT'):
         # If we require VST support we build a stub main() and the FST library
         # here using winegcc, and link it to the GTK front-end library
         obj = bld(features = 'cxx c cxxprogram wine')
@@ -423,7 +423,7 @@ def build(bld):
         '''
         obj.includes = '../libs/fst'
         obj.target = 'ardour-3.0-vst'
-        obj.linkflags += ['-mwindows', '-Wl,--export-dynamic', '-lpthread']
+        obj.linkflags = ['-mwindows', '-Wl,--export-dynamic', '-lpthread']
         obj.defines = ['_POSIX_SOURCE', 'USE_WS_PREFIX']
         obj.uselib = 'ALSA'
         obj.use = ['libpbd','libmidipp','libtaglib','libardour',
index 3c5ae5e18a087b0452058d801911f05a5fc7dfc2..a7a57036905a110d722cea3ee8c4359a8e652843 100644 (file)
@@ -43,7 +43,7 @@ class PluginManager : public boost::noncopyable {
 
        ~PluginManager ();
 
-       ARDOUR::PluginInfoList &vst_plugin_info ();
+       ARDOUR::PluginInfoList &windows_vst_plugin_info ();
        ARDOUR::PluginInfoList &lxvst_plugin_info ();
        ARDOUR::PluginInfoList &ladspa_plugin_info ();
        ARDOUR::PluginInfoList &lv2_plugin_info ();
@@ -52,7 +52,7 @@ class PluginManager : public boost::noncopyable {
        void refresh ();
 
        int add_ladspa_directory (std::string dirpath);
-       int add_vst_directory (std::string dirpath);
+       int add_windows_vst_directory (std::string dirpath);
        int add_lxvst_directory (std::string dirpath);
 
        enum PluginStatusType {
@@ -95,7 +95,7 @@ class PluginManager : public boost::noncopyable {
        PluginStatusList statuses;
 
        ARDOUR::PluginInfoList  _empty_plugin_info;
-       ARDOUR::PluginInfoList* _vst_plugin_info;
+       ARDOUR::PluginInfoList* _windows_vst_plugin_info;
        ARDOUR::PluginInfoList* _lxvst_plugin_info;
        ARDOUR::PluginInfoList* _ladspa_plugin_info;
        ARDOUR::PluginInfoList* _lv2_plugin_info;
@@ -104,16 +104,16 @@ class PluginManager : public boost::noncopyable {
        std::map<uint32_t, std::string> rdf_type;
 
        std::string ladspa_path;
-       std::string vst_path;
+       std::string windows_vst_path;
        std::string lxvst_path;
 
        void ladspa_refresh ();
-       void vst_refresh ();
+       void windows_vst_refresh ();
        void lxvst_refresh ();
 
        void add_lrdf_data (const std::string &path);
        void add_ladspa_presets ();
-       void add_vst_presets ();
+       void add_windows_vst_presets ();
        void add_lxvst_presets ();
        void add_presets (std::string domain);
 
@@ -121,8 +121,8 @@ class PluginManager : public boost::noncopyable {
 
        void lv2_refresh ();
 
-       int vst_discover_from_path (std::string path);
-       int vst_discover (std::string path);
+       int windows_vst_discover_from_path (std::string path);
+       int windows_vst_discover (std::string path);
        
        int lxvst_discover_from_path (std::string path);
        int lxvst_discover (std::string path);
index 35f5ce9838c2e0018e102eb3cdc96b731ad81d0b..621e96d78a3bde42efebd77d34b90bb8a2c726d2 100644 (file)
@@ -140,7 +140,7 @@ CONFIG_VARIABLE (bool, replicate_missing_region_channels, "replicate-missing-reg
 CONFIG_VARIABLE (bool, hiding_groups_deactivates_groups, "hiding-groups-deactivates-groups", true)
 CONFIG_VARIABLE (bool, verify_remove_last_capture, "verify-remove-last-capture", true)
 CONFIG_VARIABLE (bool, no_new_session_dialog, "no-new-session-dialog", false)
-CONFIG_VARIABLE (bool, use_vst, "use-vst", true)
+CONFIG_VARIABLE (bool, use_windows_vst, "use-windows-vst", true)
 CONFIG_VARIABLE (bool, use_lxvst, "use-lxvst", true)
 CONFIG_VARIABLE (bool, save_history, "save-history", true)
 CONFIG_VARIABLE (int32_t, saved_history_depth, "save-history-depth", 20)
index fd607cd6f67e704f40a017b97149d2fd4a051593..252c824ce76618a622de8cc4ac1aa1e7042613d3 100644 (file)
@@ -127,7 +127,7 @@ class Source;
 class Speakers;
 class TempoMap;
 class Track;
-class VSTPlugin;
+class WindowsVSTPlugin;
 
 extern void setup_enum_writer ();
 
@@ -1420,14 +1420,16 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
        boost::shared_ptr<Route> _master_out;
        boost::shared_ptr<Route> _monitor_out;
 
-       /* VST support */
+       /* Windows VST support */
 
-       long _vst_callback (VSTPlugin*,
-                       long opcode,
-                       long index,
-                       long value,
-                       void* ptr,
-                       float opt);
+       long _windows_vst_callback (
+               WindowsVSTPlugin*,
+               long opcode,
+               long index,
+               long value,
+               void* ptr,
+               float opt
+               );
 
        /* number of hardware ports we're using,
           based on max (requested,available)
index 417a9ed54d5f197edfbaa1c031e2bd671b7988ef..d5189622884b8580eb493a0e90e16ec32881bad7 100644 (file)
@@ -462,7 +462,7 @@ namespace ARDOUR {
                AudioUnit,
                LADSPA,
                LV2,
-               VST,
+               Windows_VST,
                LXVST,
        };
 
diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h
deleted file mode 100644 (file)
index d152205..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-    Copyright (C) 2004 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef __ardour_vst_plugin_h__
-#define __ardour_vst_plugin_h__
-
-#include <list>
-#include <map>
-#include <set>
-#include <vector>
-#include <string>
-#include <dlfcn.h>
-
-#include "pbd/stateful.h"
-#include "ardour/plugin.h"
-
-struct _FSTHandle;
-struct _FST;
-typedef struct _FSTHandle FSTHandle;
-typedef struct _FST FST;
-class AEffect;
-
-namespace ARDOUR {
-class AudioEngine;
-class Session;
-
-class VSTPlugin : public ARDOUR::Plugin
-{
-  public:
-       VSTPlugin (ARDOUR::AudioEngine&, ARDOUR::Session&, FSTHandle* handle);
-       VSTPlugin (const VSTPlugin &);
-       ~VSTPlugin ();
-
-       /* Plugin interface */
-
-       std::string unique_id() const;
-       const char * label() const;
-       const char * name() const;
-       const char * maker() const;
-       uint32_t parameter_count() const;
-       float default_value (uint32_t port);
-       framecnt_t signal_latency() const;
-       void set_parameter (uint32_t port, float val);
-       float get_parameter (uint32_t port) const;
-       int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
-       std::set<Evoral::Parameter> automatable() const;
-       uint32_t nth_parameter (uint32_t port, bool& ok) const;
-       void activate ();
-       void deactivate ();
-       int set_block_size (pframes_t);
-
-       int connect_and_run (BufferSet&,
-                       ChanMapping in, ChanMapping out,
-                       pframes_t nframes, framecnt_t offset);
-
-       std::string describe_parameter (Evoral::Parameter);
-       std::string state_node_name() const { return "vst"; }
-       void print_parameter (uint32_t, char*, uint32_t len) const;
-
-       bool parameter_is_audio(uint32_t i) const { return false; }
-       bool parameter_is_control(uint32_t i) const { return true; }
-       bool parameter_is_input(uint32_t i) const { return true; }
-       bool parameter_is_output(uint32_t i) const { return false; }
-
-       bool load_preset (PresetRecord);
-       int first_user_preset_index () const;
-
-       bool has_editor () const;
-
-       int set_state (XMLNode const &, int);
-
-       AEffect * plugin () const { return _plugin; }
-       FST * fst () const { return _fst; }
-
-private:
-
-       void do_remove_preset (std::string name);
-       std::string do_save_preset (std::string name);
-       gchar* get_chunk (bool) const;
-       int set_chunk (gchar const *, bool);
-       XMLTree * presets_tree () const;
-       std::string presets_file () const;
-       void find_presets ();
-       bool load_user_preset (PresetRecord);
-       bool load_plugin_preset (PresetRecord);
-       void add_state (XMLNode *) const;
-
-       FSTHandle* handle;
-       FST*       _fst;
-       AEffect*   _plugin;
-       bool        been_resumed;
-};
-
-class VSTPluginInfo : public PluginInfo
-{
-  public:
-       VSTPluginInfo ();
-       ~VSTPluginInfo () {}
-
-       PluginPtr load (Session& session);
-};
-
-typedef boost::shared_ptr<VSTPluginInfo> VSTPluginInfoPtr;
-
-} // namespace ARDOUR
-
-#endif /* __ardour_vst_plugin_h__ */
diff --git a/libs/ardour/ardour/windows_vst_plugin.h b/libs/ardour/ardour/windows_vst_plugin.h
new file mode 100644 (file)
index 0000000..5e6d906
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+    Copyright (C) 2004 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_windows_vst_plugin_h__
+#define __ardour_windows_vst_plugin_h__
+
+#include <list>
+#include <map>
+#include <set>
+#include <vector>
+#include <string>
+#include <dlfcn.h>
+
+#include "pbd/stateful.h"
+#include "ardour/plugin.h"
+
+struct _FSTHandle;
+struct _FST;
+typedef struct _FSTHandle FSTHandle;
+typedef struct _FST FST;
+class AEffect;
+
+namespace ARDOUR {
+class AudioEngine;
+class Session;
+
+class WindowsVSTPlugin : public ARDOUR::Plugin
+{
+  public:
+       WindowsVSTPlugin (ARDOUR::AudioEngine&, ARDOUR::Session&, FSTHandle* handle);
+       WindowsVSTPlugin (const WindowsVSTPlugin &);
+       ~WindowsVSTPlugin ();
+
+       /* Plugin interface */
+
+       std::string unique_id() const;
+       const char * label() const;
+       const char * name() const;
+       const char * maker() const;
+       uint32_t parameter_count() const;
+       float default_value (uint32_t port);
+       framecnt_t signal_latency() const;
+       void set_parameter (uint32_t port, float val);
+       float get_parameter (uint32_t port) const;
+       int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
+       std::set<Evoral::Parameter> automatable() const;
+       uint32_t nth_parameter (uint32_t port, bool& ok) const;
+       void activate ();
+       void deactivate ();
+       int set_block_size (pframes_t);
+
+       int connect_and_run (BufferSet&,
+                       ChanMapping in, ChanMapping out,
+                       pframes_t nframes, framecnt_t offset);
+
+       std::string describe_parameter (Evoral::Parameter);
+       std::string state_node_name() const { return "windows-vst"; }
+       void print_parameter (uint32_t, char*, uint32_t len) const;
+
+       bool parameter_is_audio(uint32_t i) const { return false; }
+       bool parameter_is_control(uint32_t i) const { return true; }
+       bool parameter_is_input(uint32_t i) const { return true; }
+       bool parameter_is_output(uint32_t i) const { return false; }
+
+       bool load_preset (PresetRecord);
+       int first_user_preset_index () const;
+
+       bool has_editor () const;
+
+       int set_state (XMLNode const &, int);
+
+       AEffect * plugin () const { return _plugin; }
+       FST * fst () const { return _fst; }
+
+private:
+
+       void do_remove_preset (std::string name);
+       std::string do_save_preset (std::string name);
+       gchar* get_chunk (bool) const;
+       int set_chunk (gchar const *, bool);
+       XMLTree * presets_tree () const;
+       std::string presets_file () const;
+       void find_presets ();
+       bool load_user_preset (PresetRecord);
+       bool load_plugin_preset (PresetRecord);
+       void add_state (XMLNode *) const;
+
+       FSTHandle* handle;
+       FST*       _fst;
+       AEffect*   _plugin;
+       bool        been_resumed;
+};
+
+class WindowsVSTPluginInfo : public PluginInfo
+{
+  public:
+       WindowsVSTPluginInfo ();
+       ~WindowsVSTPluginInfo () {}
+
+       PluginPtr load (Session& session);
+};
+
+typedef boost::shared_ptr<WindowsVSTPluginInfo> WindowsVSTPluginInfoPtr;
+
+} // namespace ARDOUR
+
+#endif /* __ardour_vst_plugin_h__ */
index 663b5e8ca0d69f0afe70f121f9c5475960cc37a2..b57047dfee9a512774312d29310c2355b55f3459 100644 (file)
@@ -37,7 +37,7 @@
 #include "ardour/lv2_plugin.h"
 #include "ardour/lv2_event_buffer.h"
 #endif
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
 #include "vestige/aeffectx.h"
 #endif
 
@@ -81,7 +81,7 @@ BufferSet::clear()
        _count.reset();
        _available.reset();
 
-#if defined VST_SUPPORT || defined LXVST_SUPPORT 
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT 
        for (VSTBuffers::iterator i = _vst_buffers.begin(); i != _vst_buffers.end(); ++i) {
                delete *i;
        }
@@ -197,7 +197,7 @@ BufferSet::ensure_buffers(DataType type, size_t num_buffers, size_t buffer_capac
        }
 #endif
 
-#if defined VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
        // As above but for VST
        if (type == DataType::MIDI) {
                while (_vst_buffers.size() < _buffers[type].size()) {
@@ -304,7 +304,7 @@ BufferSet::flush_lv2_midi(bool input, size_t i)
 
 #endif /* LV2_SUPPORT */
 
-#if defined VST_SUPPORT || defined LXVST_SUPPORT
+#if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT
 
 VstEvents*
 BufferSet::get_vst_midi (size_t b)
@@ -381,7 +381,7 @@ BufferSet::VSTBuffer::push_back (Evoral::MIDIEvent<framepos_t> const & ev)
        _events->numEvents++;
 }
 
-#endif /* VST_SUPPORT */
+#endif /* WINDOWS_VST_SUPPORT */
 
 /** Copy buffers of one type from `in' to this BufferSet */
 void
index 5753d85d9615085bce0c001c5ee4f28b0ce091e9..1f75f5ab436dafef9676ea1578bce0f2a92ce28d 100644 (file)
@@ -306,7 +306,8 @@ setup_enum_writer ()
 
        REGISTER_ENUM (AudioUnit);
        REGISTER_ENUM (LADSPA);
-       REGISTER_ENUM (VST);
+       REGISTER_ENUM (Windows_VST);
+       REGISTER_ENUM (LXVST);
        REGISTER (_PluginType);
 
        REGISTER_ENUM (MTC);
index f1a0f71847ec036dfe1ff7306729513bc69cc879..e07437ce9df954efe0d57ce1e965245333690add 100644 (file)
@@ -29,7 +29,7 @@
 #include <fcntl.h>
 #include <errno.h>
 
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
 #include <fst.h>
 #endif
 
@@ -241,7 +241,7 @@ lotsa_files_please ()
 }
 
 int
-ARDOUR::init (bool use_vst, bool try_optimization)
+ARDOUR::init (bool use_windows_vst, bool try_optimization)
 {
        if (!Glib::thread_supported()) {
                Glib::thread_init();
@@ -293,7 +293,7 @@ ARDOUR::init (bool use_vst, bool try_optimization)
                return -1;
        }
 
-       Config->set_use_vst (use_vst);
+       Config->set_use_windows_vst (use_windows_vst);
 #ifdef LXVST_SUPPORT
        Config->set_use_lxvst(true);
 #endif
@@ -301,8 +301,8 @@ ARDOUR::init (bool use_vst, bool try_optimization)
        Profile = new RuntimeProfile;
 
 
-#ifdef VST_SUPPORT
-       if (Config->get_use_vst() && fst_init (0)) {
+#ifdef WINDOWS_VST_SUPPORT
+       if (Config->get_use_windows_vst() && fst_init (0)) {
                return -1;
        }
 #endif
@@ -386,7 +386,7 @@ ARDOUR::cleanup ()
        delete Library;
        lrdf_cleanup ();
        delete &ControlProtocolManager::instance();
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
        fst_exit ();
 #endif
 
index bf22de6c6c9d30af8721102215f563c526910030..8c8bf248e0d4a8f5065b2bab5c1ded66ce4a3175 100644 (file)
@@ -133,9 +133,9 @@ ARDOUR::find_plugin(Session& session, string identifier, PluginType type)
                break;
 #endif
 
-#ifdef VST_SUPPORT
-       case ARDOUR::VST:
-               plugs = mgr.vst_plugin_info();
+#ifdef WINDOWS_VST_SUPPORT
+       case ARDOUR::Windows_VST:
+               plugs = mgr.windows_vst_plugin_info();
                break;
 #endif
 
@@ -163,7 +163,7 @@ ARDOUR::find_plugin(Session& session, string identifier, PluginType type)
                }
        }
 
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
        /* hmm, we didn't find it. could be because in older versions of Ardour.
           we used to store the name of a VST plugin, not its unique ID. so try
           again.
index 744b53a652a9f06acbcd8d149263cdca16d940d1..aae9278e93e7982417ca8621a08d18c20c8f3cb5 100644 (file)
@@ -42,8 +42,8 @@
 #include "ardour/lv2_plugin.h"
 #endif
 
-#ifdef VST_SUPPORT
-#include "ardour/vst_plugin.h"
+#ifdef WINDOWS_VST_SUPPORT
+#include "ardour/windows_vst_plugin.h"
 #endif
 
 #ifdef LXVST_SUPPORT
@@ -609,8 +609,8 @@ PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
 #ifdef LV2_SUPPORT
        boost::shared_ptr<LV2Plugin> lv2p;
 #endif
-#ifdef VST_SUPPORT
-       boost::shared_ptr<VSTPlugin> vp;
+#ifdef WINDOWS_VST_SUPPORT
+       boost::shared_ptr<WindowsVSTPlugin> vp;
 #endif
 #ifdef LXVST_SUPPORT
        boost::shared_ptr<LXVSTPlugin> lxvp;
@@ -625,9 +625,9 @@ PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
        } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
                return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
 #endif
-#ifdef VST_SUPPORT
-       } else if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (other)) != 0) {
-               return boost::shared_ptr<Plugin> (new VSTPlugin (*vp));
+#ifdef WINDOWS_VST_SUPPORT
+       } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
+               return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
 #endif
 #ifdef LXVST_SUPPORT
        } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
@@ -909,8 +909,8 @@ PluginInsert::set_state(const XMLNode& node, int version)
                type = ARDOUR::LADSPA;
        } else if (prop->value() == X_("lv2")) {
                type = ARDOUR::LV2;
-       } else if (prop->value() == X_("vst")) {
-               type = ARDOUR::VST;
+       } else if (prop->value() == X_("windows-vst")) {
+               type = ARDOUR::Windows_VST;
        } else if (prop->value() == X_("lxvst")) {
                type = ARDOUR::LXVST;
        } else if (prop->value() == X_("audiounit")) {
@@ -925,11 +925,11 @@ PluginInsert::set_state(const XMLNode& node, int version)
        prop = node.property ("unique-id");
 
        if (prop == 0) {
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
                /* older sessions contain VST plugins with only an "id" field.
                 */
 
-               if (type == ARDOUR::VST) {
+               if (type == ARDOUR::Windows_VST) {
                        prop = node.property ("id");
                }
 #endif
index d15f48e5f3078c85452236d61466f7620a72d7ba..dc7b3bc0d3759a8449fbdf667736af8300e8a6a7 100644 (file)
 #include <cstdlib>
 #include <fstream>
 
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
 #include <fst.h>
 #include "pbd/basename.h"
 #include <cstring>
-#endif // VST_SUPPORT
+#endif // WINDOWS_VST_SUPPORT
 
 #ifdef LXVST_SUPPORT
 #include <ardour/vstfx.h>
@@ -59,8 +59,8 @@
 #include "ardour/lv2_plugin.h"
 #endif
 
-#ifdef VST_SUPPORT
-#include "ardour/vst_plugin.h"
+#ifdef WINDOWS_VST_SUPPORT
+#include "ardour/windows_vst_plugin.h"
 #endif
 
 #ifdef LXVST_SUPPORT
@@ -93,7 +93,7 @@ PluginManager::instance()
 }
 
 PluginManager::PluginManager ()
-       : _vst_plugin_info(0)
+       : _windows_vst_plugin_info(0)
        , _lxvst_plugin_info(0)
        , _ladspa_plugin_info(0)
        , _lv2_plugin_info(0)
@@ -114,11 +114,11 @@ PluginManager::PluginManager ()
 
        add_lrdf_data(lrdf_path);
        add_ladspa_presets();
-#ifdef VST_SUPPORT
-       if (Config->get_use_vst()) {
-               add_vst_presets();
+#ifdef WINDOWS_VST_SUPPORT
+       if (Config->get_use_windows_vst ()) {
+               add_windows_vst_presets ();
        }
-#endif /* VST_SUPPORT */
+#endif /* WINDOWS_VST_SUPPORT */
 
 #ifdef LXVST_SUPPORT
        if (Config->get_use_lxvst()) {
@@ -131,9 +131,9 @@ PluginManager::PluginManager ()
        }
 
        if ((s = getenv ("VST_PATH"))) {
-               vst_path = s;
+               windows_vst_path = s;
        } else if ((s = getenv ("VST_PLUGINS"))) {
-               vst_path = s;
+               windows_vst_path = s;
        }
 
        if ((s = getenv ("LXVST_PATH"))) {
@@ -176,11 +176,11 @@ PluginManager::refresh ()
 #ifdef LV2_SUPPORT
        lv2_refresh ();
 #endif
-#ifdef VST_SUPPORT
-       if (Config->get_use_vst()) {
-               vst_refresh ();
+#ifdef WINDOWS_VST_SUPPORT
+       if (Config->get_use_windows_vst()) {
+               windows_vst_refresh ();
        }
-#endif // VST_SUPPORT
+#endif // WINDOWS_VST_SUPPORT
 
 #ifdef LXVST_SUPPORT
        if(Config->get_use_lxvst()) {
@@ -300,9 +300,9 @@ PluginManager::add_ladspa_presets()
 }
 
 void
-PluginManager::add_vst_presets()
+PluginManager::add_windows_vst_presets()
 {
-       add_presets ("vst");
+       add_presets ("windows-vst");
 }
 
 void
@@ -526,35 +526,36 @@ PluginManager::au_refresh ()
 
 #endif
 
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
 
 void
-PluginManager::vst_refresh ()
+PluginManager::windows_vst_refresh ()
 {
-       if (_vst_plugin_info)
-               _vst_plugin_info->clear ();
-       else
-               _vst_plugin_info = new ARDOUR::PluginInfoList();
+       if (_windows_vst_plugin_info) {
+               _windows_vst_plugin_info->clear ();
+       } else {
+               _windows_vst_plugin_info = new ARDOUR::PluginInfoList();
+       }
 
-       if (vst_path.length() == 0) {
-               vst_path = "/usr/local/lib/vst:/usr/lib/vst";
+       if (windows_vst_path.length() == 0) {
+               windows_vst_path = "/usr/local/lib/vst:/usr/lib/vst";
        }
 
-       vst_discover_from_path (vst_path);
+       windows_vst_discover_from_path (windows_vst_path);
 }
 
 int
-PluginManager::add_vst_directory (string path)
+PluginManager::add_windows_vst_directory (string path)
 {
-       if (vst_discover_from_path (path) == 0) {
-               vst_path += ':';
-               vst_path += path;
+       if (windows_vst_discover_from_path (path) == 0) {
+               windows_vst_path += ':';
+               windows_vst_path += path;
                return 0;
        }
        return -1;
 }
 
-static bool vst_filter (const string& str, void *arg)
+static bool windows_vst_filter (const string& str, void *arg)
 {
        /* Not a dotfile, has a prefix before a period, suffix is "dll" */
 
@@ -562,20 +563,20 @@ static bool vst_filter (const string& str, void *arg)
 }
 
 int
-PluginManager::vst_discover_from_path (string path)
+PluginManager::windows_vst_discover_from_path (string path)
 {
        PathScanner scanner;
        vector<string *> *plugin_objects;
        vector<string *>::iterator x;
        int ret = 0;
 
-       DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting VST plugins along %1\n", path));
+       DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path));
 
-       plugin_objects = scanner (vst_path, vst_filter, 0, false, true);
+       plugin_objects = scanner (windows_vst_path, windows_vst_filter, 0, false, true);
 
        if (plugin_objects) {
                for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
-                       vst_discover (**x);
+                       windows_vst_discover (**x);
                }
        }
 
@@ -584,13 +585,13 @@ PluginManager::vst_discover_from_path (string path)
 }
 
 int
-PluginManager::vst_discover (string path)
+PluginManager::windows_vst_discover (string path)
 {
        FSTInfo* finfo;
        char buf[32];
 
        if ((finfo = fst_get_info (const_cast<char *> (path.c_str()))) == 0) {
-               warning << "Cannot get VST information from " << path << endmsg;
+               warning << "Cannot get Windows VST information from " << path << endmsg;
                return -1;
        }
 
@@ -600,7 +601,7 @@ PluginManager::vst_discover (string path)
                        << endl;
        }
 
-       PluginInfoPtr info(new VSTPluginInfo);
+       PluginInfoPtr info (new WindowsVSTPluginInfo);
 
        /* what a joke freeware VST is */
 
@@ -620,15 +621,15 @@ PluginManager::vst_discover (string path)
        info->n_inputs.set_audio (finfo->numInputs);
        info->n_outputs.set_audio (finfo->numOutputs);
        info->n_inputs.set_midi (finfo->wantMidi ? 1 : 0);
-       info->type = ARDOUR::VST;
+       info->type = ARDOUR::Windows_VST;
 
-       _vst_plugin_info->push_back (info);
+       _windows_vst_plugin_info->push_back (info);
        fst_free_info (finfo);
 
        return 0;
 }
 
-#endif // VST_SUPPORT
+#endif // WINDOWS_VST_SUPPORT
 
 #ifdef LXVST_SUPPORT
 
@@ -786,8 +787,8 @@ PluginManager::save_statuses ()
                case LV2:
                        ofs << "LV2";
                        break;
-               case VST:
-                       ofs << "VST";
+               case Windows_VST:
+                       ofs << "Windows-VST";
                        break;
                case LXVST:
                        ofs << "LXVST";
@@ -874,8 +875,8 @@ PluginManager::load_statuses ()
                        type = AudioUnit;
                } else if (stype == "LV2") {
                        type = LV2;
-               } else if (stype == "VST") {
-                       type = VST;
+               } else if (stype == "Windows-VST") {
+                       type = Windows_VST;
                } else if (stype == "LXVST") {
                        type = LXVST;
                } else {
@@ -906,12 +907,13 @@ PluginManager::set_status (PluginType t, string id, PluginStatusType status)
 }
 
 ARDOUR::PluginInfoList&
-PluginManager::vst_plugin_info ()
+PluginManager::windows_vst_plugin_info ()
 {
-#ifdef VST_SUPPORT
-       if (!_vst_plugin_info)
-               vst_refresh();
-       return *_vst_plugin_info;
+#ifdef WINDOWS_VST_SUPPORT
+       if (!_windows_vst_plugin_info) {
+               windows_vst_refresh ();
+       }
+       return *_windows_vst_plugin_info;
 #else
        return _empty_plugin_info;
 #endif
index cbec3e602901a8130c986c896f0a408d8ab71338..4be545126bb5f82aa684700e7e9ff2f1fcc55659 100644 (file)
@@ -38,8 +38,8 @@
 #include "ardour/port_insert.h"
 #include "ardour/plugin_insert.h"
 
-#ifdef VST_SUPPORT
-#include "ardour/vst_plugin.h"
+#ifdef WINDOWS_VST_SUPPORT
+#include "ardour/windows_vst_plugin.h"
 #endif
 
 #ifdef AUDIOUNIT_SUPPORT
index 2aa873c6e641cd8df324e4f3150d8d8026575649..504519bfab0bec86555d9b433534d65f8e6a222c 100644 (file)
@@ -25,7 +25,7 @@
 
 #include "ardour/session.h"
 #include "ardour/tempo.h"
-#include "ardour/vst_plugin.h"
+#include "ardour/windows_vst_plugin.h"
 
 #include "i18n.h"
 
@@ -48,7 +48,7 @@ long Session::vst_callback (AEffect* effect,
                            float opt)
 {
        static VstTimeInfo _timeInfo;
-       VSTPlugin* plug;
+       WindowsVSTPlugin* plug;
        Session* session;
 
        if (debug_callbacks < 0) {
@@ -56,7 +56,7 @@ long Session::vst_callback (AEffect* effect,
        }
 
        if (effect && effect->user) {
-               plug = (VSTPlugin*) (effect->user);
+               plug = (WindowsVSTPlugin*) (effect->user);
                session = &plug->session();
                SHOW_CALLBACK ("am callback 0x%x, opcode = %ld, plugin = \"%s\" ", (int) pthread_self(), opcode, plug->name());
        } else {
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
deleted file mode 100644 (file)
index 869e5ad..0000000
+++ /dev/null
@@ -1,809 +0,0 @@
-/*
-    Copyright (C) 2004 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <algorithm>
-#include <vector>
-#include <string>
-#include <cctype>
-
-#include <cstdlib>
-#include <cstdio> // so libraptor doesn't complain
-#include <cmath>
-#include <dirent.h>
-#include <cstring> // for memmove
-#include <sys/stat.h>
-#include <cerrno>
-
-#include <glibmm/miscutils.h>
-
-#include <lrdf.h>
-#include <fst.h>
-
-#include "pbd/compose.h"
-#include "pbd/error.h"
-#include "pbd/pathscanner.h"
-#include "pbd/xml++.h"
-
-#include <fst.h>
-
-#include "ardour/session.h"
-#include "ardour/audioengine.h"
-#include "ardour/filesystem_paths.h"
-#include "ardour/vst_plugin.h"
-#include "ardour/buffer_set.h"
-#include "ardour/audio_buffer.h"
-#include "ardour/midi_buffer.h"
-
-#include "pbd/stl_delete.h"
-
-#include "i18n.h"
-#include <locale.h>
-
-using namespace std;
-using namespace ARDOUR;
-using namespace PBD;
-using std::min;
-using std::max;
-
-VSTPlugin::VSTPlugin (AudioEngine& e, Session& session, FSTHandle* h)
-       : Plugin (e, session)
-{
-       handle = h;
-
-       if ((_fst = fst_instantiate (handle, Session::vst_callback, this)) == 0) {
-               throw failed_constructor();
-       }
-
-       _plugin = _fst->plugin;
-       _plugin->user = this;
-
-       /* set rate and blocksize */
-
-       _plugin->dispatcher (_plugin, effSetSampleRate, 0, 0, NULL,
-                            (float) session.frame_rate());
-       _plugin->dispatcher (_plugin, effSetBlockSize, 0,
-                            session.get_block_size(), NULL, 0.0f);
-
-       /* set program to zero */
-
-       _plugin->dispatcher (_plugin, effSetProgram, 0, 0, NULL, 0.0f);
-
-       // Plugin::setup_controls ();
-}
-
-VSTPlugin::VSTPlugin (const VSTPlugin &other)
-       : Plugin (other)
-{
-       handle = other.handle;
-
-       if ((_fst = fst_instantiate (handle, Session::vst_callback, this)) == 0) {
-               throw failed_constructor();
-       }
-       _plugin = _fst->plugin;
-
-       // Plugin::setup_controls ();
-}
-
-VSTPlugin::~VSTPlugin ()
-{
-       deactivate ();
-       fst_close (_fst);
-}
-
-int
-VSTPlugin::set_block_size (pframes_t nframes)
-{
-       deactivate ();
-       _plugin->dispatcher (_plugin, effSetBlockSize, 0, nframes, NULL, 0.0f);
-       activate ();
-        return 0;
-}
-
-float
-VSTPlugin::default_value (uint32_t port)
-{
-       return 0;
-}
-
-void
-VSTPlugin::set_parameter (uint32_t which, float val)
-{
-       _plugin->setParameter (_plugin, which, val);
-
-       if (_fst->want_program == -1 && _fst->want_chunk == 0) {
-               /* Heinous hack: Plugin::set_parameter below updates the `modified' status of the
-                  current preset, but if _fst->want_program is not -1 then there is a preset
-                  setup pending or in progress, which we don't want any `modified' updates
-                  to happen for.  So we only do this if _fst->want_program is -1.
-               */
-               Plugin::set_parameter (which, val);
-       }
-}
-
-float
-VSTPlugin::get_parameter (uint32_t which) const
-{
-       return _plugin->getParameter (_plugin, which);
-
-}
-
-uint32_t
-VSTPlugin::nth_parameter (uint32_t n, bool& ok) const
-{
-       ok = true;
-       return n;
-}
-
-/** Get VST chunk as base64-encoded data.
- *  @param single true for single program, false for all programs.
- *  @return 0-terminated base64-encoded data; must be passed to g_free () by caller.
- */
-gchar *
-VSTPlugin::get_chunk (bool single) const
-{
-       guchar* data;
-       int32_t data_size = _plugin->dispatcher (_plugin, 23 /* effGetChunk */, single ? 1 : 0, 0, &data, 0);
-       if (data_size == 0) {
-               return 0;
-       }
-
-       return g_base64_encode (data, data_size);
-}
-
-/** Set VST chunk from base64-encoded data.
- *  @param 0-terminated base64-encoded data.
- *  @param single true for single program, false for all programs.
- *  @return 0 on success, non-0 on failure
- */
-int
-VSTPlugin::set_chunk (gchar const * data, bool single)
-{
-       gsize size = 0;
-       guchar* raw_data = g_base64_decode (data, &size);
-       int const r = _plugin->dispatcher (_plugin, 24 /* effSetChunk */, single ? 1 : 0, size, raw_data, 0);
-       g_free (raw_data);
-       return r;
-}
-
-void
-VSTPlugin::add_state (XMLNode* root) const
-{
-       LocaleGuard lg (X_("POSIX"));
-
-       if (_fst->current_program != -1) {
-               char buf[32];
-               snprintf (buf, sizeof (buf), "%d", _fst->current_program);
-               root->add_property ("current-program", buf);
-       }
-
-       if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
-
-               gchar* data = get_chunk (false);
-               if (data == 0) {
-                       return;
-               }
-
-               /* store information */
-
-               XMLNode* chunk_node = new XMLNode (X_("chunk"));
-
-               chunk_node->add_content (data);
-               g_free (data);
-
-               root->add_child_nocopy (*chunk_node);
-
-       } else {
-
-               XMLNode* parameters = new XMLNode ("parameters");
-
-               for (int32_t n = 0; n < _plugin->numParams; ++n) {
-                       char index[64];
-                       char val[32];
-                       snprintf (index, sizeof (index), "param_%d", n);
-                       snprintf (val, sizeof (val), "%.12g", _plugin->getParameter (_plugin, n));
-                       parameters->add_property (index, val);
-               }
-
-               root->add_child_nocopy (*parameters);
-       }
-}
-
-int
-VSTPlugin::set_state (const XMLNode& node, int version)
-{
-       LocaleGuard lg (X_("POSIX"));
-
-       if (node.name() != state_node_name()) {
-               error << _("Bad node sent to VSTPlugin::set_state") << endmsg;
-               return 0;
-       }
-
-       const XMLProperty* prop;
-
-       if ((prop = node.property ("current-program")) != 0) {
-               _fst->want_program = atoi (prop->value().c_str());
-       }
-
-       XMLNode* child;
-       int ret = -1;
-
-       if ((child = find_named_node (node, X_("chunk"))) != 0) {
-
-               XMLPropertyList::const_iterator i;
-               XMLNodeList::const_iterator n;
-               int ret = -1;
-
-               for (n = child->children ().begin (); n != child->children ().end (); ++n) {
-                       if ((*n)->is_content ()) {
-                               /* XXX: this may be dubious for the same reasons that we delay
-                                  execution of load_preset.
-                               */
-                               ret = set_chunk ((*n)->content().c_str(), false);
-                       }
-               }
-
-       } else if ((child = find_named_node (node, X_("parameters"))) != 0) {
-
-               XMLPropertyList::const_iterator i;
-
-               for (i = child->properties().begin(); i != child->properties().end(); ++i) {
-                       int32_t param;
-                       float val;
-
-                       sscanf ((*i)->name().c_str(), "param_%d", &param);
-                       sscanf ((*i)->value().c_str(), "%f", &val);
-
-                       _plugin->setParameter (_plugin, param, val);
-               }
-
-               /* program number is not knowable */
-
-               _fst->current_program = -1;
-
-               ret = 0;
-
-       }
-
-       Plugin::set_state (node, version);
-       return ret;
-}
-
-int
-VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) const
-{
-       VstParameterProperties prop;
-
-       desc.min_unbound = false;
-       desc.max_unbound = false;
-       prop.flags = 0;
-
-       if (_plugin->dispatcher (_plugin, effGetParameterProperties, which, 0, &prop, 0)) {
-
-#ifdef VESTIGE_COMPLETE
-
-               /* i have yet to find or hear of a VST plugin that uses this */
-
-               if (prop.flags & kVstParameterUsesIntegerMinMax) {
-                       desc.lower = prop.minInteger;
-                       desc.upper = prop.maxInteger;
-               } else {
-                       desc.lower = 0;
-                       desc.upper = 1.0;
-               }
-
-               if (prop.flags & kVstParameterUsesIntStep) {
-
-                       desc.step = prop.stepInteger;
-                       desc.smallstep = prop.stepInteger;
-                       desc.largestep = prop.stepInteger;
-
-               } else if (prop.flags & kVstParameterUsesFloatStep) {
-
-                       desc.step = prop.stepFloat;
-                       desc.smallstep = prop.smallStepFloat;
-                       desc.largestep = prop.largeStepFloat;
-
-               } else {
-
-                       float range = desc.upper - desc.lower;
-
-                       desc.step = range / 100.0f;
-                       desc.smallstep = desc.step / 2.0f;
-                       desc.largestep = desc.step * 10.0f;
-               }
-
-               desc.toggled = prop.flags & kVstParameterIsSwitch;
-               desc.logarithmic = false;
-               desc.sr_dependent = false;
-               desc.label = prop.label;
-#endif
-
-       } else {
-
-               /* old style */
-
-               char label[64];
-               label[0] = '\0';
-
-               _plugin->dispatcher (_plugin, effGetParamName, which, 0, label, 0);
-
-               desc.label = label;
-               desc.integer_step = false;
-               desc.lower = 0.0f;
-               desc.upper = 1.0f;
-               desc.step = 0.01f;
-               desc.smallstep = 0.005f;
-               desc.largestep = 0.1f;
-               desc.toggled = false;
-               desc.logarithmic = false;
-               desc.sr_dependent = false;
-       }
-
-       return 0;
-}
-
-bool
-VSTPlugin::load_preset (PresetRecord r)
-{
-       bool s;
-
-       if (r.user) {
-               s = load_user_preset (r);
-       } else {
-               s = load_plugin_preset (r);
-       }
-
-       if (s) {
-               Plugin::load_preset (r);
-       }
-
-       return s;
-}
-
-bool
-VSTPlugin::load_plugin_preset (PresetRecord r)
-{
-       /* This is a plugin-provided preset.
-          We can't dispatch directly here; too many plugins expects only one GUI thread.
-       */
-
-       /* Extract the index of this preset from the URI */
-       int id;
-       int index;
-       int const p = sscanf (r.uri.c_str(), "VST:%d:%d", &id, &index);
-       assert (p == 2);
-
-       _fst->want_program = index;
-       return true;
-}
-
-bool
-VSTPlugin::load_user_preset (PresetRecord r)
-{
-       /* This is a user preset; we load it, and this code also knows about the
-          non-direct-dispatch thing.
-       */
-
-       boost::shared_ptr<XMLTree> t (presets_tree ());
-       if (t == 0) {
-               return false;
-       }
-
-       XMLNode* root = t->root ();
-
-       for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
-
-               XMLProperty* uri = (*i)->property (X_("uri"));
-               XMLProperty* label = (*i)->property (X_("label"));
-
-               assert (uri);
-               assert (label);
-
-               if (label->value() != r.label) {
-                       continue;
-               }
-
-               if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
-
-                       /* Load a user preset chunk from our XML file and send it via a circuitous route to the plugin */
-
-                       if (_fst->wanted_chunk) {
-                               g_free (_fst->wanted_chunk);
-                       }
-
-                       for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
-                               if ((*j)->is_content ()) {
-                                       /* we can't dispatch directly here; too many plugins expect only one GUI thread */
-                                       gsize size = 0;
-                                       guchar* raw_data = g_base64_decode ((*j)->content().c_str(), &size);
-                                       _fst->wanted_chunk = raw_data;
-                                       _fst->wanted_chunk_size = size;
-                                       _fst->want_chunk = 1;
-                                       return true;
-                               }
-                       }
-
-                       return false;
-
-               } else {
-
-                       for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
-                               if ((*j)->name() == X_("Parameter")) {
-
-                                               XMLProperty* index = (*j)->property (X_("index"));
-                                               XMLProperty* value = (*j)->property (X_("value"));
-
-                                               assert (index);
-                                               assert (value);
-
-                                               set_parameter (atoi (index->value().c_str()), atof (value->value().c_str ()));
-                               }
-                       }
-
-                       return true;
-               }
-       }
-
-       return false;
-}
-
-string
-VSTPlugin::do_save_preset (string name)
-{
-       boost::shared_ptr<XMLTree> t (presets_tree ());
-       if (t == 0) {
-               return "";
-       }
-
-       XMLNode* p = 0;
-       /* XXX: use of _presets.size() + 1 for the unique ID here is dubious at best */
-       string const uri = string_compose (X_("VST:%1:%2"), unique_id (), _presets.size() + 1);
-
-       if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
-
-               p = new XMLNode (X_("ChunkPreset"));
-               p->add_property (X_("uri"), uri);
-               p->add_property (X_("label"), name);
-               gchar* data = get_chunk (true);
-               p->add_content (string (data));
-               g_free (data);
-
-       } else {
-
-               p = new XMLNode (X_("Preset"));
-               p->add_property (X_("uri"), uri);
-               p->add_property (X_("label"), name);
-
-               for (uint32_t i = 0; i < parameter_count(); ++i) {
-                       if (parameter_is_input (i)) {
-                               XMLNode* c = new XMLNode (X_("Parameter"));
-                               c->add_property (X_("index"), string_compose ("%1", i));
-                               c->add_property (X_("value"), string_compose ("%1", get_parameter (i)));
-                               p->add_child_nocopy (*c);
-                       }
-               }
-
-       }
-
-       t->root()->add_child_nocopy (*p);
-
-       sys::path f = ARDOUR::user_config_directory ();
-       f /= "presets";
-       f /= presets_file ();
-
-       t->write (f.to_string ());
-       return uri;
-}
-
-void
-VSTPlugin::do_remove_preset (string name)
-{
-       boost::shared_ptr<XMLTree> t (presets_tree ());
-       if (t == 0) {
-               return;
-       }
-
-       t->root()->remove_nodes_and_delete (X_("label"), name);
-
-       sys::path f = ARDOUR::user_config_directory ();
-       f /= "presets";
-       f /= presets_file ();
-
-       t->write (f.to_string ());
-}
-
-string
-VSTPlugin::describe_parameter (Evoral::Parameter param)
-{
-       char name[64];
-       _plugin->dispatcher (_plugin, effGetParamName, param.id(), 0, name, 0);
-       return name;
-}
-
-framecnt_t
-VSTPlugin::signal_latency () const
-{
-       if (_user_latency) {
-               return _user_latency;
-       }
-
-#ifdef VESTIGE_HEADER
-        return *((framecnt_t *) (((char *) &_plugin->flags) + 12)); /* initialDelay */
-#else
-       return _plugin->initial_delay;
-#endif
-}
-
-set<Evoral::Parameter>
-VSTPlugin::automatable () const
-{
-       set<Evoral::Parameter> ret;
-
-       for (uint32_t i = 0; i < parameter_count(); ++i){
-               ret.insert (ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
-       }
-
-       return ret;
-}
-
-int
-VSTPlugin::connect_and_run (BufferSet& bufs,
-               ChanMapping in_map, ChanMapping out_map,
-               pframes_t nframes, framecnt_t offset)
-{
-       Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
-
-       float *ins[_plugin->numInputs];
-       float *outs[_plugin->numOutputs];
-       int32_t i;
-
-       const uint32_t nbufs = bufs.count().n_audio();
-
-       int in_index = 0;
-       for (i = 0; i < (int32_t) _plugin->numInputs; ++i) {
-               ins[i] = bufs.get_audio(min((uint32_t) in_index, nbufs - 1)).data() + offset;
-               in_index++;
-       }
-
-       int out_index = 0;
-       for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
-               outs[i] = bufs.get_audio(min((uint32_t) out_index, nbufs - 1)).data() + offset;
-
-               /* unbelievably, several VST plugins still rely on Cubase
-                  behaviour and do not silence the buffer in processReplacing
-                  when they have no output.
-               */
-
-               // memset (outs[i], 0, sizeof (Sample) * nframes);
-               out_index++;
-       }
-
-
-       if (bufs.count().n_midi() > 0) {
-               VstEvents* v = bufs.get_vst_midi (0);
-               _plugin->dispatcher (_plugin, effProcessEvents, 0, 0, v, 0);
-       }
-
-       /* we already know it can support processReplacing */
-       _plugin->processReplacing (_plugin, ins, outs, nframes);
-
-       return 0;
-}
-
-void
-VSTPlugin::deactivate ()
-{
-       _plugin->dispatcher (_plugin, effMainsChanged, 0, 0, NULL, 0.0f);
-}
-
-void
-VSTPlugin::activate ()
-{
-       _plugin->dispatcher (_plugin, effMainsChanged, 0, 1, NULL, 0.0f);
-}
-
-string
-VSTPlugin::unique_id() const
-{
-       char buf[32];
-
-#ifdef VESTIGE_HEADER
-       snprintf (buf, sizeof (buf), "%d", *((int32_t*) &_plugin->unused_id));
-#else
-       snprintf (buf, sizeof (buf), "%d", _plugin->uniqueID);
-#endif
-       return string (buf);
-}
-
-
-const char *
-VSTPlugin::name () const
-{
-       return handle->name;
-}
-
-const char *
-VSTPlugin::maker () const
-{
-       return _info->creator.c_str();
-}
-
-const char *
-VSTPlugin::label () const
-{
-       return handle->name;
-}
-
-uint32_t
-VSTPlugin::parameter_count() const
-{
-       return _plugin->numParams;
-}
-
-bool
-VSTPlugin::has_editor () const
-{
-       return _plugin->flags & effFlagsHasEditor;
-}
-
-void
-VSTPlugin::print_parameter (uint32_t param, char *buf, uint32_t len) const
-{
-       char *first_nonws;
-
-       _plugin->dispatcher (_plugin, 7 /* effGetParamDisplay */, param, 0, buf, 0);
-
-       if (buf[0] == '\0') {
-               return;
-       }
-
-       first_nonws = buf;
-       while (*first_nonws && isspace (*first_nonws)) {
-               first_nonws++;
-       }
-       if (*first_nonws == '\0') {
-               return;
-       }
-
-       memmove (buf, first_nonws, strlen (buf) - (first_nonws - buf) + 1);
-}
-
-PluginPtr
-VSTPluginInfo::load (Session& session)
-{
-       try {
-               PluginPtr plugin;
-
-               if (Config->get_use_vst()) {
-                       FSTHandle* handle;
-
-                       handle = fst_load(path.c_str());
-
-                       if ( (int)handle == -1) {
-                               error << string_compose(_("VST: cannot load module from \"%1\""), path) << endmsg;
-                       } else {
-                               plugin.reset (new VSTPlugin (session.engine(), session, handle));
-                       }
-               } else {
-                       error << _("You asked ardour to not use any VST plugins") << endmsg;
-                       return PluginPtr ((Plugin*) 0);
-               }
-
-               plugin->set_info(PluginInfoPtr(new VSTPluginInfo(*this)));
-               return plugin;
-       }
-
-       catch (failed_constructor &err) {
-               return PluginPtr ((Plugin*) 0);
-       }
-}
-
-void
-VSTPlugin::find_presets ()
-{
-       /* Built-in presets */
-
-       int const vst_version = _plugin->dispatcher (_plugin, effGetVstVersion, 0, 0, NULL, 0);
-       for (int i = 0; i < _plugin->numPrograms; ++i) {
-               PresetRecord r (string_compose (X_("VST:%1:%2"), unique_id (), i), "", false);
-
-               if (vst_version >= 2) {
-                       char buf[256];
-                       if (_plugin->dispatcher (_plugin, 29, i, 0, buf, 0) == 1) {
-                               r.label = buf;
-                       } else {
-                               r.label = string_compose (_("Preset %1"), i);
-                       }
-               } else {
-                       r.label = string_compose (_("Preset %1"), i);
-               }
-
-               _presets.insert (make_pair (r.uri, r));
-       }
-
-       /* User presets from our XML file */
-
-       boost::shared_ptr<XMLTree> t (presets_tree ());
-
-       if (t) {
-               XMLNode* root = t->root ();
-               for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
-
-                       XMLProperty* uri = (*i)->property (X_("uri"));
-                       XMLProperty* label = (*i)->property (X_("label"));
-
-                       assert (uri);
-                       assert (label);
-
-                       PresetRecord r (uri->value(), label->value(), true);
-                       _presets.insert (make_pair (r.uri, r));
-               }
-       }
-
-}
-
-/** @return XMLTree with our user presets; could be a new one if no existing
- *  one was found, or 0 if one was present but badly-formatted.
- */
-XMLTree *
-VSTPlugin::presets_tree () const
-{
-       XMLTree* t = new XMLTree;
-
-       sys::path p = ARDOUR::user_config_directory ();
-       p /= "presets";
-
-       if (!is_directory (p)) {
-               create_directory (p);
-       }
-
-       p /= presets_file ();
-
-       if (!exists (p)) {
-               t->set_root (new XMLNode (X_("VSTPresets")));
-               return t;
-       }
-
-       t->set_filename (p.to_string ());
-       if (!t->read ()) {
-               delete t;
-               return 0;
-       }
-
-       return t;
-}
-
-/** @return Index of the first user preset in our lists */
-int
-VSTPlugin::first_user_preset_index () const
-{
-       return _plugin->numPrograms;
-}
-
-string
-VSTPlugin::presets_file () const
-{
-       return string_compose ("vst-%1", unique_id ());
-}
-
-VSTPluginInfo::VSTPluginInfo()
-{
-       type = ARDOUR::VST;
-}
-
diff --git a/libs/ardour/windows_vst_plugin.cc b/libs/ardour/windows_vst_plugin.cc
new file mode 100644 (file)
index 0000000..a165dce
--- /dev/null
@@ -0,0 +1,809 @@
+/*
+    Copyright (C) 2004 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <algorithm>
+#include <vector>
+#include <string>
+#include <cctype>
+
+#include <cstdlib>
+#include <cstdio> // so libraptor doesn't complain
+#include <cmath>
+#include <dirent.h>
+#include <cstring> // for memmove
+#include <sys/stat.h>
+#include <cerrno>
+
+#include <glibmm/miscutils.h>
+
+#include <lrdf.h>
+#include <fst.h>
+
+#include "pbd/compose.h"
+#include "pbd/error.h"
+#include "pbd/pathscanner.h"
+#include "pbd/xml++.h"
+
+#include <fst.h>
+
+#include "ardour/session.h"
+#include "ardour/audioengine.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/windows_vst_plugin.h"
+#include "ardour/buffer_set.h"
+#include "ardour/audio_buffer.h"
+#include "ardour/midi_buffer.h"
+
+#include "pbd/stl_delete.h"
+
+#include "i18n.h"
+#include <locale.h>
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+using std::min;
+using std::max;
+
+WindowsVSTPlugin::WindowsVSTPlugin (AudioEngine& e, Session& session, FSTHandle* h)
+       : Plugin (e, session)
+{
+       handle = h;
+
+       if ((_fst = fst_instantiate (handle, Session::vst_callback, this)) == 0) {
+               throw failed_constructor();
+       }
+
+       _plugin = _fst->plugin;
+       _plugin->user = this;
+
+       /* set rate and blocksize */
+
+       _plugin->dispatcher (_plugin, effSetSampleRate, 0, 0, NULL,
+                            (float) session.frame_rate());
+       _plugin->dispatcher (_plugin, effSetBlockSize, 0,
+                            session.get_block_size(), NULL, 0.0f);
+
+       /* set program to zero */
+
+       _plugin->dispatcher (_plugin, effSetProgram, 0, 0, NULL, 0.0f);
+
+       // Plugin::setup_controls ();
+}
+
+WindowsVSTPlugin::WindowsVSTPlugin (const WindowsVSTPlugin &other)
+       : Plugin (other)
+{
+       handle = other.handle;
+
+       if ((_fst = fst_instantiate (handle, Session::vst_callback, this)) == 0) {
+               throw failed_constructor();
+       }
+       _plugin = _fst->plugin;
+
+       // Plugin::setup_controls ();
+}
+
+WindowsVSTPlugin::~WindowsVSTPlugin ()
+{
+       deactivate ();
+       fst_close (_fst);
+}
+
+int
+WindowsVSTPlugin::set_block_size (pframes_t nframes)
+{
+       deactivate ();
+       _plugin->dispatcher (_plugin, effSetBlockSize, 0, nframes, NULL, 0.0f);
+       activate ();
+        return 0;
+}
+
+float
+WindowsVSTPlugin::default_value (uint32_t port)
+{
+       return 0;
+}
+
+void
+WindowsVSTPlugin::set_parameter (uint32_t which, float val)
+{
+       _plugin->setParameter (_plugin, which, val);
+
+       if (_fst->want_program == -1 && _fst->want_chunk == 0) {
+               /* Heinous hack: Plugin::set_parameter below updates the `modified' status of the
+                  current preset, but if _fst->want_program is not -1 then there is a preset
+                  setup pending or in progress, which we don't want any `modified' updates
+                  to happen for.  So we only do this if _fst->want_program is -1.
+               */
+               Plugin::set_parameter (which, val);
+       }
+}
+
+float
+WindowsVSTPlugin::get_parameter (uint32_t which) const
+{
+       return _plugin->getParameter (_plugin, which);
+
+}
+
+uint32_t
+WindowsVSTPlugin::nth_parameter (uint32_t n, bool& ok) const
+{
+       ok = true;
+       return n;
+}
+
+/** Get VST chunk as base64-encoded data.
+ *  @param single true for single program, false for all programs.
+ *  @return 0-terminated base64-encoded data; must be passed to g_free () by caller.
+ */
+gchar *
+WindowsVSTPlugin::get_chunk (bool single) const
+{
+       guchar* data;
+       int32_t data_size = _plugin->dispatcher (_plugin, 23 /* effGetChunk */, single ? 1 : 0, 0, &data, 0);
+       if (data_size == 0) {
+               return 0;
+       }
+
+       return g_base64_encode (data, data_size);
+}
+
+/** Set VST chunk from base64-encoded data.
+ *  @param 0-terminated base64-encoded data.
+ *  @param single true for single program, false for all programs.
+ *  @return 0 on success, non-0 on failure
+ */
+int
+WindowsVSTPlugin::set_chunk (gchar const * data, bool single)
+{
+       gsize size = 0;
+       guchar* raw_data = g_base64_decode (data, &size);
+       int const r = _plugin->dispatcher (_plugin, 24 /* effSetChunk */, single ? 1 : 0, size, raw_data, 0);
+       g_free (raw_data);
+       return r;
+}
+
+void
+WindowsVSTPlugin::add_state (XMLNode* root) const
+{
+       LocaleGuard lg (X_("POSIX"));
+
+       if (_fst->current_program != -1) {
+               char buf[32];
+               snprintf (buf, sizeof (buf), "%d", _fst->current_program);
+               root->add_property ("current-program", buf);
+       }
+
+       if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
+
+               gchar* data = get_chunk (false);
+               if (data == 0) {
+                       return;
+               }
+
+               /* store information */
+
+               XMLNode* chunk_node = new XMLNode (X_("chunk"));
+
+               chunk_node->add_content (data);
+               g_free (data);
+
+               root->add_child_nocopy (*chunk_node);
+
+       } else {
+
+               XMLNode* parameters = new XMLNode ("parameters");
+
+               for (int32_t n = 0; n < _plugin->numParams; ++n) {
+                       char index[64];
+                       char val[32];
+                       snprintf (index, sizeof (index), "param_%d", n);
+                       snprintf (val, sizeof (val), "%.12g", _plugin->getParameter (_plugin, n));
+                       parameters->add_property (index, val);
+               }
+
+               root->add_child_nocopy (*parameters);
+       }
+}
+
+int
+WindowsVSTPlugin::set_state (const XMLNode& node, int version)
+{
+       LocaleGuard lg (X_("POSIX"));
+
+       if (node.name() != state_node_name()) {
+               error << _("Bad node sent to WindowsVSTPlugin::set_state") << endmsg;
+               return 0;
+       }
+
+       const XMLProperty* prop;
+
+       if ((prop = node.property ("current-program")) != 0) {
+               _fst->want_program = atoi (prop->value().c_str());
+       }
+
+       XMLNode* child;
+       int ret = -1;
+
+       if ((child = find_named_node (node, X_("chunk"))) != 0) {
+
+               XMLPropertyList::const_iterator i;
+               XMLNodeList::const_iterator n;
+               int ret = -1;
+
+               for (n = child->children ().begin (); n != child->children ().end (); ++n) {
+                       if ((*n)->is_content ()) {
+                               /* XXX: this may be dubious for the same reasons that we delay
+                                  execution of load_preset.
+                               */
+                               ret = set_chunk ((*n)->content().c_str(), false);
+                       }
+               }
+
+       } else if ((child = find_named_node (node, X_("parameters"))) != 0) {
+
+               XMLPropertyList::const_iterator i;
+
+               for (i = child->properties().begin(); i != child->properties().end(); ++i) {
+                       int32_t param;
+                       float val;
+
+                       sscanf ((*i)->name().c_str(), "param_%d", &param);
+                       sscanf ((*i)->value().c_str(), "%f", &val);
+
+                       _plugin->setParameter (_plugin, param, val);
+               }
+
+               /* program number is not knowable */
+
+               _fst->current_program = -1;
+
+               ret = 0;
+
+       }
+
+       Plugin::set_state (node, version);
+       return ret;
+}
+
+int
+WindowsVSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) const
+{
+       VstParameterProperties prop;
+
+       desc.min_unbound = false;
+       desc.max_unbound = false;
+       prop.flags = 0;
+
+       if (_plugin->dispatcher (_plugin, effGetParameterProperties, which, 0, &prop, 0)) {
+
+#ifdef VESTIGE_COMPLETE
+
+               /* i have yet to find or hear of a VST plugin that uses this */
+
+               if (prop.flags & kVstParameterUsesIntegerMinMax) {
+                       desc.lower = prop.minInteger;
+                       desc.upper = prop.maxInteger;
+               } else {
+                       desc.lower = 0;
+                       desc.upper = 1.0;
+               }
+
+               if (prop.flags & kVstParameterUsesIntStep) {
+
+                       desc.step = prop.stepInteger;
+                       desc.smallstep = prop.stepInteger;
+                       desc.largestep = prop.stepInteger;
+
+               } else if (prop.flags & kVstParameterUsesFloatStep) {
+
+                       desc.step = prop.stepFloat;
+                       desc.smallstep = prop.smallStepFloat;
+                       desc.largestep = prop.largeStepFloat;
+
+               } else {
+
+                       float range = desc.upper - desc.lower;
+
+                       desc.step = range / 100.0f;
+                       desc.smallstep = desc.step / 2.0f;
+                       desc.largestep = desc.step * 10.0f;
+               }
+
+               desc.toggled = prop.flags & kVstParameterIsSwitch;
+               desc.logarithmic = false;
+               desc.sr_dependent = false;
+               desc.label = prop.label;
+#endif
+
+       } else {
+
+               /* old style */
+
+               char label[64];
+               label[0] = '\0';
+
+               _plugin->dispatcher (_plugin, effGetParamName, which, 0, label, 0);
+
+               desc.label = label;
+               desc.integer_step = false;
+               desc.lower = 0.0f;
+               desc.upper = 1.0f;
+               desc.step = 0.01f;
+               desc.smallstep = 0.005f;
+               desc.largestep = 0.1f;
+               desc.toggled = false;
+               desc.logarithmic = false;
+               desc.sr_dependent = false;
+       }
+
+       return 0;
+}
+
+bool
+WindowsVSTPlugin::load_preset (PresetRecord r)
+{
+       bool s;
+
+       if (r.user) {
+               s = load_user_preset (r);
+       } else {
+               s = load_plugin_preset (r);
+       }
+
+       if (s) {
+               Plugin::load_preset (r);
+       }
+
+       return s;
+}
+
+bool
+WindowsVSTPlugin::load_plugin_preset (PresetRecord r)
+{
+       /* This is a plugin-provided preset.
+          We can't dispatch directly here; too many plugins expects only one GUI thread.
+       */
+
+       /* Extract the index of this preset from the URI */
+       int id;
+       int index;
+       int const p = sscanf (r.uri.c_str(), "VST:%d:%d", &id, &index);
+       assert (p == 2);
+
+       _fst->want_program = index;
+       return true;
+}
+
+bool
+WindowsVSTPlugin::load_user_preset (PresetRecord r)
+{
+       /* This is a user preset; we load it, and this code also knows about the
+          non-direct-dispatch thing.
+       */
+
+       boost::shared_ptr<XMLTree> t (presets_tree ());
+       if (t == 0) {
+               return false;
+       }
+
+       XMLNode* root = t->root ();
+
+       for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
+
+               XMLProperty* uri = (*i)->property (X_("uri"));
+               XMLProperty* label = (*i)->property (X_("label"));
+
+               assert (uri);
+               assert (label);
+
+               if (label->value() != r.label) {
+                       continue;
+               }
+
+               if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
+
+                       /* Load a user preset chunk from our XML file and send it via a circuitous route to the plugin */
+
+                       if (_fst->wanted_chunk) {
+                               g_free (_fst->wanted_chunk);
+                       }
+
+                       for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
+                               if ((*j)->is_content ()) {
+                                       /* we can't dispatch directly here; too many plugins expect only one GUI thread */
+                                       gsize size = 0;
+                                       guchar* raw_data = g_base64_decode ((*j)->content().c_str(), &size);
+                                       _fst->wanted_chunk = raw_data;
+                                       _fst->wanted_chunk_size = size;
+                                       _fst->want_chunk = 1;
+                                       return true;
+                               }
+                       }
+
+                       return false;
+
+               } else {
+
+                       for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
+                               if ((*j)->name() == X_("Parameter")) {
+
+                                               XMLProperty* index = (*j)->property (X_("index"));
+                                               XMLProperty* value = (*j)->property (X_("value"));
+
+                                               assert (index);
+                                               assert (value);
+
+                                               set_parameter (atoi (index->value().c_str()), atof (value->value().c_str ()));
+                               }
+                       }
+
+                       return true;
+               }
+       }
+
+       return false;
+}
+
+string
+WindowsVSTPlugin::do_save_preset (string name)
+{
+       boost::shared_ptr<XMLTree> t (presets_tree ());
+       if (t == 0) {
+               return "";
+       }
+
+       XMLNode* p = 0;
+       /* XXX: use of _presets.size() + 1 for the unique ID here is dubious at best */
+       string const uri = string_compose (X_("VST:%1:%2"), unique_id (), _presets.size() + 1);
+
+       if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
+
+               p = new XMLNode (X_("ChunkPreset"));
+               p->add_property (X_("uri"), uri);
+               p->add_property (X_("label"), name);
+               gchar* data = get_chunk (true);
+               p->add_content (string (data));
+               g_free (data);
+
+       } else {
+
+               p = new XMLNode (X_("Preset"));
+               p->add_property (X_("uri"), uri);
+               p->add_property (X_("label"), name);
+
+               for (uint32_t i = 0; i < parameter_count(); ++i) {
+                       if (parameter_is_input (i)) {
+                               XMLNode* c = new XMLNode (X_("Parameter"));
+                               c->add_property (X_("index"), string_compose ("%1", i));
+                               c->add_property (X_("value"), string_compose ("%1", get_parameter (i)));
+                               p->add_child_nocopy (*c);
+                       }
+               }
+
+       }
+
+       t->root()->add_child_nocopy (*p);
+
+       sys::path f = ARDOUR::user_config_directory ();
+       f /= "presets";
+       f /= presets_file ();
+
+       t->write (f.to_string ());
+       return uri;
+}
+
+void
+WindowsVSTPlugin::do_remove_preset (string name)
+{
+       boost::shared_ptr<XMLTree> t (presets_tree ());
+       if (t == 0) {
+               return;
+       }
+
+       t->root()->remove_nodes_and_delete (X_("label"), name);
+
+       sys::path f = ARDOUR::user_config_directory ();
+       f /= "presets";
+       f /= presets_file ();
+
+       t->write (f.to_string ());
+}
+
+string
+WindowsVSTPlugin::describe_parameter (Evoral::Parameter param)
+{
+       char name[64];
+       _plugin->dispatcher (_plugin, effGetParamName, param.id(), 0, name, 0);
+       return name;
+}
+
+framecnt_t
+WindowsVSTPlugin::signal_latency () const
+{
+       if (_user_latency) {
+               return _user_latency;
+       }
+
+#ifdef VESTIGE_HEADER
+        return *((framecnt_t *) (((char *) &_plugin->flags) + 12)); /* initialDelay */
+#else
+       return _plugin->initial_delay;
+#endif
+}
+
+set<Evoral::Parameter>
+WindowsVSTPlugin::automatable () const
+{
+       set<Evoral::Parameter> ret;
+
+       for (uint32_t i = 0; i < parameter_count(); ++i){
+               ret.insert (ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
+       }
+
+       return ret;
+}
+
+int
+WindowsVSTPlugin::connect_and_run (BufferSet& bufs,
+               ChanMapping in_map, ChanMapping out_map,
+               pframes_t nframes, framecnt_t offset)
+{
+       Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
+
+       float *ins[_plugin->numInputs];
+       float *outs[_plugin->numOutputs];
+       int32_t i;
+
+       const uint32_t nbufs = bufs.count().n_audio();
+
+       int in_index = 0;
+       for (i = 0; i < (int32_t) _plugin->numInputs; ++i) {
+               ins[i] = bufs.get_audio(min((uint32_t) in_index, nbufs - 1)).data() + offset;
+               in_index++;
+       }
+
+       int out_index = 0;
+       for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
+               outs[i] = bufs.get_audio(min((uint32_t) out_index, nbufs - 1)).data() + offset;
+
+               /* unbelievably, several VST plugins still rely on Cubase
+                  behaviour and do not silence the buffer in processReplacing
+                  when they have no output.
+               */
+
+               // memset (outs[i], 0, sizeof (Sample) * nframes);
+               out_index++;
+       }
+
+
+       if (bufs.count().n_midi() > 0) {
+               VstEvents* v = bufs.get_vst_midi (0);
+               _plugin->dispatcher (_plugin, effProcessEvents, 0, 0, v, 0);
+       }
+
+       /* we already know it can support processReplacing */
+       _plugin->processReplacing (_plugin, ins, outs, nframes);
+
+       return 0;
+}
+
+void
+WindowsVSTPlugin::deactivate ()
+{
+       _plugin->dispatcher (_plugin, effMainsChanged, 0, 0, NULL, 0.0f);
+}
+
+void
+WindowsVSTPlugin::activate ()
+{
+       _plugin->dispatcher (_plugin, effMainsChanged, 0, 1, NULL, 0.0f);
+}
+
+string
+WindowsVSTPlugin::unique_id() const
+{
+       char buf[32];
+
+#ifdef VESTIGE_HEADER
+       snprintf (buf, sizeof (buf), "%d", *((int32_t*) &_plugin->unused_id));
+#else
+       snprintf (buf, sizeof (buf), "%d", _plugin->uniqueID);
+#endif
+       return string (buf);
+}
+
+
+const char *
+WindowsVSTPlugin::name () const
+{
+       return handle->name;
+}
+
+const char *
+WindowsVSTPlugin::maker () const
+{
+       return _info->creator.c_str();
+}
+
+const char *
+WindowsVSTPlugin::label () const
+{
+       return handle->name;
+}
+
+uint32_t
+WindowsVSTPlugin::parameter_count() const
+{
+       return _plugin->numParams;
+}
+
+bool
+WindowsVSTPlugin::has_editor () const
+{
+       return _plugin->flags & effFlagsHasEditor;
+}
+
+void
+WindowsVSTPlugin::print_parameter (uint32_t param, char *buf, uint32_t len) const
+{
+       char *first_nonws;
+
+       _plugin->dispatcher (_plugin, 7 /* effGetParamDisplay */, param, 0, buf, 0);
+
+       if (buf[0] == '\0') {
+               return;
+       }
+
+       first_nonws = buf;
+       while (*first_nonws && isspace (*first_nonws)) {
+               first_nonws++;
+       }
+       if (*first_nonws == '\0') {
+               return;
+       }
+
+       memmove (buf, first_nonws, strlen (buf) - (first_nonws - buf) + 1);
+}
+
+PluginPtr
+WindowsVSTPluginInfo::load (Session& session)
+{
+       try {
+               PluginPtr plugin;
+
+               if (Config->get_use_windows_vst ()) {
+                       FSTHandle* handle;
+
+                       handle = fst_load(path.c_str());
+
+                       if ( (int)handle == -1) {
+                               error << string_compose(_("VST: cannot load module from \"%1\""), path) << endmsg;
+                       } else {
+                               plugin.reset (new WindowsVSTPlugin (session.engine(), session, handle));
+                       }
+               } else {
+                       error << _("You asked ardour to not use any VST plugins") << endmsg;
+                       return PluginPtr ((Plugin*) 0);
+               }
+
+               plugin->set_info(PluginInfoPtr(new WindowsVSTPluginInfo(*this)));
+               return plugin;
+       }
+
+       catch (failed_constructor &err) {
+               return PluginPtr ((Plugin*) 0);
+       }
+}
+
+void
+WindowsVSTPlugin::find_presets ()
+{
+       /* Built-in presets */
+
+       int const vst_version = _plugin->dispatcher (_plugin, effGetVstVersion, 0, 0, NULL, 0);
+       for (int i = 0; i < _plugin->numPrograms; ++i) {
+               PresetRecord r (string_compose (X_("VST:%1:%2"), unique_id (), i), "", false);
+
+               if (vst_version >= 2) {
+                       char buf[256];
+                       if (_plugin->dispatcher (_plugin, 29, i, 0, buf, 0) == 1) {
+                               r.label = buf;
+                       } else {
+                               r.label = string_compose (_("Preset %1"), i);
+                       }
+               } else {
+                       r.label = string_compose (_("Preset %1"), i);
+               }
+
+               _presets.insert (make_pair (r.uri, r));
+       }
+
+       /* User presets from our XML file */
+
+       boost::shared_ptr<XMLTree> t (presets_tree ());
+
+       if (t) {
+               XMLNode* root = t->root ();
+               for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
+
+                       XMLProperty* uri = (*i)->property (X_("uri"));
+                       XMLProperty* label = (*i)->property (X_("label"));
+
+                       assert (uri);
+                       assert (label);
+
+                       PresetRecord r (uri->value(), label->value(), true);
+                       _presets.insert (make_pair (r.uri, r));
+               }
+       }
+
+}
+
+/** @return XMLTree with our user presets; could be a new one if no existing
+ *  one was found, or 0 if one was present but badly-formatted.
+ */
+XMLTree *
+WindowsVSTPlugin::presets_tree () const
+{
+       XMLTree* t = new XMLTree;
+
+       sys::path p = ARDOUR::user_config_directory ();
+       p /= "presets";
+
+       if (!is_directory (p)) {
+               create_directory (p);
+       }
+
+       p /= presets_file ();
+
+       if (!exists (p)) {
+               t->set_root (new XMLNode (X_("WindowsVSTPresets")));
+               return t;
+       }
+
+       t->set_filename (p.to_string ());
+       if (!t->read ()) {
+               delete t;
+               return 0;
+       }
+
+       return t;
+}
+
+/** @return Index of the first user preset in our lists */
+int
+WindowsVSTPlugin::first_user_preset_index () const
+{
+       return _plugin->numPrograms;
+}
+
+string
+WindowsVSTPlugin::presets_file () const
+{
+       return string_compose ("vst-%1", unique_id ());
+}
+
+WindowsVSTPluginInfo::WindowsVSTPluginInfo()
+{
+       type = ARDOUR::Windows_VST;
+}
+
index 527b0be985dd05841fa05c825c30a65ef54d4914..f6d7a13d06d269eb6db3935ec908affef2b46d39 100644 (file)
@@ -383,10 +383,10 @@ def build(bld):
         if bld.is_defined('HAVE_SUIL'):
             obj.uselib += ['SUIL']
 
-    if bld.is_defined('VST_SUPPORT'):
-        obj.source += [ 'vst_plugin.cc', 'session_vst.cc' ]
+    if bld.is_defined('WINDOWS_VST_SUPPORT'):
+        obj.source += [ 'windows_vst_plugin.cc', 'session_vst.cc' ]
         obj.includes += [ '../fst' ]
-        obj.defines += [ 'VST_SUPPORT' ]
+        obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
 
     if bld.is_defined('LXVST_SUPPORT'):
         obj.source += [ 'lxvst_plugin.cc', 'session_lxvst.cc', 'vstfx.cc', 'vstfxinfofile.cc' ]
index 7074143f76d6b9ef7dc0ed4a9c2f81651c8bb124..f3db3170b7897d709b3858bd20fd62c8876a8684 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/sh      
 
-. `dirname "$0"`/../build/default/gtk2_ardour/ardev_common_waf.sh
+. `dirname "$0"`/../build/gtk2_ardour/ardev_common_waf.sh
 export LD_LIBRARY_PATH=$libs/../gtk2_ardour:$LD_LIBRARY_PATH
-exec $libs/../gtk2_ardour/ardour-3.0-vst "$@"
+exec wine $libs/../gtk2_ardour/ardour-3.0-vst.exe.so "$@"
diff --git a/wscript b/wscript
index eec20bd29c36c888e41bdef0eb4e1b8f62cd8d2a..a27c0e72be1c029c31f4fbc6d7624a5a4e1ea5ea 100644 (file)
--- a/wscript
+++ b/wscript
@@ -244,9 +244,9 @@ def set_compiler_flags (conf,opt):
     # no VST on x86_64
     #
 
-    if conf.env['build_target'] == 'x86_64' and opt.vst:
+    if conf.env['build_target'] == 'x86_64' and opt.windows_vst:
         print("\n\n==================================================")
-        print("You cannot use VST plugins with a 64 bit host. Please run waf with --vst=0")
+        print("You cannot use VST plugins with a 64 bit host. Please run waf with --windows-vst=0")
         print("\nIt is theoretically possible to build a 32 bit host on a 64 bit system.")
         print("However, this is tricky and not recommended for beginners.")
         sys.exit (-1)
@@ -389,8 +389,8 @@ def options(opt):
                     help='Compile as universal binary (requires that external libraries are universal)')
     opt.add_option('--versioned', action='store_true', default=False, dest='versioned',
                     help='Add revision information to executable name inside the build directory')
-    opt.add_option('--vst', action='store_true', default=False, dest='vst',
-                    help='Compile with support for VST')
+    opt.add_option('--windows-vst', action='store_true', default=False, dest='windows_vst',
+                    help='Compile with support for Windows VST')
     opt.add_option('--wiimote', action='store_true', default=False, dest='wiimote',
                     help='Build the wiimote control surface')
     opt.add_option('--windows-key', type='string', action='store', dest='windows_key', default='Mod4><Super',
@@ -550,9 +550,9 @@ def configure(conf):
         conf.env['BUILD_TESTS'] = opts.build_tests
     if opts.tranzport:
         conf.env['TRANZPORT'] = 1
-    if opts.vst:
-        conf.define('VST_SUPPORT', 1)
-        conf.env['VST_SUPPORT'] = True
+    if opts.windows_vst:
+        conf.define('WINDOWS_VST_SUPPORT', 1)
+        conf.env['WINDOWS_VST_SUPPORT'] = True
         conf.env.append_value('CFLAGS', '-I' + Options.options.wine_include)
         conf.env.append_value('CXXFLAGS', '-I' + Options.options.wine_include)
         autowaf.check_header(conf, 'cxx', 'windows.h', mandatory = True)
@@ -614,7 +614,7 @@ const char* const ardour_config_info = "\\n\\
     write_config_text('Tranzport',             opts.tranzport)
     write_config_text('Unit tests',            conf.env['BUILD_TESTS'])
     write_config_text('Universal binary',      opts.universal)
-    write_config_text('VST support',           opts.vst)
+    write_config_text('Windows VST support',   opts.windows_vst)
     write_config_text('Wiimote support',       opts.wiimote)
     write_config_text('Windows key',           opts.windows_key)