X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fpanner_manager.cc;h=c6b73b40775fbdac0ce8d58bd9ed723d600b0573;hb=11b02e90ac9b084cd25741b7a6bdc91c59749c16;hp=24fa10e22516846a3453e08b5075f3c850f5106f;hpb=8d64665ce18a7feab1ad0483b2dc73e036ca2bf8;p=ardour.git diff --git a/libs/ardour/panner_manager.cc b/libs/ardour/panner_manager.cc index 24fa10e225..c6b73b4077 100644 --- a/libs/ardour/panner_manager.cc +++ b/libs/ardour/panner_manager.cc @@ -24,14 +24,15 @@ #include "pbd/error.h" #include "pbd/compose.h" -#include "pbd/pathscanner.h" +#include "pbd/file_utils.h" #include "pbd/stl_delete.h" #include "ardour/debug.h" #include "ardour/panner_manager.h" -#include "ardour/panner_search_path.h" -#include "i18n.h" +#include "ardour/search_paths.h" + +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -62,28 +63,42 @@ PannerManager::instance () static bool panner_filter (const string& str, void */*arg*/) { -#ifdef __APPLE__ +#ifdef COMPILER_MSVC + /** + * Different build targets (Debug / Release etc) use different versions + * of the 'C' runtime (which can't be 'mixed & matched'). Therefore, in + * case the supplied search path contains multiple version(s) of a given + * panner module, only select the one(s) which match the current build + * target (otherwise, all hell will break loose !!) + */ + #if defined (_DEBUG) + return str.length() > 12 && (str.find ("panner_") == 0) && (str.find ("D.dll") == (str.length() - 5)); + #elif defined (RDC_BUILD) + return str.length() > 14 && (str.find ("panner_") == 0) && (str.find ("RDC.dll") == (str.length() - 7)); + #elif defined (_WIN64) + return str.length() > 13 && (str.find ("panner_") == 0) && (str.find ("64.dll") == (str.length() - 6)); + #else + return str.length() > 13 && (str.find ("panner_") == 0) && (str.find ("32.dll") == (str.length() - 6)); + #endif +#elif defined (__APPLE__) return str[0] != '.' && (str.length() > 6 && str.find (".dylib") == (str.length() - 6)); #else - return str[0] != '.' && (str.length() > 3 && str.find (".so") == (str.length() - 3)); + return str[0] != '.' && (str.length() > 3 && (str.find (".so") == (str.length() - 3) || str.find (".dll") == (str.length() - 4))); #endif } void PannerManager::discover_panners () { - PathScanner scanner; - std::vector *panner_modules; - std::string search_path = panner_search_path().to_string(); + std::vector panner_modules; - DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1\n"), search_path)); + DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1\n"), panner_search_path().to_string())); - panner_modules = scanner (search_path, panner_filter, 0, false, true, 1, true); + find_files_matching_filter (panner_modules, panner_search_path(), panner_filter, 0, false, true, true); - for (vector::iterator i = panner_modules->begin(); i != panner_modules->end(); ++i) { - panner_discover (**i); + for (vector::iterator i = panner_modules.begin(); i != panner_modules.end(); ++i) { + panner_discover (*i); } - vector_delete (panner_modules); } int @@ -104,6 +119,8 @@ PannerManager::panner_discover (string path) if (i == panner_info.end()) { panner_info.push_back (pinfo); DEBUG_TRACE (DEBUG::Panning, string_compose(_("Panner discovered: \"%1\" in %2\n"), pinfo->descriptor.name, path)); + } else { + delete pinfo; } } @@ -113,31 +130,33 @@ PannerManager::panner_discover (string path) PannerInfo* PannerManager::get_descriptor (string path) { - void *module; + Glib::Module* module = new Glib::Module(path); PannerInfo* info = 0; PanPluginDescriptor *descriptor = 0; PanPluginDescriptor* (*dfunc)(void); - const char *errstr; + void* func = 0; - if ((module = dlopen (path.c_str(), RTLD_NOW)) == 0) { - error << string_compose(_("PannerManager: cannot load module \"%1\" (%2)"), path, dlerror()) << endmsg; + if (!module) { + error << string_compose(_("PannerManager: cannot load module \"%1\" (%2)"), path, + Glib::Module::get_last_error()) << endmsg; + delete module; return 0; } - dfunc = (PanPluginDescriptor* (*)(void)) dlsym (module, "panner_descriptor"); - - if ((errstr = dlerror()) != 0) { + if (!module->get_symbol("panner_descriptor", func)) { error << string_compose(_("PannerManager: module \"%1\" has no descriptor function."), path) << endmsg; - error << errstr << endmsg; - dlclose (module); + error << Glib::Module::get_last_error() << endmsg; + delete module; return 0; } + dfunc = (PanPluginDescriptor* (*)(void))func; descriptor = dfunc(); + if (descriptor) { info = new PannerInfo (*descriptor, module); } else { - dlclose (module); + delete module; } return info; @@ -218,13 +237,35 @@ PannerManager::select_panner (ChanCount in, ChanCount out, std::string const uri } PannerInfo* -PannerManager::get_by_uri (std::string uri) +PannerManager::get_by_uri (std::string uri) const { PannerInfo* pi = NULL; - for (list::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { + for (list::const_iterator p = panner_info.begin(); p != panner_info.end(); ++p) { if ((*p)->descriptor.panner_uri != uri) continue; pi = (*p); break; } return pi; } + +PannerUriMap +PannerManager::get_available_panners(uint32_t const a_in, uint32_t const a_out) const +{ + int const in = a_in; + int const out = a_out; + PannerUriMap panner_list; + + if (out < 2 || in == 0) { + return panner_list; + } + + /* get available panners for current configuration. */ + for (list::const_iterator p = panner_info.begin(); p != panner_info.end(); ++p) { + PanPluginDescriptor* d = &(*p)->descriptor; + if (d->in != -1 && d->in != in) continue; + if (d->out != -1 && d->out != out) continue; + if (d->in == -1 && d->out == -1 && out <= 2) continue; + panner_list.insert(std::pair(d->panner_uri,d->name)); + } + return panner_list; +}