From 250299b31527168e53ec5da41700d840f6cf30ba Mon Sep 17 00:00:00 2001 From: waxfrenzy Date: Sun, 8 Dec 2002 18:55:57 +0000 Subject: [PATCH] Aded option to supply paths and override LADSPA_PATH --- SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C | 106 +++++++++++------- SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h | 15 ++- 2 files changed, 77 insertions(+), 44 deletions(-) diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C b/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C index 40034c0..adbe3c4 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.C @@ -35,8 +35,15 @@ using namespace std; -LADSPAInfo::LADSPAInfo() +LADSPAInfo::LADSPAInfo(bool override, const char *path_list) { + if (strlen(path_list) > 0) { + m_ExtraPaths = strdup(path_list); + } else { + m_ExtraPaths = NULL; + } + m_LADSPAPathOverride = override; + RescanPlugins(); } @@ -48,51 +55,32 @@ LADSPAInfo::~LADSPAInfo() void LADSPAInfo::RescanPlugins(void) { - char *ladspa_path; - char *start; - char *end; - int extra; - char *temp; - // Clear out what we've got CleanUp(); -// Get $LADPSA_PATH, if available - ladspa_path = getenv("LADSPA_PATH"); - if (!ladspa_path) { + if (!m_LADSPAPathOverride) { + // Get $LADPSA_PATH, if available + char *ladspa_path = getenv("LADSPA_PATH"); + if (!ladspa_path) { - // Oops - cerr << "WARNING: No LADSPA Path Set" << endl; - } + // Oops + cerr << "WARNING: No LADSPA Path Set" << endl; + } -// Extract path elements and add path - if (ladspa_path) { - start = ladspa_path; - while (*start != '\0') { - while (*start == ':') start++; - end = start; - while (*end != ':' && *end != '\0') end++; - - if (end - start > 0) { - extra = (*(end - 1) == '/') ? 0 : 1; - temp = (char *)malloc(end - start + 1 + extra); - if (temp) { - strncpy(temp, start, end - start); - if (extra == 1) temp[end - start] = '/'; - temp[end - start + extra] = '\0'; - - ExaminePath(temp); - - free(temp); - } - } - start = end; + // Extract path elements and add path + if (ladspa_path) { + ScanPathList(ladspa_path); } } +// Check any supplied extra paths + if (m_ExtraPaths) { + ScanPathList(m_ExtraPaths); + } + // Do we have any plugins now? if (m_Plugins.size() == 0) { - cerr << "WARNING: No plugins found in given LADSPA_PATH" << endl; + cerr << "WARNING: No plugins found" << endl; } else { cerr << m_Plugins.size() << " plugins found in " << m_Libraries.size() << " libraries" << endl; } @@ -256,6 +244,42 @@ LADSPAInfo::CleanUp(void) m_OrderedPluginList.clear(); m_MaxInputPortCount = 0; + + if (m_ExtraPaths) { + free(m_ExtraPaths); + m_ExtraPaths = NULL; + } +} + +void +LADSPAInfo::ScanPathList(const char *path_list) +{ + const char *start; + const char *end; + int extra; + char *temp; + + start = path_list; + while (*start != '\0') { + while (*start == ':') start++; + end = start; + while (*end != ':' && *end != '\0') end++; + + if (end - start > 0) { + extra = (*(end - 1) == '/') ? 0 : 1; + temp = (char *)malloc(end - start + 1 + extra); + if (temp) { + strncpy(temp, start, end - start); + if (extra == 1) temp[end - start] = '/'; + temp[end - start + extra] = '\0'; + + ExaminePath(temp); + + free(temp); + } + } + start = end; + } } // Check given path: @@ -274,10 +298,15 @@ LADSPAInfo::ExaminePath(const char *path) void *handle; LADSPA_Descriptor_Function desc_func; const LADSPA_Descriptor *desc; - bool path_added = false; + bool path_added; + unsigned long path_index; bool library_added; string fullpath; vector temp_names; + vector::iterator p = find(m_Paths.begin(), m_Paths.end(), path); + + path_added = !(p == m_Paths.end()); + path_index = p - m_Paths.begin(); dp = opendir(path); if (!dp) { @@ -326,7 +355,6 @@ LADSPAInfo::ExaminePath(const char *path) if (m_IDLookup.find(desc->UniqueID) != m_IDLookup.end()) { unsigned long plugin_index; unsigned long library_index; - unsigned long path_index; cerr << "WARNING: Duplicated Plugin ID (" << desc->UniqueID << ") found:" << endl; @@ -353,7 +381,7 @@ LADSPAInfo::ExaminePath(const char *path) // Add library info LibraryInfo li; - li.PathIndex = m_Paths.size() - 1; + li.PathIndex = path_index; li.Basename = ep->d_name; li.Handle = NULL; m_Libraries.push_back(li); diff --git a/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h b/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h index b9edaaa..435cbde 100644 --- a/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h +++ b/SpiralSound/Plugins/LADSPAPlugin/LADSPAInfo.h @@ -29,10 +29,11 @@ class LADSPAInfo { public: - // Examine all valid paths in $LADSPA_PATH, and add - // basic plugin information for later lookup, instantiation - // and so on. - LADSPAInfo(); + // If override is false, examine $LADSPA_PATH + // Also examine supplied path list + // For all paths, add basic plugin information for later lookup, + // instantiation and so on. + LADSPAInfo(bool override, const char *path_list); // Unload all loaded plugins and clean up ~LADSPAInfo(); @@ -69,13 +70,14 @@ public: // Get the index in the above list for given Unique ID // If not found, this returns the size of the above list unsigned long GetPluginListEntryByID(unsigned long unique_id); - + // Get the number of input ports for the plugin with the most // input ports unsigned long GetMaxInputPortCount(void) { return m_MaxInputPortCount; } private: void CleanUp(void); + void ScanPathList(const char *path_list); void ExaminePath(const char *path); bool CheckPlugin(LADSPA_Descriptor_Function desc_func); LADSPA_Descriptor_Function GetDescriptorFunctionForLibrary(unsigned long library_index); @@ -112,6 +114,9 @@ private: } }; + bool m_LADSPAPathOverride; + char *m_ExtraPaths; + std::vector m_Paths; std::vector m_Libraries; std::vector m_Plugins;