diff options
Diffstat (limited to 'libs/ardour/plugin_manager.cc')
-rw-r--r-- | libs/ardour/plugin_manager.cc | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 912fc20dcd..6279140795 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -36,6 +36,12 @@ #include <cstring> #endif // VST_SUPPORT +#ifdef LXVST_SUPPORT +#include <ardour/vstfx.h> +#include <pbd/basename.h> +#include <cstring> +#endif //LXVST_SUPPORT + #include <glibmm/miscutils.h> #include "pbd/pathscanner.h" @@ -56,6 +62,10 @@ #include "ardour/vst_plugin.h" #endif +#ifdef LXVST_SUPPORT +#include "ardour/lxvst_plugin.h" +#endif + #ifdef HAVE_AUDIOUNITS #include "ardour/audio_unit.h" #include <Carbon/Carbon.h> @@ -74,6 +84,7 @@ PluginManager* PluginManager::_manager = 0; PluginManager::PluginManager () : _vst_plugin_info(0) + , _lxvst_plugin_info(0) , _ladspa_plugin_info(0) , _lv2_plugin_info(0) , _au_plugin_info(0) @@ -107,6 +118,12 @@ PluginManager::PluginManager () } #endif /* VST_SUPPORT */ +#ifdef LXVST_SUPPORT + if (Config->get_use_lxvst()) { + add_lxvst_presets(); + } +#endif /* Native LinuxVST support*/ + if ((s = getenv ("LADSPA_PATH"))) { ladspa_path = s; } @@ -117,6 +134,12 @@ PluginManager::PluginManager () vst_path = s; } + if ((s = getenv ("LXVST_PATH"))) { + vst_path = s; + } else if ((s = getenv ("LXVST_PLUGINS"))) { + vst_path = s; + } + if (_manager == 0) { _manager = this; } @@ -154,6 +177,13 @@ PluginManager::refresh () vst_refresh (); } #endif // VST_SUPPORT + +#ifdef LXVST_SUPPORT + if(Config->get_use_lxvst()) { + lxvst_refresh(); + } +#endif //Native linuxVST SUPPORT + #ifdef HAVE_AUDIOUNITS au_refresh (); #endif @@ -268,6 +298,13 @@ PluginManager::add_vst_presets() { add_presets ("vst"); } + +void +PluginManager::add_lxvst_presets() +{ + add_presets ("lxvst"); +} + void PluginManager::add_presets(string domain) { @@ -586,6 +623,111 @@ PluginManager::vst_discover (string path) #endif // VST_SUPPORT +#ifdef LXVST_SUPPORT + +void +PluginManager::lxvst_refresh () +{ + if (_lxvst_plugin_info) + _lxvst_plugin_info->clear (); + else + _lxvst_plugin_info = new ARDOUR::PluginInfoList(); + + if (lxvst_path.length() == 0) { + lxvst_path = "/usr/local/lib/lxvst:/usr/lib/lxvst"; + } + + lxvst_discover_from_path (lxvst_path); +} + +int +PluginManager::add_lxvst_directory (string path) +{ + if (lxvst_discover_from_path (path) == 0) { + lxvst_path += ':'; + lxvst_path += path; + return 0; + } + return -1; +} + +static bool lxvst_filter (const string& str, void *arg) +{ + /* Not a dotfile, has a prefix before a period, suffix is "so" */ + + return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3)); +} + +int +PluginManager::lxvst_discover_from_path (string path) +{ + PathScanner scanner; + vector<string *> *plugin_objects; + vector<string *>::iterator x; + int ret = 0; + + info << "Discovering linuxVST plugins along " << path << endmsg; + + plugin_objects = scanner (lxvst_path, lxvst_filter, 0, true, true); + + if (plugin_objects) { + for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { + lxvst_discover (**x); + } + } + + info << "Done linuxVST discover" << endmsg; + + vector_delete (plugin_objects); + return ret; +} + +int +PluginManager::lxvst_discover (string path) +{ + VSTFXInfo* finfo; + char buf[32]; + + if ((finfo = vstfx_get_info (const_cast<char *> (path.c_str()))) == 0) { + warning << "Cannot get linuxVST information from " << path << endmsg; + return -1; + } + + if (!finfo->canProcessReplacing) { + warning << string_compose (_("linuxVST plugin %1 does not support processReplacing, and so cannot be used in ardour at this time"), + finfo->name) + << endl; + } + + PluginInfoPtr info(new LXVSTPluginInfo); + + if (!strcasecmp ("The Unnamed plugin", finfo->name)) { + info->name = PBD::basename_nosuffix (path); + } else { + info->name = finfo->name; + } + + + snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); + info->unique_id = buf; + info->category = "linuxVSTs"; + info->path = path; + info->creator = finfo->creator; + info->index = 0; + 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::LXVST; + + _lxvst_plugin_info->push_back (info); + vstfx_free_info (finfo); + + return 0; +} + +#endif // LXVST_SUPPORT + + PluginManager::PluginStatusType PluginManager::get_status (const PluginInfoPtr& pi) { @@ -625,6 +767,9 @@ PluginManager::save_statuses () case VST: ofs << "VST"; break; + case LXVST: + ofs << "LXVST"; + break; } ofs << ' '; @@ -709,6 +854,8 @@ PluginManager::load_statuses () type = LV2; } else if (stype == "VST") { type = VST; + } else if (stype == "LXVST") { + type = LXVST; } else { error << string_compose (_("unknown plugin type \"%1\" - ignored"), stype) << endmsg; @@ -749,6 +896,18 @@ PluginManager::vst_plugin_info () } ARDOUR::PluginInfoList& +PluginManager::lxvst_plugin_info () +{ +#ifdef LXVST_SUPPORT + if (!_lxvst_plugin_info) + lxvst_refresh(); + return *_lxvst_plugin_info; +#else + return _empty_plugin_info; +#endif +} + +ARDOUR::PluginInfoList& PluginManager::ladspa_plugin_info () { if (!_ladspa_plugin_info) |