X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_manager.cc;h=183948f3733060dbdbe01223335c04f2ed59b097;hb=123399c2a8141458b21b0079ac17aa9ede16e763;hp=0408764c96029a8e88dde221eae4f38be77744ea;hpb=2b6aa4f50734506bac76650abdc28792f96c9107;p=ardour.git diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 0408764c96..183948f373 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2004 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 @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -36,8 +35,19 @@ #include #include #include + +#ifdef HAVE_SLV2 +#include +#include +#endif + +#ifdef VST_SUPPORT #include +#endif + +#ifdef HAVE_AUDIOUNITS #include +#endif #include #include @@ -49,8 +59,7 @@ using namespace PBD; PluginManager* PluginManager::_manager = 0; -PluginManager::PluginManager (AudioEngine& e) - : _engine (e) +PluginManager::PluginManager () { char* s; string lrdf_path; @@ -81,22 +90,43 @@ PluginManager::PluginManager (AudioEngine& e) vst_path = s; } - refresh (); - if (_manager == 0) { _manager = this; } + + /* the plugin manager is constructed too early to use Profile */ + + if (getenv ("ARDOUR_SAE")) { + ladspa_plugin_whitelist.push_back (1203); // single band parametric + ladspa_plugin_whitelist.push_back (1772); // caps compressor + ladspa_plugin_whitelist.push_back (1913); // fast lookahead limiter + ladspa_plugin_whitelist.push_back (1075); // simple RMS expander + 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 + } + + _lv2_world = slv2_world_new(); + slv2_world_load_all(_lv2_world); + + refresh (); } void PluginManager::refresh () { ladspa_refresh (); +#ifdef HAVE_SLV2 + lv2_refresh (); +#endif #ifdef VST_SUPPORT if (Config->get_use_vst()) { vst_refresh (); } #endif // VST_SUPPORT +#ifdef HAVE_AUDIOUNITS + au_refresh (); +#endif } void @@ -105,12 +135,13 @@ PluginManager::ladspa_refresh () _ladspa_plugin_info.clear (); if (ladspa_path.length() == 0) { - ladspa_path = "/usr/local/lib/ladspa:/usr/lib/ladspa"; + ladspa_path = "/usr/local/lib64/ladspa:/usr/local/lib/ladspa:/usr/lib64/ladspa:/usr/lib/ladspa:/Library/Audio/Plug-Ins/LADSPA"; } ladspa_discover_from_path (ladspa_path); } + int PluginManager::add_ladspa_directory (string path) { @@ -246,15 +277,25 @@ PluginManager::ladspa_discover (string path) break; } - PluginInfoPtr info(new PluginInfo); + if (!ladspa_plugin_whitelist.empty()) { + 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; info->category = get_ladspa_category(descriptor->UniqueID); + info->creator = descriptor->Maker; info->path = path; info->index = i; info->n_inputs = 0; info->n_outputs = 0; - info->type = PluginInfo::LADSPA; - info->unique_id = descriptor->UniqueID; + 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]) ) { @@ -276,99 +317,6 @@ PluginManager::ladspa_discover (string path) return 0; } -boost::shared_ptr -PluginManager::load (Session& session, PluginInfoPtr info) -{ - try { - boost::shared_ptr plugin; - - if (info->type == PluginInfo::VST) { - -#ifdef VST_SUPPORT - if (Config->get_use_vst()) { - FSTHandle* handle; - - if ((handle = fst_load (info->path.c_str())) == 0) { - error << string_compose(_("VST: cannot load module from \"%1\""), info->path) << endmsg; - } else { - plugin.reset (new VSTPlugin (_engine, session, handle)); - } - } else { - error << _("You asked ardour to not use any VST plugins") << endmsg; - } -#else // !VST_SUPPORT - error << _("This version of ardour has no support for VST plugins") << endmsg; - return boost::shared_ptr ((Plugin*) 0); -#endif // !VST_SUPPORT - - } else if (info->type == PluginInfo::LADSPA) { - void *module; - - if ((module = dlopen (info->path.c_str(), RTLD_NOW)) == 0) { - error << string_compose(_("LADSPA: cannot load module from \"%1\""), info->path) << endmsg; - error << dlerror() << endmsg; - } else { - plugin.reset (new LadspaPlugin (module, _engine, session, info->index, session.frame_rate())); - } - } else if (info->type == PluginInfo::AudioUnit) { - -#ifdef HAVE_COREAUDIO - -#else // !HAVE_COREAUDIO - error << _("This version of ardour has no support for AudioUnit plugins") << endmsg; - return boost::shared_ptr ((Plugin*) 0); -#endif - } - - plugin->set_info(*info); - return plugin; - } - - catch (failed_constructor &err) { - return boost::shared_ptr ((Plugin*) 0); - } -} - -boost::shared_ptr -ARDOUR::find_plugin(Session& session, string name, long unique_id, PluginInfo::Type type) -{ - PluginManager *mgr = PluginManager::the_manager(); - PluginInfoList plugs; - - switch (type) { - case PluginInfo::LADSPA: - plugs = mgr->ladspa_plugin_info(); - break; - -#ifdef VST_SUPPORT - case PluginInfo::VST: - plugs = mgr->vst_plugin_info(); - unique_id = 0; // VST plugins don't have a unique id. - break; -#endif - -#ifdef HAVE_COREAUDIO - case PluginInfo::AudioUnit: - plugs = AUPluginInfo::discover (); - unique_id = 0; // Neither do AU. - break; -#endif - - default: - return boost::shared_ptr ((Plugin *) 0); - } - - PluginInfoList::iterator i; - for (i = plugs.begin(); i != plugs.end(); ++i) { - if ((name == "" || (*i)->name == name) && - (unique_id == 0 || (*i)->unique_id == unique_id)) { - return mgr->load (session, *i); - } - } - - return boost::shared_ptr ((Plugin*) 0); -} - string PluginManager::get_ladspa_category (uint32_t plugin_id) { @@ -377,18 +325,18 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) snprintf(buf, sizeof(buf), "%s%" PRIu32, LADSPA_BASE, plugin_id); pattern.subject = buf; - pattern.predicate = RDF_TYPE; + pattern.predicate = (char*)RDF_TYPE; pattern.object = 0; pattern.object_type = lrdf_uri; lrdf_statement* matches1 = lrdf_matches (&pattern); if (!matches1) { - return _("Unknown"); + return ""; } pattern.subject = matches1->object; - pattern.predicate = LADSPA_BASE "hasLabel"; + pattern.predicate = (char*)(LADSPA_BASE "hasLabel"); pattern.object = 0; pattern.object_type = lrdf_literal; @@ -396,7 +344,7 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) lrdf_free_statements(matches1); if (!matches2) { - return _("Unknown"); + return (""); } string label = matches2->object; @@ -405,6 +353,37 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) return label; } +#ifdef HAVE_SLV2 +void +PluginManager::lv2_refresh () +{ + lv2_discover(); +} + +int +PluginManager::lv2_discover () +{ + _lv2_plugin_info = LV2PluginInfo::discover(_lv2_world); + return 0; +} +#endif + +#ifdef HAVE_AUDIOUNITS +void +PluginManager::au_refresh () +{ + au_discover(); +} + +int +PluginManager::au_discover () +{ + _au_plugin_info = AUPluginInfo::discover(); + return 0; +} + +#endif + #ifdef VST_SUPPORT void @@ -433,7 +412,7 @@ PluginManager::add_vst_directory (string path) static bool vst_filter (const string& str, void *arg) { /* Not a dotfile, has a prefix before a period, suffix is "dll" */ - + return str[0] != '.' && (str.length() > 4 && str.find (".dll") == (str.length() - 4)); } @@ -463,8 +442,10 @@ int PluginManager::vst_discover (string path) { FSTInfo* finfo; + char buf[32]; if ((finfo = fst_get_info (const_cast (path.c_str()))) == 0) { + warning << "Cannot get VST information from " << path << endmsg; return -1; } @@ -474,7 +455,7 @@ PluginManager::vst_discover (string path) << endl; } - PluginInfoPtr info(new PluginInfo); + PluginInfoPtr info(new VSTPluginInfo); /* what a goddam joke freeware VST is */ @@ -484,12 +465,16 @@ PluginManager::vst_discover (string path) info->name = finfo->name; } + + snprintf (buf, sizeof (buf), "%d", finfo->UniqueID); + info->unique_id = buf; info->category = "VST"; info->path = path; + // need to set info->creator but FST doesn't provide it info->index = 0; info->n_inputs = finfo->numInputs; info->n_outputs = finfo->numOutputs; - info->type = PluginInfo::VST; + info->type = ARDOUR::VST; _vst_plugin_info.push_back (info); fst_free_info (finfo);