]> git.sesse.net Git - mlt/blobdiff - src/modules/jackrack/plugin_mgr.c
fix some LADSPA crashing on dlclose on some systems (3538363)
[mlt] / src / modules / jackrack / plugin_mgr.c
index 2bc97f94a860ddcea4aada20acd3b535d70bf175..a5842105c565dd6ab490e09e765703c5a79df8ea 100644 (file)
@@ -80,10 +80,10 @@ plugin_mgr_get_object_file_plugins (plugin_mgr_t * plugin_mgr, const char * file
   int err;
   
   /* open the object file */
-  dl_handle = dlopen (filename, RTLD_NOW|RTLD_GLOBAL);
+  dl_handle = dlopen (filename, RTLD_NOW);
   if (!dl_handle)
     {
-      mlt_log_warning( NULL, "%s: error opening shared object file '%s': %s\n",
+      mlt_log_info( NULL, "%s: error opening shared object file '%s': %s\n",
                __FUNCTION__, filename, dlerror());
       return;
     }
@@ -97,12 +97,19 @@ plugin_mgr_get_object_file_plugins (plugin_mgr_t * plugin_mgr, const char * file
   
   dlerr = dlerror();
   if (dlerr) {
-    mlt_log_warning( NULL, "%s: error finding ladspa_descriptor symbol in object file '%s': %s\n",
+    mlt_log_info( NULL, "%s: error finding ladspa_descriptor symbol in object file '%s': %s\n",
              __FUNCTION__, filename, dlerr);
     dlclose (dl_handle);
     return;
   }
   
+#ifdef __DARWIN__
+  if (!get_descriptor (0)) {
+    void (*constructor)(void) = dlsym (dl_handle, "_init");
+    if (constructor) constructor();
+  }
+#endif
+
   plugin_index = 0;
   while ( (descriptor = get_descriptor (plugin_index)) )
     {
@@ -212,16 +219,22 @@ plugin_mgr_get_path_plugins (plugin_mgr_t * plugin_mgr)
   char * ladspa_path, * dir;
   
   ladspa_path = g_strdup (getenv ("LADSPA_PATH"));
-  if (!ladspa_path)
 #ifdef WIN32
+  if (!ladspa_path)
+  {
+    ladspa_path = malloc (strlen (mlt_environment("MLT_APPDIR")) + strlen ("\\lib\\ladspa") + 1);
+    strcpy (ladspa_path, mlt_environment("MLT_APPDIR"));
+    strcat (ladspa_path, "\\lib\\ladspa");
+  }
+#elif defined(__DARWIN__) && defined(RELOCATABLE)
   {
-    ladspa_path = malloc (strlen (mlt_environment("MLT_DATA")) + strlen ("\\..\\..\\lib\\ladspa") + 1);
-    strcpy (ladspa_path, mlt_environment("MLT_DATA"));
-    strcat (ladspa_path, "\\..\\..\\lib\\ladspa");
-    printf("LADSPA_PATH=%s\n", ladspa_path);
+    ladspa_path = malloc( strlen (mlt_environment ("MLT_APPDIR")) + strlen ("/lib/ladspa") + 1 );
+    strcpy (ladspa_path,  mlt_environment ("MLT_APPDIR"));
+    strcat (ladspa_path, "/lib/ladspa" );
   }
 #else
-    ladspa_path = g_strdup ("lib/ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa:/usr/lib64/ladspa");
+  if (!ladspa_path)
+    ladspa_path = g_strdup ("/usr/local/lib/ladspa:/usr/lib/ladspa:/usr/lib64/ladspa");
 #endif
   
   dir = strtok (ladspa_path, ":");