From 0cfbd6fb435ba1b6e8739e7cb9e448991b90731e Mon Sep 17 00:00:00 2001 From: Comment Date: Fri, 24 May 2013 09:38:53 +0100 Subject: vamp plugin lister --- vamphost/src/ofxVamphost.cpp | 292 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 290 insertions(+), 2 deletions(-) (limited to 'vamphost/src/ofxVamphost.cpp') diff --git a/vamphost/src/ofxVamphost.cpp b/vamphost/src/ofxVamphost.cpp index 3844c60..6d2cefc 100644 --- a/vamphost/src/ofxVamphost.cpp +++ b/vamphost/src/ofxVamphost.cpp @@ -6,6 +6,296 @@ int Vamphost::getRT(){ return rt.msec(); } +enum Verbosity { + PluginIds, + PluginOutputIds, + PluginInformation, + PluginInformationDetailed +}; + +static string header(string text, int level) +{ + string out = '\n' + text + '\n'; + for (size_t i = 0; i < text.length(); ++i) { + out += (level == 1 ? '=' : level == 2 ? '-' : '~'); + } + out += '\n'; + return out; +} + + +void printPluginPath(bool verbose) +{ + if (verbose) { + cout << "\nVamp plugin search path: "; + } + + vector path = PluginHostAdapter::getPluginPath(); + for (size_t i = 0; i < path.size(); ++i) { + if (verbose) { + cout << "[" << path[i] << "]"; + } else { + cout << path[i] << endl; + } + } + + if (verbose) cout << endl; +} + +void enumeratePlugins(Verbosity verbosity) +{ + PluginLoader *loader = PluginLoader::getInstance(); + + if (verbosity == PluginInformation) { + cout << "\nVamp plugin libraries found in search path:" << endl; + } + + vector plugins = loader->listPlugins(); + typedef multimap + LibraryMap; + LibraryMap libraryMap; + + for (size_t i = 0; i < plugins.size(); ++i) { + string path = loader->getLibraryPathForPlugin(plugins[i]); + libraryMap.insert(LibraryMap::value_type(path, plugins[i])); + } + + string prevPath = ""; + int index = 0; + + for (LibraryMap::iterator i = libraryMap.begin(); + i != libraryMap.end(); ++i) { + + string path = i->first; + PluginLoader::PluginKey key = i->second; + + if (path != prevPath) { + prevPath = path; + index = 0; + if (verbosity == PluginInformation) { + cout << "\n " << path << ":" << endl; + } else if (verbosity == PluginInformationDetailed) { + string::size_type ki = i->second.find(':'); + string text = "Library \"" + i->second.substr(0, ki) + "\""; + cout << "\n" << header(text, 1); + } + } + + Plugin *plugin = loader->loadPlugin(key, 48000); + if (plugin) { + + char c = char('A' + index); + if (c > 'Z') c = char('a' + (index - 26)); + + PluginLoader::PluginCategoryHierarchy category = + loader->getPluginCategory(key); + string catstr; + if (!category.empty()) { + for (size_t ci = 0; ci < category.size(); ++ci) { + if (ci > 0) catstr += " > "; + catstr += category[ci]; + } + } + + if (verbosity == PluginInformation) { + + cout << " [" << c << "] [v" + << plugin->getVampApiVersion() << "] " + << plugin->getName() << ", \"" + << plugin->getIdentifier() << "\"" << " [" + << plugin->getMaker() << "]" << endl; + + if (catstr != "") { + cout << " > " << catstr << endl; + } + + if (plugin->getDescription() != "") { + cout << " - " << plugin->getDescription() << endl; + } + + } else if (verbosity == PluginInformationDetailed) { + + cout << header(plugin->getName(), 2); + cout << " - Identifier: " + << key << endl; + cout << " - Plugin Version: " + << plugin->getPluginVersion() << endl; + cout << " - Vamp API Version: " + << plugin->getVampApiVersion() << endl; + cout << " - Maker: \"" + << plugin->getMaker() << "\"" << endl; + cout << " - Copyright: \"" + << plugin->getCopyright() << "\"" << endl; + cout << " - Description: \"" + << plugin->getDescription() << "\"" << endl; + cout << " - Input Domain: " + << (plugin->getInputDomain() == Vamp::Plugin::TimeDomain ? + "Time Domain" : "Frequency Domain") << endl; + cout << " - Default Step Size: " + << plugin->getPreferredStepSize() << endl; + cout << " - Default Block Size: " + << plugin->getPreferredBlockSize() << endl; + cout << " - Minimum Channels: " + << plugin->getMinChannelCount() << endl; + cout << " - Maximum Channels: " + << plugin->getMaxChannelCount() << endl; + + } else if (verbosity == PluginIds) { + cout << "vamp:" << key << endl; + } + + Plugin::OutputList outputs = + plugin->getOutputDescriptors(); + + if (verbosity == PluginInformationDetailed) { + + Plugin::ParameterList params = plugin->getParameterDescriptors(); + for (size_t j = 0; j < params.size(); ++j) { + Plugin::ParameterDescriptor &pd(params[j]); + cout << "\nParameter " << j+1 << ": \"" << pd.name << "\"" << endl; + cout << " - Identifier: " << pd.identifier << endl; + cout << " - Description: \"" << pd.description << "\"" << endl; + if (pd.unit != "") { + cout << " - Unit: " << pd.unit << endl; + } + cout << " - Range: "; + cout << pd.minValue << " -> " << pd.maxValue << endl; + cout << " - Default: "; + cout << pd.defaultValue << endl; + if (pd.isQuantized) { + cout << " - Quantize Step: " + << pd.quantizeStep << endl; + } + if (!pd.valueNames.empty()) { + cout << " - Value Names: "; + for (size_t k = 0; k < pd.valueNames.size(); ++k) { + if (k > 0) cout << ", "; + cout << "\"" << pd.valueNames[k] << "\""; + } + cout << endl; + } + } + + if (outputs.empty()) { + cout << "\n** Note: This plugin reports no outputs!" << endl; + } + for (size_t j = 0; j < outputs.size(); ++j) { + Plugin::OutputDescriptor &od(outputs[j]); + cout << "\nOutput " << j+1 << ": \"" << od.name << "\"" << endl; + cout << " - Identifier: " << od.identifier << endl; + cout << " - Description: \"" << od.description << "\"" << endl; + if (od.unit != "") { + cout << " - Unit: " << od.unit << endl; + } + if (od.hasFixedBinCount) { + cout << " - Default Bin Count: " << od.binCount << endl; + } + if (!od.binNames.empty()) { + bool have = false; + for (size_t k = 0; k < od.binNames.size(); ++k) { + if (od.binNames[k] != "") { + have = true; break; + } + } + if (have) { + cout << " - Bin Names: "; + for (size_t k = 0; k < od.binNames.size(); ++k) { + if (k > 0) cout << ", "; + cout << "\"" << od.binNames[k] << "\""; + } + cout << endl; + } + } + if (od.hasKnownExtents) { + cout << " - Default Extents: "; + cout << od.minValue << " -> " << od.maxValue << endl; + } + if (od.isQuantized) { + cout << " - Quantize Step: " + << od.quantizeStep << endl; + } + cout << " - Sample Type: " + << (od.sampleType == + Plugin::OutputDescriptor::OneSamplePerStep ? + "One Sample Per Step" : + od.sampleType == + Plugin::OutputDescriptor::FixedSampleRate ? + "Fixed Sample Rate" : + "Variable Sample Rate") << endl; + if (od.sampleType != + Plugin::OutputDescriptor::OneSamplePerStep) { + cout << " - Default Rate: " + << od.sampleRate << endl; + } + cout << " - Has Duration: " + << (od.hasDuration ? "Yes" : "No") << endl; + } + } + + if (outputs.size() > 1 || verbosity == PluginOutputIds) { + for (size_t j = 0; j < outputs.size(); ++j) { + if (verbosity == PluginInformation) { + cout << " (" << j << ") " + << outputs[j].name << ", \"" + << outputs[j].identifier << "\"" << endl; + if (outputs[j].description != "") { + cout << " - " + << outputs[j].description << endl; + } + } else if (verbosity == PluginOutputIds) { + cout << "vamp:" << key << ":" << outputs[j].identifier << endl; + } + } + } + + ++index; + + delete plugin; + } + } + + if (verbosity == PluginInformation || + verbosity == PluginInformationDetailed) { + cout << endl; + } +} + +void printPluginCategoryList() +{ + PluginLoader *loader = PluginLoader::getInstance(); + + vector plugins = loader->listPlugins(); + + set printedcats; + + for (size_t i = 0; i < plugins.size(); ++i) { + + PluginLoader::PluginKey key = plugins[i]; + + PluginLoader::PluginCategoryHierarchy category = + loader->getPluginCategory(key); + + Plugin *plugin = loader->loadPlugin(key, 48000); + if (!plugin) continue; + + string catstr = ""; + + if (category.empty()) catstr = '|'; + else { + for (size_t j = 0; j < category.size(); ++j) { + catstr += category[j]; + catstr += '|'; + if (printedcats.find(catstr) == printedcats.end()) { + std::cout << catstr << std::endl; + printedcats.insert(catstr); + } + } + } + + std::cout << catstr << key << ":::" << plugin->getName() << ":::" << plugin->getMaker() << ":::" << plugin->getDescription() << std::endl; + } +} + int Vamphost::init(const string &soname,const string &id,const int &_channels,const int &_rate,const int &_outputNo,const string &_output){ //stuff that only happens once @@ -165,8 +455,6 @@ void Vamphost::process_frame(float *data,int samples_in_frame){ Plugin::FeatureSet feat=plugin->process(plugbuf, rt); - if (feat[outputNo].size()>0) cerr<<"BEAT"<