X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_manager.cc;h=6a24a33b60b22376b3041ff8224fc7ae0adafdef;hb=d7e39ee5c779ab5e118ecea60bb3f86e94fba069;hp=f7a46117a27e8fa5c717815f0b3a54198b4c5e36;hpb=150ad3ae820941bcb13ec638e79094767193c3a0;p=ardour.git diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index f7a46117a2..6a24a33b60 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -30,15 +30,15 @@ #include #include -#ifdef VST_SUPPORT -#include +#ifdef WINDOWS_VST_SUPPORT +#include "fst.h" #include "pbd/basename.h" #include -#endif // VST_SUPPORT +#endif // WINDOWS_VST_SUPPORT #ifdef LXVST_SUPPORT -#include -#include +#include "ardour/linux_vst_support.h" +#include "pbd/basename.h" #include #endif //LXVST_SUPPORT @@ -47,26 +47,27 @@ #include "pbd/pathscanner.h" #include "pbd/whitespace.h" +#include "ardour/debug.h" +#include "ardour/filesystem_paths.h" #include "ardour/ladspa.h" -#include "ardour/session.h" -#include "ardour/plugin_manager.h" -#include "ardour/plugin.h" #include "ardour/ladspa_plugin.h" -#include "ardour/filesystem_paths.h" +#include "ardour/plugin.h" +#include "ardour/plugin_manager.h" +#include "ardour/rc_configuration.h" #ifdef LV2_SUPPORT #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 #include "ardour/lxvst_plugin.h" #endif -#ifdef HAVE_AUDIOUNITS +#ifdef AUDIOUNIT_SUPPORT #include "ardour/audio_unit.h" #include #endif @@ -80,10 +81,19 @@ using namespace ARDOUR; using namespace PBD; using namespace std; -PluginManager* PluginManager::_manager = 0; +PluginManager* PluginManager::_instance = 0; + +PluginManager& +PluginManager::instance() +{ + if (!_instance) { + _instance = new PluginManager; + } + return *_instance; +} PluginManager::PluginManager () - : _vst_plugin_info(0) + : _windows_vst_plugin_info(0) , _lxvst_plugin_info(0) , _ladspa_plugin_info(0) , _lv2_plugin_info(0) @@ -94,14 +104,6 @@ PluginManager::PluginManager () load_statuses (); -#ifdef HAVE_AUDIOUNITS - ProcessSerialNumber psn = { 0, kCurrentProcess }; - OSStatus returnCode = TransformProcessType(& psn, kProcessTransformToForegroundApplication); - if( returnCode != 0) { - error << _("Cannot become GUI app") << endmsg; - } -#endif - if ((s = getenv ("LADSPA_RDF_PATH"))){ lrdf_path = s; } @@ -112,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()) { @@ -129,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"))) { @@ -140,8 +142,8 @@ PluginManager::PluginManager () lxvst_path = s; } - if (_manager == 0) { - _manager = this; + if (_instance == 0) { + _instance = this; } /* the plugin manager is constructed too early to use Profile */ @@ -168,15 +170,17 @@ PluginManager::~PluginManager() void PluginManager::refresh () { + DEBUG_TRACE (DEBUG::PluginManager, "PluginManager::refresh\n"); + ladspa_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()) { @@ -184,7 +188,7 @@ PluginManager::refresh () } #endif //Native linuxVST SUPPORT -#ifdef HAVE_AUDIOUNITS +#ifdef AUDIOUNIT_SUPPORT au_refresh (); #endif @@ -236,6 +240,8 @@ PluginManager::ladspa_refresh () } + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_path)); + ladspa_discover_from_path (ladspa_path); } @@ -266,7 +272,7 @@ PluginManager::ladspa_discover_from_path (string /*path*/) vector::iterator x; int ret = 0; - plugin_objects = scanner (ladspa_path, ladspa_filter, 0, true, true); + plugin_objects = scanner (ladspa_path, ladspa_filter, 0, false, true); if (plugin_objects) { for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { @@ -294,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 @@ -319,7 +325,7 @@ PluginManager::add_presets(string domain) } string path = string_compose("%1/.%2/rdf", envvar, domain); - presets = scanner (path, rdf_filter, 0, true, true); + presets = scanner (path, rdf_filter, 0, false, true); if (presets) { for (x = presets->begin(); x != presets->end (); ++x) { @@ -340,7 +346,7 @@ PluginManager::add_lrdf_data (const string &path) vector* rdf_files; vector::iterator x; - rdf_files = scanner (path, rdf_filter, 0, true, true); + rdf_files = scanner (path, rdf_filter, 0, false, true); if (rdf_files) { for (x = rdf_files->begin(); x != rdf_files->end (); ++x) { @@ -446,7 +452,7 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) snprintf(buf, sizeof(buf), "%s%" PRIu32, LADSPA_BASE, plugin_id); pattern.subject = buf; - pattern.predicate = (char*)RDF_TYPE; + pattern.predicate = const_cast(RDF_TYPE); pattern.object = 0; pattern.object_type = lrdf_uri; @@ -457,7 +463,7 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) } pattern.subject = matches1->object; - pattern.predicate = (char*)(LADSPA_BASE "hasLabel"); + pattern.predicate = const_cast(LADSPA_BASE "hasLabel"); pattern.object = 0; pattern.object_type = lrdf_literal; @@ -504,50 +510,53 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) void PluginManager::lv2_refresh () { + DEBUG_TRACE (DEBUG::PluginManager, "LV2: refresh\n"); delete _lv2_plugin_info; _lv2_plugin_info = LV2PluginInfo::discover(); } #endif -#ifdef HAVE_AUDIOUNITS +#ifdef AUDIOUNIT_SUPPORT void PluginManager::au_refresh () { + DEBUG_TRACE (DEBUG::PluginManager, "AU: refresh\n"); delete _au_plugin_info; _au_plugin_info = AUPluginInfo::discover(); } #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" */ @@ -555,20 +564,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 *plugin_objects; vector::iterator x; int ret = 0; - info << "detecting VST plugins along " << path << endmsg; + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("detecting Windows VST plugins along %1\n", path)); - plugin_objects = scanner (vst_path, vst_filter, 0, true, 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); } } @@ -577,13 +586,13 @@ PluginManager::vst_discover_from_path (string path) } int -PluginManager::vst_discover (string path) +PluginManager::windows_vst_discover (string path) { - FSTInfo* finfo; + VSTInfo* finfo; char buf[32]; if ((finfo = fst_get_info (const_cast (path.c_str()))) == 0) { - warning << "Cannot get VST information from " << path << endmsg; + warning << "Cannot get Windows VST information from " << path << endmsg; return -1; } @@ -593,7 +602,7 @@ PluginManager::vst_discover (string path) << endl; } - PluginInfoPtr info(new VSTPluginInfo); + PluginInfoPtr info (new WindowsVSTPluginInfo); /* what a joke freeware VST is */ @@ -613,28 +622,29 @@ 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 void PluginManager::lxvst_refresh () { - if (_lxvst_plugin_info) + if (_lxvst_plugin_info) { _lxvst_plugin_info->clear (); - else + } else { _lxvst_plugin_info = new ARDOUR::PluginInfoList(); + } if (lxvst_path.length() == 0) { - lxvst_path = "/usr/local/lib/lxvst:/usr/lib/lxvst"; + lxvst_path = "/usr/local/lib64/lxvst:/usr/local/lib/lxvst:/usr/lib64/lxvst:/usr/lib/lxvst"; } lxvst_discover_from_path (lxvst_path); @@ -651,7 +661,7 @@ PluginManager::add_lxvst_directory (string path) return -1; } -static bool lxvst_filter (const string& str, void *arg) +static bool lxvst_filter (const string& str, void *) { /* Not a dotfile, has a prefix before a period, suffix is "so" */ @@ -666,9 +676,9 @@ PluginManager::lxvst_discover_from_path (string path) vector::iterator x; int ret = 0; - info << "Discovering linuxVST plugins along " << path << endmsg; + DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Discovering linuxVST plugins along %1\n", path)); - plugin_objects = scanner (lxvst_path, lxvst_filter, 0, true, true); + plugin_objects = scanner (lxvst_path, lxvst_filter, 0, false, true); if (plugin_objects) { for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { @@ -676,8 +686,6 @@ PluginManager::lxvst_discover_from_path (string path) } } - info << "Done linuxVST discover" << endmsg; - vector_delete (plugin_objects); return ret; } @@ -685,11 +693,10 @@ PluginManager::lxvst_discover_from_path (string path) int PluginManager::lxvst_discover (string path) { - VSTFXInfo* finfo; + VSTInfo* 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; } @@ -718,6 +725,23 @@ PluginManager::lxvst_discover (string path) info->n_outputs.set_audio (finfo->numOutputs); info->n_inputs.set_midi (finfo->wantMidi ? 1 : 0); info->type = ARDOUR::LXVST; + + /* Make sure we don't find the same plugin in more than one place along + the LXVST_PATH We can't use a simple 'find' because the path is included + in the PluginInfo, and that is the one thing we can be sure MUST be + different if a duplicate instance is found. So we just compare the type + and unique ID (which for some VSTs isn't actually unique...) + */ + + if (!_lxvst_plugin_info->empty()) { + for (PluginInfoList::iterator i =_lxvst_plugin_info->begin(); i != _lxvst_plugin_info->end(); ++i) { + if ((info->type == (*i)->type)&&(info->unique_id == (*i)->unique_id)) { + warning << "Ignoring duplicate Linux VST plugin " << info->name << "\n"; + vstfx_free_info(finfo); + return 0; + } + } + } _lxvst_plugin_info->push_back (info); vstfx_free_info (finfo); @@ -744,10 +768,9 @@ void PluginManager::save_statuses () { ofstream ofs; - sys::path path = user_config_directory(); - path /= "plugin_statuses"; + std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses"); - ofs.open (path.to_string().c_str(), ios_base::openmode (ios::out|ios::trunc)); + ofs.open (path.c_str(), ios_base::openmode (ios::out|ios::trunc)); if (!ofs) { return; @@ -764,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"; @@ -797,9 +820,8 @@ PluginManager::save_statuses () void PluginManager::load_statuses () { - sys::path path = user_config_directory(); - path /= "plugin_statuses"; - ifstream ifs (path.to_string().c_str()); + std::string path = Glib::build_filename (user_config_directory(), "plugin_statuses"); + ifstream ifs (path.c_str()); if (!ifs) { return; @@ -852,8 +874,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 { @@ -884,12 +906,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 @@ -930,7 +953,7 @@ PluginManager::lv2_plugin_info () ARDOUR::PluginInfoList& PluginManager::au_plugin_info () { -#ifdef HAVE_AUDIOUNITS +#ifdef AUDIOUNIT_SUPPORT if (!_au_plugin_info) au_refresh(); return *_au_plugin_info;