Browse Source

discovery: implement osx vst bundles

tags/1.9.8
falkTX 7 years ago
parent
commit
28f32782e8
2 changed files with 88 additions and 25 deletions
  1. +1
    -1
      source/carla_database.py
  2. +87
    -24
      source/discovery/carla-discovery.cpp

+ 1
- 1
source/carla_database.py View File

@@ -739,7 +739,7 @@ class SearchPluginsThread(QThread):


for iPATH in VST2_PATH: for iPATH in VST2_PATH:
if MACOS and not isWine: if MACOS and not isWine:
binaries = findMacVSTBundles(iPATH, False)
binaries = findMacVSTBundles(iPATH)
else: else:
binaries = findBinaries(iPATH, OS) binaries = findBinaries(iPATH, OS)
for binary in binaries: for binary in binaries:


+ 87
- 24
source/discovery/carla-discovery.cpp View File

@@ -37,6 +37,10 @@
# include "CarlaUtils.cpp" # include "CarlaUtils.cpp"
#endif #endif


#ifdef CARLA_OS_MAC
# import <Foundation/Foundation.h>
#endif

#ifdef HAVE_FLUIDSYNTH #ifdef HAVE_FLUIDSYNTH
# include <fluidsynth.h> # include <fluidsynth.h>
#endif #endif
@@ -1165,19 +1169,60 @@ static void do_lv2_check(const char* const bundle, const bool doInit)
} }
} }


static void do_vst_check(lib_t& libHandle, const bool doInit)
static void do_vst_check(lib_t& libHandle, const char* const filename, const bool doInit)
{ {
VST_Function vstFn = lib_symbol<VST_Function>(libHandle, "VSTPluginMain");
VST_Function vstFn = nullptr;


if (vstFn == nullptr)
#ifdef CARLA_OS_MAC
CFBundleRef bundleRef = nullptr;
CFBundleRefNum resFileId;

if (libHandle == nullptr)
{ {
vstFn = lib_symbol<VST_Function>(libHandle, "main");
const CFURLRef urlRef = CFURLCreateFromFileSystemRepresentation(0, (const UInt8*)filename, (CFIndex)strlen(filename), true);
CARLA_SAFE_ASSERT_RETURN(urlRef != nullptr,);

bundleRef = CFBundleCreate(kCFAllocatorDefault, urlRef);
CFRelease(urlRef);
CARLA_SAFE_ASSERT_RETURN(bundleRef != nullptr,);

if (! CFBundleLoadExecutable(bundleRef))
{
CFRelease(bundleRef);
DISCOVERY_OUT("error", "Failed to load VST bundle executable");
return;
}

vstFn = (VST_Function)CFBundleGetFunctionPointerForName(bundleRef, CFSTR("main_macho"));

if (vstFn == nullptr)
vstFn = (VST_Function)CFBundleGetFunctionPointerForName(bundleRef, CFSTR("VSTPluginMain"));


if (vstFn == nullptr) if (vstFn == nullptr)
{ {
CFBundleUnloadExecutable(bundleRef);
CFRelease(bundleRef);
DISCOVERY_OUT("error", "Not a VST plugin"); DISCOVERY_OUT("error", "Not a VST plugin");
return; return;
} }

resFileId = CFBundleOpenBundleResourceMap(bundleRef);
}
else
#endif
{
vstFn = lib_symbol<VST_Function>(libHandle, "VSTPluginMain");

if (vstFn == nullptr)
{
vstFn = lib_symbol<VST_Function>(libHandle, "main");

if (vstFn == nullptr)
{
DISCOVERY_OUT("error", "Not a VST plugin");
return;
}
}
} }


AEffect* effect = vstFn(vstHostCallback); AEffect* effect = vstFn(vstHostCallback);
@@ -1423,13 +1468,27 @@ static void do_vst_check(lib_t& libHandle, const bool doInit)


uniqueIds.clear(); uniqueIds.clear();


if (effect == nullptr)
return;
if (effect != nullptr)
{
if (gVstNeedsIdle)
effect->dispatcher(effect, DECLARE_VST_DEPRECATED(effIdle), 0, 0, nullptr, 0.0f);


if (gVstNeedsIdle)
effect->dispatcher(effect, DECLARE_VST_DEPRECATED(effIdle), 0, 0, nullptr, 0.0f);
effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f);
}

#ifdef CARLA_OS_MAC
if (bundleRef != nullptr)
{
CFBundleCloseBundleResourceMap(bundleRef, resFileId);
CFBundleUnloadExecutable(bundleRef);
CFRelease(bundleRef);
}
#else
return;


effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f);
// unused
(void)filename;
#endif
} }


static void do_fluidsynth_check(const char* const filename, const bool doInit) static void do_fluidsynth_check(const char* const filename, const bool doInit)
@@ -1565,6 +1624,19 @@ int main(int argc, char* argv[])
CarlaString filenameCheck(filename); CarlaString filenameCheck(filename);
filenameCheck.toLower(); filenameCheck.toLower();


bool openLib = false;
lib_t handle = nullptr;

switch (type)
{
case PLUGIN_LADSPA:
case PLUGIN_DSSI:
case PLUGIN_VST2:
openLib = true;
default:
break;
}

if (type != PLUGIN_GIG && type != PLUGIN_SF2 && type != PLUGIN_SFZ) if (type != PLUGIN_GIG && type != PLUGIN_SF2 && type != PLUGIN_SFZ)
{ {
if (filenameCheck.contains("fluidsynth", true)) if (filenameCheck.contains("fluidsynth", true))
@@ -1577,19 +1649,10 @@ int main(int argc, char* argv[])
DISCOVERY_OUT("info", "skipping linuxsampler based plugin"); DISCOVERY_OUT("info", "skipping linuxsampler based plugin");
return 0; return 0;
} }
}

bool openLib = false;
lib_t handle = nullptr;

switch (type)
{
case PLUGIN_LADSPA:
case PLUGIN_DSSI:
case PLUGIN_VST2:
openLib = true;
default:
break;
#ifdef CARLA_OS_MAC
if (type == PLUGIN_VST2 && filenameCheck.endsWith(".vst"))
openLib = false;
#endif
} }


if (openLib) if (openLib)
@@ -1609,7 +1672,7 @@ int main(int argc, char* argv[])
if (doInit && getenv("CARLA_DISCOVERY_NO_PROCESSING_CHECKS") != nullptr) if (doInit && getenv("CARLA_DISCOVERY_NO_PROCESSING_CHECKS") != nullptr)
doInit = false; doInit = false;


if (doInit && handle != nullptr)
if (doInit && openLib && handle != nullptr)
{ {
// test fast loading & unloading DLL without initializing the plugin(s) // test fast loading & unloading DLL without initializing the plugin(s)
if (! lib_close(handle)) if (! lib_close(handle))
@@ -1647,7 +1710,7 @@ int main(int argc, char* argv[])
do_lv2_check(filename, doInit); do_lv2_check(filename, doInit);
break; break;
case PLUGIN_VST2: case PLUGIN_VST2:
do_vst_check(handle, doInit);
do_vst_check(handle, filename, doInit);
break; break;
case PLUGIN_GIG: case PLUGIN_GIG:
do_linuxsampler_check(filename, "gig", doInit); do_linuxsampler_check(filename, "gig", doInit);


Loading…
Cancel
Save