X-Git-Url: https://main.carlh.net/gitweb/?p=ardour.git;a=blobdiff_plain;f=libs%2Fardour%2Fpanner_manager.cc;h=3c9623f3e6fa674a798c4c731258b3650a303536;hp=8611c7bc86d5b4ba9c183a25014126b45e1e8f58;hb=3020b224fa2d6e1b6b8a576e8e8e211e0585f2a2;hpb=897fbdc652434d3aa1e67223c3c3ef7ae9be2318 diff --git a/libs/ardour/panner_manager.cc b/libs/ardour/panner_manager.cc index 8611c7bc86..3c9623f3e6 100644 --- a/libs/ardour/panner_manager.cc +++ b/libs/ardour/panner_manager.cc @@ -24,7 +24,8 @@ #include "pbd/error.h" #include "pbd/compose.h" -#include "pbd/file_utils.h" +#include "pbd/pathscanner.h" +#include "pbd/stl_delete.h" #include "ardour/debug.h" #include "ardour/panner_manager.h" @@ -60,29 +61,31 @@ PannerManager::instance () return *_instance; } +static bool panner_filter (const string& str, void */*arg*/) +{ +#ifdef __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) || str.find (".dll") == (str.length() - 4))); +#endif +} + void PannerManager::discover_panners () { - vector panner_modules; - - Glib::PatternSpec so_extension_pattern("*.so"); - Glib::PatternSpec dylib_extension_pattern("*.dylib"); - Glib::PatternSpec dll_extension_pattern("*.dll"); - - find_matching_files_in_search_path (panner_search_path (), - so_extension_pattern, panner_modules); + PathScanner scanner; + std::vector *panner_modules; + std::string search_path = panner_search_path().to_string(); - find_matching_files_in_search_path (panner_search_path (), - dylib_extension_pattern, panner_modules); + DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1\n"), search_path)); - find_matching_files_in_search_path (panner_search_path (), - dll_extension_pattern, panner_modules); + panner_modules = scanner (search_path, panner_filter, 0, false, true, 1, true); - DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for panners in %1"), panner_search_path().to_string())); - - 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 @@ -102,7 +105,7 @@ 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"), pinfo->descriptor.name, path)); + DEBUG_TRACE (DEBUG::Panning, string_compose(_("Panner discovered: \"%1\" in %2\n"), pinfo->descriptor.name, path)); } } @@ -145,53 +148,87 @@ PannerManager::get_descriptor (string path) } PannerInfo* -PannerManager::select_panner (ChanCount in, ChanCount out) +PannerManager::select_panner (ChanCount in, ChanCount out, std::string const uri) { + PannerInfo* rv = NULL; PanPluginDescriptor* d; int32_t nin = in.n_audio(); int32_t nout = out.n_audio(); + uint32_t priority = 0; + + /* look for user-preference -- check if channels match */ + for (list::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { + d = &(*p)->descriptor; + if (d->panner_uri != uri) continue; + if (d->in != nin && d->in != -1) continue; + if (d->out != nout && d->out != -1) continue; + return *p; + } /* look for exact match first */ for (list::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { d = &(*p)->descriptor; - if (d->in == nin && d->out == nout) { - return *p; + if (d->in == nin && d->out == nout && d->priority > priority) { + priority = d->priority; + rv = *p; } } + if (rv) { return rv; } /* no exact match, look for good fit on inputs and variable on outputs */ + priority = 0; for (list::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { d = &(*p)->descriptor; - if (d->in == nin && d->out == -1) { - return *p; + if (d->in == nin && d->out == -1 && d->priority > priority) { + priority = d->priority; + rv = *p; } } + if (rv) { return rv; } /* no exact match, look for good fit on outputs and variable on inputs */ + priority = 0; for (list::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { d = &(*p)->descriptor; - if (d->in == -1 && d->out == nout) { - return *p; + if (d->in == -1 && d->out == nout && d->priority > priority) { + priority = d->priority; + rv = *p; } } + if (rv) { return rv; } /* no exact match, look for variable fit on inputs and outputs */ + priority = 0; for (list::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { d = &(*p)->descriptor; - if (d->in == -1 && d->out == -1) { - return *p; + if (d->in == -1 && d->out == -1 && d->priority > priority) { + priority = d->priority; + rv = *p; } } + if (rv) { return rv; } warning << string_compose (_("no panner discovered for in/out = %1/%2"), nin, nout) << endmsg; return 0; } + +PannerInfo* +PannerManager::get_by_uri (std::string uri) +{ + PannerInfo* pi = NULL; + for (list::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { + if ((*p)->descriptor.panner_uri != uri) continue; + pi = (*p); + break; + } + return pi; +}