Browse Source

Cleanup

Signed-off-by: falkTX <falktx@falktx.com>
pull/1775/head
falkTX 1 year ago
parent
commit
b5e9b3c1c9
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
1 changed files with 97 additions and 101 deletions
  1. +97
    -101
      source/discovery/carla-discovery.cpp

+ 97
- 101
source/discovery/carla-discovery.cpp View File

@@ -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;
} }


// -------------------------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------------------------

Loading…
Cancel
Save