|
@@ -90,7 +90,7 @@ using water::File; |
|
|
|
|
|
|
|
|
CARLA_BACKEND_USE_NAMESPACE |
|
|
CARLA_BACKEND_USE_NAMESPACE |
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
// Dummy values to test plugins with |
|
|
// Dummy values to test plugins with |
|
|
|
|
|
|
|
|
static constexpr const uint32_t kBufferSize = 512; |
|
|
static constexpr const uint32_t kBufferSize = 512; |
|
@@ -98,7 +98,8 @@ static constexpr const double kSampleRate = 44100.0; |
|
|
static constexpr const int32_t kSampleRatei = 44100; |
|
|
static constexpr const int32_t kSampleRatei = 44100; |
|
|
static constexpr const float kSampleRatef = 44100.0f; |
|
|
static constexpr const float kSampleRatef = 44100.0f; |
|
|
|
|
|
|
|
|
// ---------------------------- Dynamic discovery --------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
// Dynamic discovery |
|
|
|
|
|
|
|
|
class DiscoveryPipe : public CarlaPipeClient |
|
|
class DiscoveryPipe : public CarlaPipeClient |
|
|
{ |
|
|
{ |
|
@@ -136,7 +137,7 @@ protected: |
|
|
|
|
|
|
|
|
CarlaScopedPointer<DiscoveryPipe> gPipe; |
|
|
CarlaScopedPointer<DiscoveryPipe> gPipe; |
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
// Don't print ELF/EXE related errors since discovery can find multi-architecture binaries |
|
|
// Don't print ELF/EXE related errors since discovery can find multi-architecture binaries |
|
|
|
|
|
|
|
|
static void print_lib_error(const char* const filename) |
|
|
static void print_lib_error(const char* const filename) |
|
@@ -154,7 +155,8 @@ static void print_lib_error(const char* const filename) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// ------------------------------ Plugin Checks ----------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
// Plugin Checks |
|
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
#ifndef BUILD_BRIDGE |
|
|
static void print_cached_plugin(const CarlaCachedPluginInfo* const pinfo) |
|
|
static void print_cached_plugin(const CarlaCachedPluginInfo* const pinfo) |
|
@@ -220,7 +222,7 @@ static void do_cached_check(const PluginType type) |
|
|
CarlaJUCE::shutdownJuce_GUI(); |
|
|
CarlaJUCE::shutdownJuce_GUI(); |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif // ! BUILD_BRIDGE |
|
|
|
|
|
|
|
|
static void do_ladspa_check(lib_t& libHandle, const char* const filename, const bool doInit) |
|
|
static void do_ladspa_check(lib_t& libHandle, const char* const filename, const bool doInit) |
|
|
{ |
|
|
{ |
|
@@ -602,13 +604,13 @@ static void do_dssi_check(lib_t& libHandle, const char* const filename, const bo |
|
|
if (midiIns > 0 && audioIns == 0 && audioOuts > 0) |
|
|
if (midiIns > 0 && audioIns == 0 && audioOuts > 0) |
|
|
hints |= PLUGIN_IS_SYNTH; |
|
|
hints |= PLUGIN_IS_SYNTH; |
|
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
if (const char* const ui = find_dssi_ui(filename, ldescriptor->Label)) |
|
|
if (const char* const ui = find_dssi_ui(filename, ldescriptor->Label)) |
|
|
{ |
|
|
{ |
|
|
hints |= PLUGIN_HAS_CUSTOM_UI; |
|
|
hints |= PLUGIN_HAS_CUSTOM_UI; |
|
|
delete[] ui; |
|
|
delete[] ui; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
if (doInit) |
|
|
if (doInit) |
|
|
{ |
|
|
{ |
|
@@ -848,10 +850,10 @@ static void do_lv2_check(const char* const bundle, const bool doInit) |
|
|
print_cached_plugin(get_cached_plugin_lv2(lv2World, lilvPlugin)); |
|
|
print_cached_plugin(get_cached_plugin_lv2(lv2World, lilvPlugin)); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif // ! BUILD_BRIDGE |
|
|
|
|
|
|
|
|
#ifndef USING_JUCE_FOR_VST2 |
|
|
#ifndef USING_JUCE_FOR_VST2 |
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
// VST stuff |
|
|
// VST stuff |
|
|
|
|
|
|
|
|
// Check if plugin is currently processing |
|
|
// Check if plugin is currently processing |
|
@@ -1049,7 +1051,7 @@ static bool do_vst2_check(lib_t& libHandle, const char* const filename, const bo |
|
|
{ |
|
|
{ |
|
|
VST_Function vstFn = nullptr; |
|
|
VST_Function vstFn = nullptr; |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_MAC |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_MAC |
|
|
BundleLoader bundleLoader; |
|
|
BundleLoader bundleLoader; |
|
|
|
|
|
|
|
|
if (libHandle == nullptr) |
|
|
if (libHandle == nullptr) |
|
@@ -1076,7 +1078,7 @@ static bool do_vst2_check(lib_t& libHandle, const char* const filename, const bo |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
{ |
|
|
{ |
|
|
vstFn = lib_symbol<VST_Function>(libHandle, "VSTPluginMain"); |
|
|
vstFn = lib_symbol<VST_Function>(libHandle, "VSTPluginMain"); |
|
|
|
|
|
|
|
@@ -1520,14 +1522,14 @@ static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bo |
|
|
V3_EXITFN v3_exit = nullptr; |
|
|
V3_EXITFN v3_exit = nullptr; |
|
|
V3_GETFN v3_get = nullptr; |
|
|
V3_GETFN v3_get = nullptr; |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_MAC |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_MAC |
|
|
BundleLoader bundleLoader; |
|
|
BundleLoader bundleLoader; |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
// if passed filename is not a plugin binary directly, inspect bundle and find one |
|
|
// if passed filename is not a plugin binary directly, inspect bundle and find one |
|
|
if (libHandle == nullptr) |
|
|
if (libHandle == nullptr) |
|
|
{ |
|
|
{ |
|
|
#ifdef CARLA_OS_MAC |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_MAC |
|
|
if (! bundleLoader.load(filename)) |
|
|
if (! bundleLoader.load(filename)) |
|
|
{ |
|
|
{ |
|
|
#ifdef __aarch64__ |
|
|
#ifdef __aarch64__ |
|
@@ -1541,7 +1543,7 @@ static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bo |
|
|
v3_entry = bundleLoader.getSymbol<V3_ENTRYFN>(CFSTR(V3_ENTRYFNNAME)); |
|
|
v3_entry = bundleLoader.getSymbol<V3_ENTRYFN>(CFSTR(V3_ENTRYFNNAME)); |
|
|
v3_exit = bundleLoader.getSymbol<V3_EXITFN>(CFSTR(V3_EXITFNNAME)); |
|
|
v3_exit = bundleLoader.getSymbol<V3_EXITFN>(CFSTR(V3_EXITFNNAME)); |
|
|
v3_get = bundleLoader.getSymbol<V3_GETFN>(CFSTR(V3_GETFNNAME)); |
|
|
v3_get = bundleLoader.getSymbol<V3_GETFN>(CFSTR(V3_GETFNNAME)); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
water::String binaryfilename = filename; |
|
|
water::String binaryfilename = filename; |
|
|
|
|
|
|
|
|
if (!binaryfilename.endsWithChar(CARLA_OS_SEP)) |
|
|
if (!binaryfilename.endsWithChar(CARLA_OS_SEP)) |
|
@@ -1549,11 +1551,11 @@ static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bo |
|
|
|
|
|
|
|
|
binaryfilename += "Contents" CARLA_OS_SEP_STR V3_CONTENT_DIR CARLA_OS_SEP_STR; |
|
|
binaryfilename += "Contents" CARLA_OS_SEP_STR V3_CONTENT_DIR CARLA_OS_SEP_STR; |
|
|
binaryfilename += water::File(filename).getFileNameWithoutExtension(); |
|
|
binaryfilename += water::File(filename).getFileNameWithoutExtension(); |
|
|
# ifdef CARLA_OS_WIN |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
binaryfilename += ".vst3"; |
|
|
binaryfilename += ".vst3"; |
|
|
# else |
|
|
|
|
|
|
|
|
#else |
|
|
binaryfilename += ".so"; |
|
|
binaryfilename += ".so"; |
|
|
# endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
if (! water::File(binaryfilename).existsAsFile()) |
|
|
if (! water::File(binaryfilename).existsAsFile()) |
|
|
{ |
|
|
{ |
|
@@ -1568,14 +1570,14 @@ static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bo |
|
|
print_lib_error(filename); |
|
|
print_lib_error(filename); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#ifndef CARLA_OS_MAC |
|
|
|
|
|
|
|
|
#ifndef CARLA_OS_MAC |
|
|
v3_entry = lib_symbol<V3_ENTRYFN>(libHandle, V3_ENTRYFNNAME); |
|
|
v3_entry = lib_symbol<V3_ENTRYFN>(libHandle, V3_ENTRYFNNAME); |
|
|
v3_exit = lib_symbol<V3_EXITFN>(libHandle, V3_EXITFNNAME); |
|
|
v3_exit = lib_symbol<V3_EXITFN>(libHandle, V3_EXITFNNAME); |
|
|
v3_get = lib_symbol<V3_GETFN>(libHandle, V3_GETFNNAME); |
|
|
v3_get = lib_symbol<V3_GETFN>(libHandle, V3_GETFNNAME); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
// ensure entry and exit points are available |
|
|
// ensure entry and exit points are available |
|
|
if (v3_entry == nullptr || v3_exit == nullptr || v3_get == nullptr) |
|
|
if (v3_entry == nullptr || v3_exit == nullptr || v3_get == nullptr) |
|
@@ -1585,13 +1587,13 @@ static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bo |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// call entry point |
|
|
// call entry point |
|
|
#if defined(CARLA_OS_MAC) |
|
|
|
|
|
|
|
|
#if defined(CARLA_OS_MAC) |
|
|
v3_entry(bundleLoader.getRef()); |
|
|
v3_entry(bundleLoader.getRef()); |
|
|
#elif defined(CARLA_OS_WIN) |
|
|
|
|
|
|
|
|
#elif defined(CARLA_OS_WIN) |
|
|
v3_entry(); |
|
|
v3_entry(); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
v3_entry(libHandle); |
|
|
v3_entry(libHandle); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
carla_v3_host_application hostApplication; |
|
|
carla_v3_host_application hostApplication; |
|
|
carla_v3_host_application* hostApplicationPtr = &hostApplication; |
|
|
carla_v3_host_application* hostApplicationPtr = &hostApplication; |
|
@@ -2181,7 +2183,7 @@ static bool do_clap_check(lib_t& libHandle, const char* const filename, const bo |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#ifdef USING_JUCE |
|
|
#ifdef USING_JUCE |
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
// find all available plugin audio ports |
|
|
// find all available plugin audio ports |
|
|
|
|
|
|
|
|
static void findMaxTotalChannels(juce::AudioProcessor* const filter, int& maxTotalIns, int& maxTotalOuts) |
|
|
static void findMaxTotalChannels(juce::AudioProcessor* const filter, int& maxTotalIns, int& maxTotalOuts) |
|
@@ -2208,7 +2210,7 @@ static void findMaxTotalChannels(juce::AudioProcessor* const filter, int& maxTot |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
static bool do_juce_check(const char* const filename_, const char* const stype, const bool doInit) |
|
|
static bool do_juce_check(const char* const filename_, const char* const stype, const bool doInit) |
|
|
{ |
|
|
{ |
|
@@ -2219,7 +2221,7 @@ static bool do_juce_check(const char* const filename_, const char* const stype, |
|
|
|
|
|
|
|
|
juce::String filename; |
|
|
juce::String filename; |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
// Fix for wine usage |
|
|
// Fix for wine usage |
|
|
if (juce::File("Z:\\usr\\").isDirectory() && filename_[0] == '/') |
|
|
if (juce::File("Z:\\usr\\").isDirectory() && filename_[0] == '/') |
|
|
{ |
|
|
{ |
|
@@ -2228,37 +2230,39 @@ static bool do_juce_check(const char* const filename_, const char* const stype, |
|
|
filename = "Z:" + filename; |
|
|
filename = "Z:" + filename; |
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
#endif |
|
|
|
|
|
filename = juce::File(filename_).getFullPathName(); |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
{ |
|
|
|
|
|
filename = juce::File(filename_).getFullPathName(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
CarlaScopedPointer<juce::AudioPluginFormat> pluginFormat; |
|
|
CarlaScopedPointer<juce::AudioPluginFormat> pluginFormat; |
|
|
|
|
|
|
|
|
/* */ if (std::strcmp(stype, "VST2") == 0) |
|
|
/* */ if (std::strcmp(stype, "VST2") == 0) |
|
|
{ |
|
|
{ |
|
|
#if JUCE_PLUGINHOST_VST |
|
|
|
|
|
|
|
|
#if JUCE_PLUGINHOST_VST |
|
|
pluginFormat = new juce::VSTPluginFormat(); |
|
|
pluginFormat = new juce::VSTPluginFormat(); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
DISCOVERY_OUT("error", "VST2 support not available"); |
|
|
DISCOVERY_OUT("error", "VST2 support not available"); |
|
|
return false; |
|
|
return false; |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
} |
|
|
} |
|
|
else if (std::strcmp(stype, "VST3") == 0) |
|
|
else if (std::strcmp(stype, "VST3") == 0) |
|
|
{ |
|
|
{ |
|
|
#if JUCE_PLUGINHOST_VST3 |
|
|
|
|
|
|
|
|
#if JUCE_PLUGINHOST_VST3 |
|
|
pluginFormat = new juce::VST3PluginFormat(); |
|
|
pluginFormat = new juce::VST3PluginFormat(); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
DISCOVERY_OUT("error", "VST3 support not available"); |
|
|
DISCOVERY_OUT("error", "VST3 support not available"); |
|
|
return false; |
|
|
return false; |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
} |
|
|
} |
|
|
else if (std::strcmp(stype, "AU") == 0) |
|
|
else if (std::strcmp(stype, "AU") == 0) |
|
|
{ |
|
|
{ |
|
|
#if JUCE_PLUGINHOST_AU |
|
|
|
|
|
|
|
|
#if JUCE_PLUGINHOST_AU |
|
|
pluginFormat = new juce::AudioUnitPluginFormat(); |
|
|
pluginFormat = new juce::AudioUnitPluginFormat(); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
DISCOVERY_OUT("error", "AU support not available"); |
|
|
DISCOVERY_OUT("error", "AU support not available"); |
|
|
return false; |
|
|
return false; |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (pluginFormat == nullptr) |
|
|
if (pluginFormat == nullptr) |
|
@@ -2267,9 +2271,9 @@ static bool do_juce_check(const char* const filename_, const char* const stype, |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
CARLA_CUSTOM_SAFE_ASSERT_RETURN("Plugin file/folder does not exist", juce::File(filename).exists(), false); |
|
|
CARLA_CUSTOM_SAFE_ASSERT_RETURN("Plugin file/folder does not exist", juce::File(filename).exists(), false); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
CARLA_SAFE_ASSERT_RETURN(pluginFormat->fileMightContainThisPluginType(filename), false); |
|
|
CARLA_SAFE_ASSERT_RETURN(pluginFormat->fileMightContainThisPluginType(filename), false); |
|
|
|
|
|
|
|
|
juce::OwnedArray<juce::PluginDescription> results; |
|
|
juce::OwnedArray<juce::PluginDescription> results; |
|
@@ -2345,9 +2349,9 @@ static bool do_juce_check(const char* const filename_, const char* const stype, |
|
|
} |
|
|
} |
|
|
#endif // USING_JUCE_FOR_VST2 |
|
|
#endif // USING_JUCE_FOR_VST2 |
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_FLUIDSYNTH |
|
|
static void do_fluidsynth_check(const char* const filename, const PluginType type, const bool doInit) |
|
|
static void do_fluidsynth_check(const char* const filename, const PluginType type, const bool doInit) |
|
|
{ |
|
|
{ |
|
|
#ifdef HAVE_FLUIDSYNTH |
|
|
|
|
|
const water::File file(filename); |
|
|
const water::File file(filename); |
|
|
|
|
|
|
|
|
if (! file.existsAsFile()) |
|
|
if (! file.existsAsFile()) |
|
@@ -2380,25 +2384,25 @@ static void do_fluidsynth_check(const char* const filename, const PluginType typ |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#if FLUIDSYNTH_VERSION_MAJOR >= 2 |
|
|
|
|
|
|
|
|
#if FLUIDSYNTH_VERSION_MAJOR >= 2 |
|
|
const int f_id = f_id_test; |
|
|
const int f_id = f_id_test; |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
const uint f_id = static_cast<uint>(f_id_test); |
|
|
const uint f_id = static_cast<uint>(f_id_test); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
if (fluid_sfont_t* const f_sfont = fluid_synth_get_sfont_by_id(f_synth, f_id)) |
|
|
if (fluid_sfont_t* const f_sfont = fluid_synth_get_sfont_by_id(f_synth, f_id)) |
|
|
{ |
|
|
{ |
|
|
#if FLUIDSYNTH_VERSION_MAJOR >= 2 |
|
|
|
|
|
|
|
|
#if FLUIDSYNTH_VERSION_MAJOR >= 2 |
|
|
fluid_sfont_iteration_start(f_sfont); |
|
|
fluid_sfont_iteration_start(f_sfont); |
|
|
for (; fluid_sfont_iteration_next(f_sfont);) |
|
|
for (; fluid_sfont_iteration_next(f_sfont);) |
|
|
++programs; |
|
|
++programs; |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
fluid_preset_t f_preset; |
|
|
fluid_preset_t f_preset; |
|
|
|
|
|
|
|
|
f_sfont->iteration_start(f_sfont); |
|
|
f_sfont->iteration_start(f_sfont); |
|
|
for (; f_sfont->iteration_next(f_sfont, &f_preset);) |
|
|
for (; f_sfont->iteration_next(f_sfont, &f_preset);) |
|
|
++programs; |
|
|
++programs; |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
delete_fluid_synth(f_synth); |
|
|
delete_fluid_synth(f_synth); |
|
@@ -2438,22 +2442,14 @@ static void do_fluidsynth_check(const char* const filename, const PluginType typ |
|
|
DISCOVERY_OUT("parameters.ins", 13); // defined in Carla |
|
|
DISCOVERY_OUT("parameters.ins", 13); // defined in Carla |
|
|
DISCOVERY_OUT("parameters.outs", 1); |
|
|
DISCOVERY_OUT("parameters.outs", 1); |
|
|
DISCOVERY_OUT("end", "------------"); |
|
|
DISCOVERY_OUT("end", "------------"); |
|
|
#else // HAVE_FLUIDSYNTH |
|
|
|
|
|
DISCOVERY_OUT("error", "SF2 support not available"); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
// unused |
|
|
|
|
|
(void)filename; |
|
|
|
|
|
(void)type; |
|
|
|
|
|
(void)doInit; |
|
|
|
|
|
#endif |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
#endif // HAVE_FLUIDSYNTH |
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_YSFX |
|
|
static void do_jsfx_check(const char* const filename, bool doInit) |
|
|
static void do_jsfx_check(const char* const filename, bool doInit) |
|
|
{ |
|
|
{ |
|
|
#ifdef HAVE_YSFX |
|
|
|
|
|
const water::File file(filename); |
|
|
const water::File file(filename); |
|
|
|
|
|
|
|
|
ysfx_config_u config(ysfx_config_new()); |
|
|
ysfx_config_u config(ysfx_config_new()); |
|
@@ -2507,17 +2503,11 @@ static void do_jsfx_check(const char* const filename, bool doInit) |
|
|
DISCOVERY_OUT("midi.outs", midiOuts); |
|
|
DISCOVERY_OUT("midi.outs", midiOuts); |
|
|
DISCOVERY_OUT("parameters.ins", parameters); |
|
|
DISCOVERY_OUT("parameters.ins", parameters); |
|
|
DISCOVERY_OUT("end", "------------"); |
|
|
DISCOVERY_OUT("end", "------------"); |
|
|
#else // HAVE_YSFX |
|
|
|
|
|
DISCOVERY_OUT("error", "JSFX support not available"); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
// unused |
|
|
|
|
|
(void)filename; |
|
|
|
|
|
(void)doInit; |
|
|
|
|
|
#endif |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
#endif // HAVE_YSFX |
|
|
|
|
|
|
|
|
// ------------------------------ main entry point ------------------------------ |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
// main entry point |
|
|
|
|
|
|
|
|
int main(int argc, const char* argv[]) |
|
|
int main(int argc, const char* argv[]) |
|
|
{ |
|
|
{ |
|
@@ -2580,26 +2570,26 @@ int main(int argc, const char* argv[]) |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------------- |
|
|
// Initialize OS features |
|
|
// Initialize OS features |
|
|
|
|
|
|
|
|
// we want stuff in English so we can parse error messages |
|
|
// we want stuff in English so we can parse error messages |
|
|
::setlocale(LC_ALL, "C"); |
|
|
::setlocale(LC_ALL, "C"); |
|
|
#ifndef CARLA_OS_WIN |
|
|
|
|
|
|
|
|
#ifndef CARLA_OS_WIN |
|
|
carla_setenv("LC_ALL", "C"); |
|
|
carla_setenv("LC_ALL", "C"); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
OleInitialize(nullptr); |
|
|
OleInitialize(nullptr); |
|
|
CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); |
|
|
CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); |
|
|
# ifndef __WINPTHREADS_VERSION |
|
|
|
|
|
|
|
|
#ifndef __WINPTHREADS_VERSION |
|
|
// (non-portable) initialization of statically linked pthread library |
|
|
// (non-portable) initialization of statically linked pthread library |
|
|
pthread_win32_process_attach_np(); |
|
|
pthread_win32_process_attach_np(); |
|
|
pthread_win32_thread_attach_np(); |
|
|
pthread_win32_thread_attach_np(); |
|
|
# endif |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------------- |
|
|
// Initialize pipe |
|
|
// Initialize pipe |
|
|
|
|
|
|
|
|
if (argc == 7) |
|
|
if (argc == 7) |
|
@@ -2610,7 +2600,7 @@ int main(int argc, const char* argv[]) |
|
|
return 1; |
|
|
return 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
if (openLib) |
|
|
if (openLib) |
|
|
{ |
|
|
{ |
|
@@ -2629,7 +2619,7 @@ int main(int argc, const 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 && openLib && handle != nullptr) |
|
|
if (doInit && openLib && handle != nullptr) |
|
|
{ |
|
|
{ |
|
@@ -2649,15 +2639,15 @@ int main(int argc, const char* argv[]) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
if (std::strcmp(filename, ":all") == 0) |
|
|
if (std::strcmp(filename, ":all") == 0) |
|
|
{ |
|
|
{ |
|
|
do_cached_check(type); |
|
|
do_cached_check(type); |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_MAC |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_MAC |
|
|
// Plugin might be in quarentine due to Apple stupid notarization rules, let's remove that if possible |
|
|
// Plugin might be in quarentine due to Apple stupid notarization rules, let's remove that if possible |
|
|
switch (type) |
|
|
switch (type) |
|
|
{ |
|
|
{ |
|
@@ -2671,7 +2661,7 @@ int main(int argc, const char* argv[]) |
|
|
default: |
|
|
default: |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
// some macOS plugins have not been yet ported to arm64, re-run them in x86_64 mode if discovery fails |
|
|
// some macOS plugins have not been yet ported to arm64, re-run them in x86_64 mode if discovery fails |
|
|
bool retryAsX64lugin = false; |
|
|
bool retryAsX64lugin = false; |
|
@@ -2686,41 +2676,43 @@ int main(int argc, const char* argv[]) |
|
|
do_dssi_check(handle, filename, doInit); |
|
|
do_dssi_check(handle, filename, doInit); |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
case PLUGIN_LV2: |
|
|
case PLUGIN_LV2: |
|
|
do_lv2_check(filename, doInit); |
|
|
do_lv2_check(filename, doInit); |
|
|
break; |
|
|
break; |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
case PLUGIN_VST2: |
|
|
case PLUGIN_VST2: |
|
|
#if defined(USING_JUCE) && JUCE_PLUGINHOST_VST |
|
|
|
|
|
|
|
|
#if defined(USING_JUCE) && JUCE_PLUGINHOST_VST |
|
|
retryAsX64lugin = do_juce_check(filename, "VST2", doInit); |
|
|
retryAsX64lugin = do_juce_check(filename, "VST2", doInit); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
retryAsX64lugin = do_vst2_check(handle, filename, doInit); |
|
|
retryAsX64lugin = do_vst2_check(handle, filename, doInit); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
case PLUGIN_VST3: |
|
|
case PLUGIN_VST3: |
|
|
#if defined(USING_JUCE) && JUCE_PLUGINHOST_VST3 |
|
|
|
|
|
|
|
|
#if defined(USING_JUCE) && JUCE_PLUGINHOST_VST3 |
|
|
retryAsX64lugin = do_juce_check(filename, "VST3", doInit); |
|
|
retryAsX64lugin = do_juce_check(filename, "VST3", doInit); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
retryAsX64lugin = do_vst3_check(handle, filename, doInit); |
|
|
retryAsX64lugin = do_vst3_check(handle, filename, doInit); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
case PLUGIN_AU: |
|
|
case PLUGIN_AU: |
|
|
#if defined(USING_JUCE) && JUCE_PLUGINHOST_AU |
|
|
|
|
|
|
|
|
#if defined(USING_JUCE) && JUCE_PLUGINHOST_AU |
|
|
do_juce_check(filename, "AU", doInit); |
|
|
do_juce_check(filename, "AU", doInit); |
|
|
#else |
|
|
|
|
|
|
|
|
#else |
|
|
DISCOVERY_OUT("error", "AU support not available"); |
|
|
DISCOVERY_OUT("error", "AU support not available"); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
#ifndef BUILD_BRIDGE |
|
|
|
|
|
case PLUGIN_JSFX: |
|
|
case PLUGIN_JSFX: |
|
|
|
|
|
#ifdef HAVE_YSFX |
|
|
do_jsfx_check(filename, doInit); |
|
|
do_jsfx_check(filename, doInit); |
|
|
|
|
|
#else |
|
|
|
|
|
DISCOVERY_OUT("error", "JSFX support not available"); |
|
|
|
|
|
#endif |
|
|
break; |
|
|
break; |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
case PLUGIN_CLAP: |
|
|
case PLUGIN_CLAP: |
|
|
retryAsX64lugin = do_clap_check(handle, filename, doInit); |
|
|
retryAsX64lugin = do_clap_check(handle, filename, doInit); |
|
@@ -2729,7 +2721,11 @@ int main(int argc, const char* argv[]) |
|
|
case PLUGIN_DLS: |
|
|
case PLUGIN_DLS: |
|
|
case PLUGIN_GIG: |
|
|
case PLUGIN_GIG: |
|
|
case PLUGIN_SF2: |
|
|
case PLUGIN_SF2: |
|
|
|
|
|
#ifdef HAVE_FLUIDSYNTH |
|
|
do_fluidsynth_check(filename, type, doInit); |
|
|
do_fluidsynth_check(filename, type, doInit); |
|
|
|
|
|
#else |
|
|
|
|
|
DISCOVERY_OUT("error", "SF2 support not available"); |
|
|
|
|
|
#endif |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
default: |
|
|
default: |
|
@@ -2763,18 +2759,18 @@ int main(int argc, const char* argv[]) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
|
|
|
#ifndef __WINPTHREADS_VERSION |
|
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
|
|
|
#ifndef __WINPTHREADS_VERSION |
|
|
pthread_win32_thread_detach_np(); |
|
|
pthread_win32_thread_detach_np(); |
|
|
pthread_win32_process_detach_np(); |
|
|
pthread_win32_process_detach_np(); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
CoUninitialize(); |
|
|
CoUninitialize(); |
|
|
OleUninitialize(); |
|
|
OleUninitialize(); |
|
|
#endif |
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------- |