ladspa: rewrite the directory scanning, fixes first part of #573370
authorStefan Kost <ensonic@users.sf.net>
Wed, 4 Mar 2009 12:34:12 +0000 (14:34 +0200)
committerStefan Kost <ensonic@users.sf.net>
Wed, 4 Mar 2009 13:10:30 +0000 (15:10 +0200)
Move the two function from search.c into gstladspa.c and make them static.
Remove non needed arguments from function prototypes. Use glib api for
simplicity and portability.

ext/ladspa/Makefile.am
ext/ladspa/load.c [deleted file]
ext/ladspa/search.c [deleted file]
ext/ladspa/utils.h [deleted file]

index c024d9dabc2a996a59726905d9b8cd48937f5da3..ffd1e0ab2881ce764dd91be6e5f203cbc79877dd 100644 (file)
@@ -1,9 +1,9 @@
 plugin_LTLIBRARIES = libgstladspa.la
 
-libgstladspa_la_SOURCES = gstsignalprocessor.c gstladspa.c search.c #load.c
+libgstladspa_la_SOURCES = gstsignalprocessor.c gstladspa.c
 libgstladspa_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS)
 libgstladspa_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(LIBM) $(LADSPA_LIBS)
 libgstladspa_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstladspa_la_LIBTOOLFLAGS = --tag=disable-static
 
-noinst_HEADERS = gstsignalprocessor.h gstladspa.h utils.h
+noinst_HEADERS = gstsignalprocessor.h gstladspa.h
diff --git a/ext/ladspa/load.c b/ext/ladspa/load.c
deleted file mode 100644 (file)
index 5ea3714..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/* load.c
-
-   Free software by Richard W.E. Furse. Do with as you will. No
-   warranty. */
-
-/*****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <glib.h>
-
-/*****************************************************************************/
-
-#include "ladspa.h"
-#include "utils.h"
-
-/*****************************************************************************/
-
-/* This function provides a wrapping of dlopen(). When the filename is
-   not an absolute path (i.e. does not begin with / character), this
-   routine will search the LADSPA_PATH for the file. */
-static void *
-dlopenLADSPA (const char *pcFilename, int iFlag)
-{
-
-  char *pcBuffer;
-  const char *pcEnd;
-  const char *pcLADSPAPath;
-  const char *pcStart;
-  int iEndsInSO;
-  int iNeedSlash;
-  size_t iFilenameLength;
-  void *pvResult;
-
-  iFilenameLength = strlen (pcFilename);
-  pvResult = NULL;
-
-  if (pcFilename[0] == '/') {
-
-    /* The filename is absolute. Assume the user knows what he/she is
-       doing and simply dlopen() it. */
-
-    pvResult = dlopen (pcFilename, iFlag);
-    if (pvResult != NULL)
-      return pvResult;
-
-  } else {
-
-    /* If the filename is not absolute then we wish to check along the
-       LADSPA_PATH path to see if we can find the file there. We do
-       NOT call dlopen() directly as this would find plugins on the
-       LD_LIBRARY_PATH, whereas the LADSPA_PATH is the correct place
-       to search. */
-
-    /* thomasvs: I'm sorry, but I'm going to add glib stuff here.
-     * I'm appending logical values for LADSPA_PATH here
-     */
-
-    pcLADSPAPath = g_strdup_printf ("%s:/usr/lib/ladspa:/usr/local/lib/ladspa",
-        getenv ("LADSPA_PATH"));
-
-    if (pcLADSPAPath) {
-
-      pcStart = pcLADSPAPath;
-      while (*pcStart != '\0') {
-        pcEnd = pcStart;
-        while (*pcEnd != ':' && *pcEnd != '\0')
-          pcEnd++;
-
-        pcBuffer = malloc (iFilenameLength + 2 + (pcEnd - pcStart));
-        if (pcEnd > pcStart)
-          strncpy (pcBuffer, pcStart, pcEnd - pcStart);
-        iNeedSlash = 0;
-        if (pcEnd > pcStart)
-          if (*(pcEnd - 1) != '/') {
-            iNeedSlash = 1;
-            pcBuffer[pcEnd - pcStart] = '/';
-          }
-        strcpy (pcBuffer + iNeedSlash + (pcEnd - pcStart), pcFilename);
-
-        pvResult = dlopen (pcBuffer, iFlag);
-
-        free (pcBuffer);
-        if (pvResult != NULL)
-          return pvResult;
-
-        pcStart = pcEnd;
-        if (*pcStart == ':')
-          pcStart++;
-      }
-    }
-  }
-
-  /* As a last ditch effort, check if filename does not end with
-     ".so". In this case, add this suffix and recurse. */
-  iEndsInSO = 0;
-  if (iFilenameLength > 3)
-    iEndsInSO = (strcmp (pcFilename + iFilenameLength - 3, ".so") == 0);
-  if (!iEndsInSO) {
-    pcBuffer = malloc (iFilenameLength + 4);
-    strcpy (pcBuffer, pcFilename);
-    strcat (pcBuffer, ".so");
-    pvResult = dlopenLADSPA (pcBuffer, iFlag);
-    free (pcBuffer);
-  }
-
-  if (pvResult != NULL)
-    return pvResult;
-
-  /* If nothing has worked, then at least we can make sure we set the
-     correct error message - and this should correspond to a call to
-     dlopen() with the actual filename requested. The dlopen() manual
-     page does not specify whether the first or last error message
-     will be kept when multiple calls are made to dlopen(). We've
-     covered the former case - now we can handle the latter by calling
-     dlopen() again here. */
-  return dlopen (pcFilename, iFlag);
-}
-
-/*****************************************************************************/
-
-void *
-loadLADSPAPluginLibrary (const char *pcPluginFilename)
-{
-
-  void *pvPluginHandle;
-
-  pvPluginHandle = dlopenLADSPA (pcPluginFilename, RTLD_NOW);
-  if (!pvPluginHandle) {
-    fprintf (stderr,
-        "Failed to load plugin \"%s\": %s\n", pcPluginFilename, dlerror ());
-    exit (1);
-  }
-
-  return pvPluginHandle;
-}
-
-/*****************************************************************************/
-
-void
-unloadLADSPAPluginLibrary (void *pvLADSPAPluginLibrary)
-{
-  dlclose (pvLADSPAPluginLibrary);
-}
-
-/*****************************************************************************/
-
-const LADSPA_Descriptor *
-findLADSPAPluginDescriptor (void *pvLADSPAPluginLibrary,
-    const char *pcPluginLibraryFilename, const char *pcPluginLabel)
-{
-
-  const LADSPA_Descriptor *psDescriptor;
-  LADSPA_Descriptor_Function pfDescriptorFunction;
-  unsigned long lPluginIndex;
-
-  dlerror ();
-  pfDescriptorFunction
-      = (LADSPA_Descriptor_Function) dlsym (pvLADSPAPluginLibrary,
-      "ladspa_descriptor");
-  if (!pfDescriptorFunction) {
-    const char *pcError = dlerror ();
-
-    if (pcError) {
-      fprintf (stderr,
-          "Unable to find ladspa_descriptor() function in plugin "
-          "library file \"%s\": %s.\n"
-          "Are you sure this is a LADSPA plugin file?\n",
-          pcPluginLibraryFilename, pcError);
-      exit (1);
-    }
-  }
-
-  for (lPluginIndex = 0;; lPluginIndex++) {
-    psDescriptor = pfDescriptorFunction (lPluginIndex);
-    if (psDescriptor == NULL) {
-      fprintf (stderr,
-          "Unable to find label \"%s\" in plugin library file \"%s\".\n",
-          pcPluginLabel, pcPluginLibraryFilename);
-      exit (1);
-    }
-    if (strcmp (psDescriptor->Label, pcPluginLabel) == 0)
-      return psDescriptor;
-  }
-}
-
-/*****************************************************************************/
-
-/* EOF */
diff --git a/ext/ladspa/search.c b/ext/ladspa/search.c
deleted file mode 100644 (file)
index 0b93214..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-/* search.c
-
-   Free software by Richard W.E. Furse. Do with as you will. No
-   warranty. */
-
-/*****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <dirent.h>
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <glib.h>
-
-/*****************************************************************************/
-
-#include "ladspa.h"
-#include "utils.h"
-
-/*****************************************************************************/
-
-/* Search just the one directory. */
-static void
-    LADSPADirectoryPluginSearch
-    (const char *pcDirectory,
-    LADSPAPluginSearchCallbackFunction fCallbackFunction)
-{
-
-  char *pcFilename;
-  DIR *psDirectory;
-  LADSPA_Descriptor_Function fDescriptorFunction;
-  long lDirLength;
-  long iNeedSlash;
-  struct dirent *psDirectoryEntry;
-  void *pvPluginHandle;
-
-  lDirLength = strlen (pcDirectory);
-  if (!lDirLength)
-    return;
-  if (pcDirectory[lDirLength - 1] == '/')
-    iNeedSlash = 0;
-  else
-    iNeedSlash = 1;
-
-  psDirectory = opendir (pcDirectory);
-  if (!psDirectory)
-    return;
-
-  while (1) {
-
-    psDirectoryEntry = readdir (psDirectory);
-    if (!psDirectoryEntry) {
-      closedir (psDirectory);
-      return;
-    }
-
-    pcFilename = malloc (lDirLength + strlen (psDirectoryEntry->d_name)
-        + 1 + iNeedSlash);
-    strcpy (pcFilename, pcDirectory);
-    if (iNeedSlash)
-      strcat (pcFilename, "/");
-    strcat (pcFilename, psDirectoryEntry->d_name);
-
-    pvPluginHandle = dlopen (pcFilename, RTLD_LAZY);
-    if (pvPluginHandle) {
-      /* This is a file and the file is a shared library! */
-
-      dlerror ();
-      fDescriptorFunction
-          = (LADSPA_Descriptor_Function) dlsym (pvPluginHandle,
-          "ladspa_descriptor");
-      if (dlerror () == NULL && fDescriptorFunction) {
-        /* We've successfully found a ladspa_descriptor function. Pass
-           it to the callback function. */
-        fCallbackFunction (pcFilename, pvPluginHandle, fDescriptorFunction);
-      } else {
-        /* It was a library, but not a LADSPA one. Unload it. */
-        dlclose (pvPluginHandle);
-      }
-    }
-    free (pcFilename);
-  }
-}
-
-/*****************************************************************************/
-
-void
-LADSPAPluginSearch (LADSPAPluginSearchCallbackFunction fCallbackFunction)
-{
-
-  char *pcBuffer;
-  const char *pcEnd;
-  const char *pcLADSPAPath;
-  const char *pcStart;
-  char *search_path;
-
-  /* thomasvs: I'm sorry, but I'm going to add glib stuff here.
-   * I'm appending logical values for LADSPA_PATH here
-   */
-
-  search_path = getenv ("LADSPA_PATH");
-  if (search_path) {
-    pcLADSPAPath = g_strdup_printf ("%s:/usr/lib/ladspa:/usr/local/lib/ladspa",
-        search_path);
-  } else {
-    pcLADSPAPath = g_strdup ("/usr/lib/ladspa:/usr/local/lib/ladspa");
-  }
-
-  if (!pcLADSPAPath) {
-/*    fprintf(stderr, */
-/*          "Warning: You do not have a LADSPA_PATH " */
-/*          "environment variable set.\n"); */
-    return;
-  }
-
-  pcStart = pcLADSPAPath;
-  while (*pcStart != '\0') {
-    pcEnd = pcStart;
-    while (*pcEnd != ':' && *pcEnd != '\0')
-      pcEnd++;
-
-    pcBuffer = malloc (1 + pcEnd - pcStart);
-    if (pcEnd > pcStart)
-      strncpy (pcBuffer, pcStart, pcEnd - pcStart);
-    pcBuffer[pcEnd - pcStart] = '\0';
-
-    LADSPADirectoryPluginSearch (pcBuffer, fCallbackFunction);
-    free (pcBuffer);
-
-    pcStart = pcEnd;
-    if (*pcStart == ':')
-      pcStart++;
-  }
-  g_free ((gpointer) pcLADSPAPath);
-}
-
-/*****************************************************************************/
-
-/* EOF */
diff --git a/ext/ladspa/utils.h b/ext/ladspa/utils.h
deleted file mode 100644 (file)
index 5f6cc38..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/* utils.h
-
-   Free software by Richard W.E. Furse. Do with as you will. No
-   warranty. */
-
-#ifndef LADSPA_SDK_LOAD_PLUGIN_LIB
-#define LADSPA_SDK_LOAD_PLUGIN_LIB
-
-/*****************************************************************************/
-
-#include <ladspa.h>
-
-/*****************************************************************************/
-
-/* Functions in load.c: */
-
-/* This function call takes a plugin library filename, searches for
-   the library along the LADSPA_PATH, loads it with dlopen() and
-   returns a plugin handle for use with findPluginDescriptor() or
-   unloadLADSPAPluginLibrary(). Errors are handled by writing a
-   message to stderr and calling exit(1). It is alright (although
-   inefficient) to call this more than once for the same file. */
-void * loadLADSPAPluginLibrary(const char * pcPluginFilename);
-
-/* This function unloads a LADSPA plugin library. */
-void unloadLADSPAPluginLibrary(void * pvLADSPAPluginLibrary);
-
-/* This function locates a LADSPA plugin within a plugin library
-   loaded with loadLADSPAPluginLibrary(). Errors are handled by
-   writing a message to stderr and calling exit(1). Note that the
-   plugin library filename is only included to help provide
-   informative error messages. */
-const LADSPA_Descriptor *
-findLADSPAPluginDescriptor(void * pvLADSPAPluginLibrary,
-                           const char * pcPluginLibraryFilename,
-                           const char * pcPluginLabel);
-
-/*****************************************************************************/
-
-/* Functions in search.c: */
-
-/* Callback function for use with LADSPAPluginSearch(). The callback
-   function passes the filename (full path), a plugin handle (dlopen()
-   style) and a LADSPA_DescriptorFunction (from which
-   LADSPA_Descriptors can be acquired). */
-typedef void LADSPAPluginSearchCallbackFunction
-(const char * pcFullFilename, 
- void * pvPluginHandle,
- LADSPA_Descriptor_Function fDescriptorFunction);
-
-/* Search through the $(LADSPA_PATH) (or a default path) for any
-   LADSPA plugin libraries. Each plugin library is tested using
-   dlopen() and dlsym(,"ladspa_descriptor"). After loading each
-   library, the callback function is called to process it. This
-   function leaves items passed to the callback function open. */
-void LADSPAPluginSearch(LADSPAPluginSearchCallbackFunction fCallbackFunction);
-
-/*****************************************************************************/
-
-#endif
-
-/* EOF */