X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_manager.cc;h=204867a43dab5527884017197f312f62542503fe;hb=8f46b0dc4bbc54d0b6072376712654f69b36c4fa;hp=5597fac9e8802beba71e86644b161ee63a128cbd;hpb=6f5ee7c4293c43486d48bac00fdcdba90dabb17d;p=ardour.git diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 5597fac9e8..204867a43d 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -21,7 +21,6 @@ #include "libardour-config.h" #endif -#define __STDC_FORMAT_MACROS 1 #include #include @@ -37,6 +36,12 @@ #include #endif // VST_SUPPORT +#ifdef LXVST_SUPPORT +#include +#include +#include +#endif //LXVST_SUPPORT + #include #include "pbd/pathscanner.h" @@ -49,8 +54,7 @@ #include "ardour/ladspa_plugin.h" #include "ardour/filesystem_paths.h" -#ifdef HAVE_SLV2 -#include +#ifdef LV2_SUPPORT #include "ardour/lv2_plugin.h" #endif @@ -58,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 @@ -76,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) @@ -109,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; } @@ -119,6 +134,12 @@ PluginManager::PluginManager () vst_path = s; } + if ((s = getenv ("LXVST_PATH"))) { + lxvst_path = s; + } else if ((s = getenv ("LXVST_PLUGINS"))) { + lxvst_path = s; + } + if (_manager == 0) { _manager = this; } @@ -135,19 +156,12 @@ PluginManager::PluginManager () ladspa_plugin_whitelist.push_back (2150); // tap pitch shifter } -#ifdef HAVE_SLV2 - _lv2_world = new LV2World(); -#endif - BootMessage (_("Discovering Plugins")); } PluginManager::~PluginManager() { -#ifdef HAVE_SLV2 - delete _lv2_world; -#endif } @@ -155,7 +169,7 @@ void PluginManager::refresh () { ladspa_refresh (); -#ifdef HAVE_SLV2 +#ifdef LV2_SUPPORT lv2_refresh (); #endif #ifdef VST_SUPPORT @@ -163,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 @@ -190,7 +211,7 @@ PluginManager::ladspa_refresh () /* allow LADSPA_PATH to augment, not override standard locations */ /* Only add standard locations to ladspa_path if it doesn't - * already contain them. Check for trailing '/'s too. + * already contain them. Check for trailing G_DIR_SEPARATOR too. */ int i; @@ -201,7 +222,7 @@ PluginManager::ladspa_refresh () case ':' : case '\0': continue; - case '/' : + case G_DIR_SEPARATOR : if (ladspa_path[found + strlen(standard_paths[i]) + 1] == ':' || ladspa_path[found + strlen(standard_paths[i]) + 1] == '\0') { continue; @@ -277,6 +298,13 @@ PluginManager::add_vst_presets() { add_presets ("vst"); } + +void +PluginManager::add_lxvst_presets() +{ + add_presets ("lxvst"); +} + void PluginManager::add_presets(string domain) { @@ -443,15 +471,41 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) string label = matches2->object; lrdf_free_statements(matches2); - return label; + /* Kludge LADSPA class names to be singular and match LV2 class names. + This avoids duplicate plugin menus for every class, which is necessary + to make the plugin category menu at all usable, but is obviously a + filthy kludge. + + In the short term, lrdf could be updated so the labels match and a new + release made. To support both specs, we should probably be mapping the + URIs to the same category in code and perhaps tweaking that hierarchy + dynamically to suit the user. Personally, I (drobilla) think that time + is better spent replacing the little-used LRDF. + + In the longer term, we will abandon LRDF entirely in favour of LV2 and + use that class hierarchy. Aside from fixing this problem properly, that + will also allow for translated labels. SWH plugins have been LV2 for + ages; TAP needs porting. I don't know of anything else with LRDF data. + */ + if (label == "Utilities") { + return "Utility"; + } else if (label == "Pitch shifters") { + return "Pitch Shifter"; + } else if (label != "Dynamics" && label != "Chorus" + &&label[label.length() - 1] == 's' + && label[label.length() - 2] != 's') { + return label.substr(0, label.length() - 1); + } else { + return label; + } } -#ifdef HAVE_SLV2 +#ifdef LV2_SUPPORT void PluginManager::lv2_refresh () { delete _lv2_plugin_info; - _lv2_plugin_info = LV2PluginInfo::discover(_lv2_world); + _lv2_plugin_info = LV2PluginInfo::discover(); } #endif @@ -569,6 +623,112 @@ 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/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/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 *plugin_objects; + vector::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 (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) { @@ -608,6 +768,9 @@ PluginManager::save_statuses () case VST: ofs << "VST"; break; + case LXVST: + ofs << "LXVST"; + break; } ofs << ' '; @@ -623,7 +786,7 @@ PluginManager::save_statuses () ofs << "Hidden"; break; } - + ofs << ' '; ofs << (*i).unique_id;; ofs << endl; @@ -642,7 +805,7 @@ PluginManager::load_statuses () if (!ifs) { return; } - + std::string stype; std::string sstatus; std::string id; @@ -692,17 +855,19 @@ 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; continue; } - + id = buf; strip_whitespace_edges (id); set_status (type, id, status); } - + ifs.close (); } @@ -716,8 +881,7 @@ PluginManager::set_status (PluginType t, string id, PluginStatusType status) return; } - pair res = statuses.insert (ps); - //cerr << "Added " << t << " " << id << " " << status << " success ? " << res.second << endl; + statuses.insert (ps); } ARDOUR::PluginInfoList& @@ -732,6 +896,18 @@ PluginManager::vst_plugin_info () #endif } +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 () { @@ -743,7 +919,7 @@ PluginManager::ladspa_plugin_info () ARDOUR::PluginInfoList& PluginManager::lv2_plugin_info () { -#ifdef HAVE_SLV2 +#ifdef LV2_SUPPORT if (!_lv2_plugin_info) lv2_refresh(); return *_lv2_plugin_info;