X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_manager.cc;h=8315397fe85bbaa30f0243175b8c21b9e0d404a2;hb=155338d168b362dd135597695aaa1e419831a277;hp=c0c854180f85dc3ecf6b4aa904794bb1847775df;hpb=0569107ddc0d2a8df6ca0a2c8cc16ebe8f3dee99;p=ardour.git diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index c0c854180f..8315397fe8 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2006 Paul Davis + 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 @@ -17,6 +17,10 @@ */ +#ifdef WAF_BUILD +#include "libardour-config.h" +#endif + #define __STDC_FORMAT_MACROS 1 #include @@ -70,14 +74,18 @@ using namespace std; PluginManager* PluginManager::_manager = 0; PluginManager::PluginManager () + : _vst_plugin_info(0) + , _ladspa_plugin_info(0) + , _lv2_plugin_info(0) + , _au_plugin_info(0) { char* s; string lrdf_path; load_favorites (); -#ifdef GTKOSX - ProcessSerialNumber psn = { 0, kCurrentProcess }; +#ifdef HAVE_AUDIOUNITS + ProcessSerialNumber psn = { 0, kCurrentProcess }; OSStatus returnCode = TransformProcessType(& psn, kProcessTransformToForegroundApplication); if( returnCode != 0) { error << _("Cannot become GUI app") << endmsg; @@ -124,15 +132,13 @@ PluginManager::PluginManager () ladspa_plugin_whitelist.push_back (1061); // feedback delay line (max 5s) ladspa_plugin_whitelist.push_back (1216); // gverb ladspa_plugin_whitelist.push_back (2150); // tap pitch shifter - } + } #ifdef HAVE_SLV2 _lv2_world = new LV2World(); #endif BootMessage (_("Discovering Plugins")); - - refresh (); } void @@ -155,45 +161,48 @@ PluginManager::refresh () void PluginManager::ladspa_refresh () { - _ladspa_plugin_info.clear (); - - static const char *standard_paths[] = { - "/usr/local/lib64/ladspa", - "/usr/local/lib/ladspa", - "/usr/lib64/ladspa", - "/usr/lib/ladspa", - "/Library/Audio/Plug-Ins/LADSPA", - "" - }; - - /* 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. - */ - - int i; - for (i = 0; standard_paths[i][0]; i++) { - size_t found = ladspa_path.find(standard_paths[i]); - if (found != ladspa_path.npos) { - switch (ladspa_path[found + strlen(standard_paths[i])]) { - case ':' : - case '\0': - continue; - case '/' : - if (ladspa_path[found + strlen(standard_paths[i]) + 1] == ':' || - ladspa_path[found + strlen(standard_paths[i]) + 1] == '\0') { - continue; - } - } - } - if (!ladspa_path.empty()) - ladspa_path += ":"; - - ladspa_path += standard_paths[i]; - - } - + if (_ladspa_plugin_info) + _ladspa_plugin_info->clear (); + else + _ladspa_plugin_info = new ARDOUR::PluginInfoList (); + + static const char *standard_paths[] = { + "/usr/local/lib64/ladspa", + "/usr/local/lib/ladspa", + "/usr/lib64/ladspa", + "/usr/lib/ladspa", + "/Library/Audio/Plug-Ins/LADSPA", + "" + }; + + /* 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. + */ + + int i; + for (i = 0; standard_paths[i][0]; i++) { + size_t found = ladspa_path.find(standard_paths[i]); + if (found != ladspa_path.npos) { + switch (ladspa_path[found + strlen(standard_paths[i])]) { + case ':' : + case '\0': + continue; + case '/' : + if (ladspa_path[found + strlen(standard_paths[i]) + 1] == ':' || + ladspa_path[found + strlen(standard_paths[i]) + 1] == '\0') { + continue; + } + } + } + if (!ladspa_path.empty()) + ladspa_path += ":"; + + ladspa_path += standard_paths[i]; + + } + ladspa_discover_from_path (ladspa_path); } @@ -205,19 +214,19 @@ PluginManager::add_ladspa_directory (string path) ladspa_path += ':'; ladspa_path += path; return 0; - } + } return -1; } -static bool ladspa_filter (const string& str, void *arg) +static bool ladspa_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::ladspa_discover_from_path (string path) +PluginManager::ladspa_discover_from_path (string /*path*/) { PathScanner scanner; vector *plugin_objects; @@ -236,12 +245,13 @@ PluginManager::ladspa_discover_from_path (string path) return ret; } -static bool rdf_filter (const string &str, void *arg) +static bool rdf_filter (const string &str, void* /*arg*/) { - return str[0] != '.' && + return str[0] != '.' && ((str.find(".rdf") == (str.length() - 4)) || (str.find(".rdfs") == (str.length() - 5)) || - (str.find(".n3") == (str.length() - 3))); + (str.find(".n3") == (str.length() - 3)) || + (str.find(".ttl") == (str.length() - 4))); } void @@ -306,7 +316,7 @@ PluginManager::add_lrdf_data (const string &path) vector_delete (rdf_files); } -int +int PluginManager::ladspa_discover (string path) { void *module; @@ -337,7 +347,7 @@ PluginManager::ladspa_discover (string path) if (find (ladspa_plugin_whitelist.begin(), ladspa_plugin_whitelist.end(), descriptor->UniqueID) == ladspa_plugin_whitelist.end()) { continue; } - } + } PluginInfoPtr info(new LadspaPluginInfo); info->name = descriptor->Name; @@ -348,11 +358,11 @@ PluginManager::ladspa_discover (string path) info->n_inputs = ChanCount(); info->n_outputs = ChanCount(); info->type = ARDOUR::LADSPA; - + char buf[32]; snprintf (buf, sizeof (buf), "%lu", descriptor->UniqueID); info->unique_id = buf; - + for (uint32_t n=0; n < descriptor->PortCount; ++n) { if ( LADSPA_IS_PORT_AUDIO (descriptor->PortDescriptors[n]) ) { if ( LADSPA_IS_PORT_INPUT (descriptor->PortDescriptors[n]) ) { @@ -364,22 +374,22 @@ PluginManager::ladspa_discover (string path) } } - if(_ladspa_plugin_info.empty()){ - _ladspa_plugin_info.push_back (info); + if(_ladspa_plugin_info->empty()){ + _ladspa_plugin_info->push_back (info); } //Ensure that the plugin is not already in the plugin list. bool found = false; - for (PluginInfoList::const_iterator i = _ladspa_plugin_info.begin(); i != _ladspa_plugin_info.end(); ++i) { + for (PluginInfoList::const_iterator i = _ladspa_plugin_info->begin(); i != _ladspa_plugin_info->end(); ++i) { if(0 == info->unique_id.compare((*i)->unique_id)){ found = true; } } if(!found){ - _ladspa_plugin_info.push_back (info); + _ladspa_plugin_info->push_back (info); } } @@ -429,14 +439,8 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) void PluginManager::lv2_refresh () { - lv2_discover(); -} - -int -PluginManager::lv2_discover () -{ + delete _lv2_plugin_info; _lv2_plugin_info = LV2PluginInfo::discover(_lv2_world); - return 0; } #endif @@ -444,14 +448,8 @@ PluginManager::lv2_discover () void PluginManager::au_refresh () { - au_discover(); -} - -int -PluginManager::au_discover () -{ + delete _au_plugin_info; _au_plugin_info = AUPluginInfo::discover(); - return 0; } #endif @@ -461,7 +459,10 @@ PluginManager::au_discover () void PluginManager::vst_refresh () { - _vst_plugin_info.clear (); + if (_vst_plugin_info) + _vst_plugin_info->clear (); + else + _vst_plugin_info = new ARDOUR::PluginInfoList(); if (vst_path.length() == 0) { vst_path = "/usr/local/lib/vst:/usr/lib/vst"; @@ -477,7 +478,7 @@ PluginManager::add_vst_directory (string path) vst_path += ':'; vst_path += path; return 0; - } + } return -1; } @@ -526,7 +527,7 @@ PluginManager::vst_discover (string path) finfo->name) << endl; } - + PluginInfoPtr info(new VSTPluginInfo); /* what a joke freeware VST is */ @@ -537,7 +538,7 @@ PluginManager::vst_discover (string path) info->name = finfo->name; } - + snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); info->unique_id = buf; info->category = "VST"; @@ -547,8 +548,8 @@ PluginManager::vst_discover (string path) info->n_inputs.set_audio (finfo->numInputs); info->n_outputs.set_audio (finfo->numOutputs); info->type = ARDOUR::VST; - - _vst_plugin_info.push_back (info); + + _vst_plugin_info->push_back (info); fst_free_info (finfo); return 0; @@ -591,7 +592,7 @@ PluginManager::save_favorites () ofs << "VST"; break; } - + ofs << ' ' << (*i).unique_id << endl; } @@ -608,7 +609,7 @@ PluginManager::load_favorites () if (!ifs) { return; } - + std::string stype; std::string id; PluginType type; @@ -638,10 +639,10 @@ PluginManager::load_favorites () << endmsg; continue; } - + add_favorite (type, id); } - + ifs.close (); } @@ -659,3 +660,47 @@ PluginManager::remove_favorite (PluginType t, string id) FavoritePlugin fp (t, id); favorites.erase (fp); } + +ARDOUR::PluginInfoList& +PluginManager::vst_plugin_info () +{ +#ifdef VST_SUPPORT + if (!_vst_plugin_info) + vst_refresh(); + return *_vst_plugin_info; +#else + return _empty_plugin_info; +#endif +} + +ARDOUR::PluginInfoList& +PluginManager::ladspa_plugin_info () +{ + if (!_ladspa_plugin_info) + ladspa_refresh(); + return *_ladspa_plugin_info; +} + +ARDOUR::PluginInfoList& +PluginManager::lv2_plugin_info () +{ +#ifdef HAVE_SLV2 + if (!_lv2_plugin_info) + lv2_refresh(); + return *_lv2_plugin_info; +#else + return _empty_plugin_info; +#endif +} + +ARDOUR::PluginInfoList& +PluginManager::au_plugin_info () +{ +#ifdef HAVE_AUDIOUNITS + if (!_au_plugin_info) + au_refresh(); + return *_au_plugin_info; +#else + return _empty_plugin_info; +#endif +}