X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_manager.cc;h=8227d5869f2f4da5b315435b58a5cee665122e89;hb=6be56d78b199452e5dba726f2d7aaab2777d2b49;hp=6ac57400c482ea06c991d9576e1e50df8fd17c3f;hpb=bb9cc45cd22af67ac275a5e73accbe14fee664d8;p=ardour.git diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 6ac57400c4..8227d5869f 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 @@ -40,6 +39,7 @@ #include #include "pbd/pathscanner.h" +#include "pbd/whitespace.h" #include "ardour/ladspa.h" #include "ardour/session.h" @@ -74,11 +74,15 @@ 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 (); + load_statuses (); #ifdef HAVE_AUDIOUNITS ProcessSerialNumber psn = { 0, kCurrentProcess }; @@ -135,10 +139,17 @@ PluginManager::PluginManager () #endif BootMessage (_("Discovering Plugins")); +} + - refresh (); +PluginManager::~PluginManager() +{ +#ifdef HAVE_SLV2 + delete _lv2_world; +#endif } + void PluginManager::refresh () { @@ -154,12 +165,17 @@ PluginManager::refresh () #ifdef HAVE_AUDIOUNITS au_refresh (); #endif + + PluginListChanged (); /* EMIT SIGNAL */ } void PluginManager::ladspa_refresh () { - _ladspa_plugin_info.clear (); + if (_ladspa_plugin_info) + _ladspa_plugin_info->clear (); + else + _ladspa_plugin_info = new ARDOUR::PluginInfoList (); static const char *standard_paths[] = { "/usr/local/lib64/ladspa", @@ -184,7 +200,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; @@ -240,12 +256,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] != '.' && ((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 @@ -293,13 +310,12 @@ PluginManager::add_lrdf_data (const string &path) PathScanner scanner; vector* rdf_files; vector::iterator x; - string uri; rdf_files = scanner (path, rdf_filter, 0, true, true); if (rdf_files) { for (x = rdf_files->begin(); x != rdf_files->end (); ++x) { - uri = "file://" + **x; + const string uri(string("file://") + **x); if (lrdf_read_file(uri.c_str())) { warning << "Could not parse rdf file: " << uri << endmsg; @@ -368,22 +384,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); } } @@ -408,7 +424,7 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) lrdf_statement* matches1 = lrdf_matches (&pattern); if (!matches1) { - return ""; + return "Unknown"; } pattern.subject = matches1->object; @@ -420,7 +436,7 @@ PluginManager::get_ladspa_category (uint32_t plugin_id) lrdf_free_statements(matches1); if (!matches2) { - return (""); + return ("Unknown"); } string label = matches2->object; @@ -433,14 +449,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 @@ -448,14 +458,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 @@ -465,7 +469,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"; @@ -550,9 +557,10 @@ PluginManager::vst_discover (string path) 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::VST; - _vst_plugin_info.push_back (info); + _vst_plugin_info->push_back (info); fst_free_info (finfo); return 0; @@ -560,19 +568,24 @@ PluginManager::vst_discover (string path) #endif // VST_SUPPORT -bool -PluginManager::is_a_favorite_plugin (const PluginInfoPtr& pi) +PluginManager::PluginStatusType +PluginManager::get_status (const PluginInfoPtr& pi) { - FavoritePlugin fp (pi->type, pi->unique_id); - return find (favorites.begin(), favorites.end(), fp) != favorites.end(); + PluginStatus ps (pi->type, pi->unique_id); + PluginStatusList::const_iterator i = find (statuses.begin(), statuses.end(), ps); + if (i == statuses.end() ) { + return Normal; + } else { + return i->status; + } } void -PluginManager::save_favorites () +PluginManager::save_statuses () { ofstream ofs; sys::path path = user_config_directory(); - path /= "favorite_plugins"; + path /= "plugin_statuses"; ofs.open (path.to_string().c_str(), ios_base::openmode (ios::out|ios::trunc)); @@ -580,7 +593,7 @@ PluginManager::save_favorites () return; } - for (FavoritePluginList::iterator i = favorites.begin(); i != favorites.end(); ++i) { + for (PluginStatusList::iterator i = statuses.begin(); i != statuses.end(); ++i) { switch ((*i).type) { case LADSPA: ofs << "LADSPA"; @@ -596,26 +609,45 @@ PluginManager::save_favorites () break; } - ofs << ' ' << (*i).unique_id << endl; + ofs << ' '; + + switch ((*i).status) { + case Normal: + ofs << "Normal"; + break; + case Favorite: + ofs << "Favorite"; + break; + case Hidden: + ofs << "Hidden"; + break; + } + + ofs << ' '; + ofs << (*i).unique_id;; + ofs << endl; } ofs.close (); } void -PluginManager::load_favorites () +PluginManager::load_statuses () { sys::path path = user_config_directory(); - path /= "favorite_plugins"; + path /= "plugin_statuses"; ifstream ifs (path.to_string().c_str()); if (!ifs) { return; } - + std::string stype; + std::string sstatus; std::string id; PluginType type; + PluginStatusType status; + char buf[1024]; while (ifs) { @@ -624,11 +656,33 @@ PluginManager::load_favorites () break; } - ifs >> id; + + ifs >> sstatus; + if (!ifs) { + break; + + } + + /* rest of the line is the plugin ID */ + + ifs.getline (buf, sizeof (buf), '\n'); if (!ifs) { break; } + if (sstatus == "Normal") { + status = Normal; + } else if (sstatus == "Favorite") { + status = Favorite; + } else if (sstatus == "Hidden") { + status = Hidden; + } else { + error << string_compose (_("unknown plugin status type \"%1\" - all entries ignored"), sstatus) + << endmsg; + statuses.clear (); + break; + } + if (stype == "LADSPA") { type = LADSPA; } else if (stype == "AudioUnit") { @@ -638,28 +692,73 @@ PluginManager::load_favorites () } else if (stype == "VST") { type = VST; } else { - error << string_compose (_("unknown favorite plugin type \"%1\" - ignored"), stype) + error << string_compose (_("unknown plugin type \"%1\" - ignored"), stype) << endmsg; continue; } - - add_favorite (type, id); + + id = buf; + strip_whitespace_edges (id); + set_status (type, id, status); } - + ifs.close (); } void -PluginManager::add_favorite (PluginType t, string id) +PluginManager::set_status (PluginType t, string id, PluginStatusType status) { - FavoritePlugin fp (t, id); - pair res = favorites.insert (fp); - //cerr << "Added " << t << " " << id << " success ? " << res.second << endl; + PluginStatus ps (t, id, status); + statuses.erase (ps); + + if (status == Normal) { + return; + } + + pair res = statuses.insert (ps); + //cerr << "Added " << t << " " << id << " " << status << " success ? " << res.second << endl; } -void -PluginManager::remove_favorite (PluginType t, string id) +ARDOUR::PluginInfoList& +PluginManager::vst_plugin_info () { - FavoritePlugin fp (t, id); - favorites.erase (fp); +#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 }