13
0

Use ARDOUR::ladspa_search_path and PBD::find_matching_files to find LADSPA modules

This commit is contained in:
Paul Davis 2013-07-15 12:38:03 -04:00
parent 5bc4e54b7d
commit 83e05ec0ec
3 changed files with 42 additions and 80 deletions

View File

@ -51,7 +51,6 @@ class PluginManager : public boost::noncopyable {
void refresh ();
int add_ladspa_directory (std::string dirpath);
int add_windows_vst_directory (std::string dirpath);
int add_lxvst_directory (std::string dirpath);
@ -103,7 +102,6 @@ class PluginManager : public boost::noncopyable {
std::map<uint32_t, std::string> rdf_type;
std::string ladspa_path;
std::string windows_vst_path;
std::string lxvst_path;
@ -127,7 +125,6 @@ class PluginManager : public boost::noncopyable {
int lxvst_discover_from_path (std::string path);
int lxvst_discover (std::string path);
int ladspa_discover_from_path (std::string path);
int ladspa_discover (std::string path);
std::string get_ladspa_category (uint32_t id);

View File

@ -19,6 +19,8 @@
#include <glibmm/miscutils.h>
#include "pbd/pathexpand.h"
#include "ardour/ladspa_search_path.h"
#include "ardour/directory_names.h"
#include "ardour/filesystem_paths.h"
@ -46,6 +48,10 @@ ladspa_search_path ()
spath.push_back ("/usr/local/lib/ladspa");
spath.push_back ("/usr/lib64/ladspa");
spath.push_back ("/usr/lib/ladspa");
#endif
#ifdef __APPLE__
spath.push_back (expand_path ("~/Library/Audio/Plug-Ins/LADSPA"));
spath.push_back ("/Library/Audio/Plug-Ins/LADSPA");
#endif

View File

@ -45,9 +45,11 @@
#endif //LXVST_SUPPORT
#include <glibmm/miscutils.h>
#include <glibmm/pattern.h>
#include "pbd/pathscanner.h"
#include "pbd/whitespace.h"
#include "pbd/file_utils.h"
#include "ardour/debug.h"
#include "ardour/filesystem_paths.h"
@ -57,6 +59,12 @@
#include "ardour/plugin_manager.h"
#include "ardour/rc_configuration.h"
#ifdef SearchPath
#undef SearchPath
#endif
#include "ardour/ladspa_search_path.h"
#ifdef LV2_SUPPORT
#include "ardour/lv2_plugin.h"
#endif
@ -79,6 +87,8 @@
#include "i18n.h"
#include "ardour/debug.h"
using namespace ARDOUR;
using namespace PBD;
using namespace std;
@ -128,10 +138,6 @@ PluginManager::PluginManager ()
}
#endif /* Native LinuxVST support*/
if ((s = getenv ("LADSPA_PATH"))) {
ladspa_path = s;
}
if ((s = getenv ("VST_PATH"))) {
windows_vst_path = s;
} else if ((s = getenv ("VST_PLUGINS"))) {
@ -200,91 +206,38 @@ PluginManager::refresh ()
void
PluginManager::ladspa_refresh ()
{
if (_ladspa_plugin_info)
if (_ladspa_plugin_info) {
_ladspa_plugin_info->clear ();
else
} 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 G_DIR_SEPARATOR too.
*/
vector<string> ladspa_modules;
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 G_DIR_SEPARATOR :
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 += ":";
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_search_path().to_string()));
ladspa_path += standard_paths[i];
Glib::PatternSpec so_extension_pattern("*.so");
Glib::PatternSpec dylib_extension_pattern("*.dylib");
Glib::PatternSpec dll_extension_pattern("*.dll");
find_matching_files_in_search_path (ladspa_search_path (),
so_extension_pattern, ladspa_modules);
find_matching_files_in_search_path (ladspa_search_path (),
dylib_extension_pattern, ladspa_modules);
find_matching_files_in_search_path (ladspa_search_path (),
dll_extension_pattern, ladspa_modules);
for (vector<std::string>::iterator i = ladspa_modules.begin(); i != ladspa_modules.end(); ++i) {
ladspa_discover (*i);
}
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA: search along: [%1]\n", ladspa_path));
ladspa_discover_from_path (ladspa_path);
}
int
PluginManager::add_ladspa_directory (string path)
{
if (ladspa_discover_from_path (path) == 0) {
ladspa_path += ':';
ladspa_path += path;
return 0;
}
return -1;
}
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*/)
{
PathScanner scanner;
vector<string *> *plugin_objects;
vector<string *>::iterator x;
int ret = 0;
plugin_objects = scanner (ladspa_path, ladspa_filter, 0, false, true);
if (plugin_objects) {
for (x = plugin_objects->begin(); x != plugin_objects->end (); ++x) {
ladspa_discover (**x);
}
vector_delete (plugin_objects);
}
return ret;
}
static bool rdf_filter (const string &str, void* /*arg*/)
@ -370,6 +323,8 @@ PluginManager::add_lrdf_data (const string &path)
int
PluginManager::ladspa_discover (string path)
{
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Checking for LADSPA plugin at %1\n", path));
Glib::Module module(path);
const LADSPA_Descriptor *descriptor;
LADSPA_Descriptor_Function dfunc;
@ -390,6 +345,8 @@ PluginManager::ladspa_discover (string path)
dfunc = (LADSPA_Descriptor_Function)func;
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path));
for (uint32_t i = 0; ; ++i) {
if ((descriptor = dfunc (i)) == 0) {
break;
@ -443,6 +400,8 @@ PluginManager::ladspa_discover (string path)
if(!found){
_ladspa_plugin_info->push_back (info);
}
DEBUG_TRACE (DEBUG::PluginManager, string_compose ("Found LADSPA plugin, name: %1, Inputs: %2, Outputs: %3\n", info->name, info->n_inputs, info->n_outputs));
}
// GDB WILL NOT LIKE YOU IF YOU DO THIS