diff --git a/source/discovery/carla-discovery.cpp b/source/discovery/carla-discovery.cpp index 53ed9eb1d..a17a8f242 100644 --- a/source/discovery/carla-discovery.cpp +++ b/source/discovery/carla-discovery.cpp @@ -301,7 +301,6 @@ static void do_ladspa_check(lib_t& libHandle, const char* const filename, const uint hints = 0x0; uint audioIns = 0; uint audioOuts = 0; - uint audioTotal = 0; uint parametersIns = 0; uint parametersOuts = 0; uint parametersTotal = 0; @@ -320,8 +319,6 @@ static void do_ladspa_check(lib_t& libHandle, const char* const filename, const audioIns += 1; else if (LADSPA_IS_PORT_OUTPUT(portDescriptor)) audioOuts += 1; - - audioTotal += 1; } else if (LADSPA_IS_PORT_CONTROL(portDescriptor)) { @@ -565,7 +562,6 @@ static void do_dssi_check(lib_t& libHandle, const char* const filename, const bo uint hints = 0x0; uint audioIns = 0; uint audioOuts = 0; - uint audioTotal = 0; uint midiIns = 0; uint parametersIns = 0; uint parametersOuts = 0; @@ -585,8 +581,6 @@ static void do_dssi_check(lib_t& libHandle, const char* const filename, const bo audioIns += 1; else if (LADSPA_IS_PORT_OUTPUT(portDescriptor)) audioOuts += 1; - - audioTotal += 1; } else if (LADSPA_IS_PORT_CONTROL(portDescriptor)) { @@ -1051,7 +1045,7 @@ static intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t return ret; } -static void do_vst2_check(lib_t& libHandle, const char* const filename, const bool doInit) +static bool do_vst2_check(lib_t& libHandle, const char* const filename, const bool doInit) { VST_Function vstFn = nullptr; @@ -1062,8 +1056,12 @@ static void do_vst2_check(lib_t& libHandle, const char* const filename, const bo { if (! bundleLoader.load(filename)) { + #ifdef __aarch64__ + return true; + #else DISCOVERY_OUT("error", "Failed to load VST2 bundle executable"); - return; + return false; + #endif } vstFn = bundleLoader.getSymbol(CFSTR("main_macho")); @@ -1074,7 +1072,7 @@ static void do_vst2_check(lib_t& libHandle, const char* const filename, const bo if (vstFn == nullptr) { DISCOVERY_OUT("error", "Not a VST2 plugin"); - return; + return false; } } else @@ -1089,7 +1087,7 @@ static void do_vst2_check(lib_t& libHandle, const char* const filename, const bo if (vstFn == nullptr) { DISCOVERY_OUT("error", "Not a VST plugin"); - return; + return false; } } } @@ -1099,7 +1097,7 @@ static void do_vst2_check(lib_t& libHandle, const char* const filename, const bo if (effect == nullptr || effect->magic != kEffectMagic) { DISCOVERY_OUT("error", "Failed to init VST plugin, or VST magic failed"); - return; + return false; } if (effect->uniqueID == 0) @@ -1124,7 +1122,7 @@ static void do_vst2_check(lib_t& libHandle, const char* const filename, const bo { DISCOVERY_OUT("error", "Plugin doesn't have an Unique ID after being open"); effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f); - return; + return false; } gVstCurrentUniqueId = effect->uniqueID; @@ -1403,9 +1401,9 @@ static void do_vst2_check(lib_t& libHandle, const char* const filename, const bo effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f); } -#ifndef CARLA_OS_MAC - return; + return false; +#ifndef CARLA_OS_MAC // unused (void)filename; #endif @@ -1510,7 +1508,13 @@ struct carla_v3_event_list : v3_event_list_cpp { static v3_result V3_API carla_add_event(void*, v3_event*) { return V3_NOT_IMPLEMENTED; } }; -static void do_vst3_check(lib_t& libHandle, const char* const filename, const bool doInit) +static bool v3_exit_false(const V3_EXITFN v3_exit) +{ + v3_exit(); + return false; +} + +static bool do_vst3_check(lib_t& libHandle, const char* const filename, const bool doInit) { V3_ENTRYFN v3_entry = nullptr; V3_EXITFN v3_exit = nullptr; @@ -1526,8 +1530,12 @@ static void do_vst3_check(lib_t& libHandle, const char* const filename, const bo #ifdef CARLA_OS_MAC if (! bundleLoader.load(filename)) { + #ifdef __aarch64__ + return true; + #else DISCOVERY_OUT("error", "Failed to load VST3 bundle executable"); - return; + return false; + #endif } v3_entry = bundleLoader.getSymbol(CFSTR(V3_ENTRYFNNAME)); @@ -1550,7 +1558,7 @@ static void do_vst3_check(lib_t& libHandle, const char* const filename, const bo if (! water::File(binaryfilename).existsAsFile()) { DISCOVERY_OUT("error", "Failed to find a suitable VST3 bundle binary"); - return; + return false; } libHandle = lib_open(binaryfilename.toRawUTF8()); @@ -1558,7 +1566,7 @@ static void do_vst3_check(lib_t& libHandle, const char* const filename, const bo if (libHandle == nullptr) { print_lib_error(filename); - return; + return false; } #endif } @@ -1573,7 +1581,7 @@ static void do_vst3_check(lib_t& libHandle, const char* const filename, const bo if (v3_entry == nullptr || v3_exit == nullptr || v3_get == nullptr) { DISCOVERY_OUT("error", "Not a VST3 plugin"); - return; + return false; } // call entry point @@ -1591,21 +1599,21 @@ static void do_vst3_check(lib_t& libHandle, const char* const filename, const bo // fetch initial factory v3_plugin_factory** factory1 = v3_get(); - CARLA_SAFE_ASSERT_RETURN(factory1 != nullptr, v3_exit()); + CARLA_SAFE_ASSERT_RETURN(factory1 != nullptr, v3_exit_false(v3_exit)); // get factory info v3_factory_info factoryInfo = {}; - CARLA_SAFE_ASSERT_RETURN(v3_cpp_obj(factory1)->get_factory_info(factory1, &factoryInfo) == V3_OK, v3_exit()); + CARLA_SAFE_ASSERT_RETURN(v3_cpp_obj(factory1)->get_factory_info(factory1, &factoryInfo) == V3_OK, v3_exit_false(v3_exit)); // get num classes const int32_t numClasses = v3_cpp_obj(factory1)->num_classes(factory1); - CARLA_SAFE_ASSERT_RETURN(numClasses > 0, v3_exit()); + CARLA_SAFE_ASSERT_RETURN(numClasses > 0, v3_exit_false(v3_exit)); // query 2nd factory v3_plugin_factory_2** factory2 = nullptr; if (v3_cpp_obj_query_interface(factory1, v3_plugin_factory_2_iid, &factory2) == V3_OK) { - CARLA_SAFE_ASSERT_RETURN(factory2 != nullptr, v3_exit()); + CARLA_SAFE_ASSERT_RETURN(factory2 != nullptr, v3_exit_false(v3_exit)); } else { @@ -1617,7 +1625,7 @@ static void do_vst3_check(lib_t& libHandle, const char* const filename, const bo v3_plugin_factory_3** factory3 = nullptr; if (factory2 != nullptr && v3_cpp_obj_query_interface(factory2, v3_plugin_factory_3_iid, &factory3) == V3_OK) { - CARLA_SAFE_ASSERT_RETURN(factory3 != nullptr, v3_exit()); + CARLA_SAFE_ASSERT_RETURN(factory3 != nullptr, v3_exit_false(v3_exit)); } else { @@ -1910,6 +1918,7 @@ static void do_vst3_check(lib_t& libHandle, const char* const filename, const bo v3_cpp_obj_unref(factory1); v3_exit(); + return false; } #endif // ! USING_JUCE_FOR_VST3 @@ -1950,7 +1959,13 @@ struct carla_clap_host : clap_host_t { } }; -static void do_clap_check(lib_t& libHandle, const char* const filename, const bool doInit) +static bool clap_deinit_false(const clap_plugin_entry_t* const entry) +{ + entry->deinit(); + return false; +} + +static bool do_clap_check(lib_t& libHandle, const char* const filename, const bool doInit) { const clap_plugin_entry_t* entry = nullptr; @@ -1962,8 +1977,12 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo { if (! bundleLoader.load(filename)) { + #ifdef __aarch64__ + return true; + #else DISCOVERY_OUT("error", "Failed to load CLAP bundle executable"); - return; + return false; + #endif } entry = bundleLoader.getSymbol(CFSTR("clap_entry")); @@ -1978,14 +1997,14 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo if (entry == nullptr || entry->init == nullptr || entry->deinit == nullptr || entry->get_factory == nullptr) { DISCOVERY_OUT("error", "Not a CLAP plugin"); - return; + return false; } // ensure compatible version if (!clap_version_is_compatible(entry->clap_version)) { DISCOVERY_OUT("error", "Incompatible CLAP plugin"); - return; + return false; } const water::String pluginPath(water::File(filename).getParentDirectory().getFullPathName()); @@ -1993,7 +2012,7 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo if (!entry->init(pluginPath.toRawUTF8())) { DISCOVERY_OUT("error", "CLAP plugin failed to initialize"); - return; + return false; } const clap_plugin_factory_t* const factory = static_cast( @@ -2001,7 +2020,7 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo CARLA_SAFE_ASSERT_RETURN(factory != nullptr && factory->get_plugin_count != nullptr && factory->get_plugin_descriptor != nullptr - && factory->create_plugin != nullptr, entry->deinit()); + && factory->create_plugin != nullptr, clap_deinit_false(entry)); if (const uint32_t count = factory->get_plugin_count(factory)) { @@ -2025,13 +2044,10 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo uint hints = 0x0; uint audioIns = 0; uint audioOuts = 0; - // uint audioTotal = 0; uint midiIns = 0; uint midiOuts = 0; - // uint midiTotal = 0; uint parametersIns = 0; uint parametersOuts = 0; - // uint parametersTotal = 0; PluginCategory category = PLUGIN_CATEGORY_NONE; const clap_plugin_audio_ports_t* const audioPorts = static_cast( @@ -2069,8 +2085,6 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo audioOuts += info.channel_count; } - - // audioTotal = audioIns + audioOuts; } if (notePorts != nullptr) @@ -2096,8 +2110,6 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo if (info.supported_dialects & CLAP_NOTE_DIALECT_MIDI) ++midiOuts; } - - // midiTotal = midiIns + midiOuts; } if (params != nullptr) @@ -2118,8 +2130,6 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo else ++parametersIns; } - - // parametersTotal = parametersIns + parametersOuts; } if (desc->features != nullptr) @@ -2167,6 +2177,7 @@ static void do_clap_check(lib_t& libHandle, const char* const filename, const bo } entry->deinit(); + return false; } #ifdef USING_JUCE @@ -2266,10 +2277,10 @@ static bool do_juce_check(const char* const filename_, const char* const stype, if (results.size() == 0) { -#if defined(CARLA_OS_MAC) && defined(__aarch64__) + #if defined(CARLA_OS_MAC) && defined(__aarch64__) if (std::strcmp(stype, "VST2") == 0 || std::strcmp(stype, "VST3") == 0) return true; -#endif + #endif DISCOVERY_OUT("error", "No plugins found"); return false; } @@ -2523,21 +2534,43 @@ int main(int argc, const char* argv[]) CarlaString filenameCheck(filename); filenameCheck.toLower(); - bool openLib = false; + bool openLib; lib_t handle = nullptr; switch (type) { case PLUGIN_LADSPA: case PLUGIN_DSSI: + // only available as single binary + openLib = true; + break; + case PLUGIN_VST2: + case PLUGIN_CLAP: + #ifdef CARLA_OS_MAC + // bundle on macOS + openLib = false; + #else + // single binary on all else openLib = true; + #endif break; + case PLUGIN_VST3: - case PLUGIN_CLAP: + #if defined(CARLA_OS_MAC) + // bundle on macOS + openLib = false; + #elif defined(CARLA_OS_WIN) + // either file or bundle on Windows openLib = water::File(filename).existsAsFile(); + #else + // single binary on all else + openLib = true; + #endif break; + default: + openLib = false; break; } @@ -2547,11 +2580,6 @@ int main(int argc, const char* argv[]) return 0; } -#ifdef CARLA_OS_MAC - if (type == PLUGIN_VST2 && (filenameCheck.endsWith(".vst") || filenameCheck.endsWith(".vst/"))) - openLib = false; -#endif - // --------------------------------------------------------------------------------------------------------------- // Initialize OS features @@ -2644,10 +2672,9 @@ int main(int argc, const char* argv[]) break; } #endif -#ifdef USING_JUCE + // some macOS plugins have not been yet ported to arm64, re-run them in x86_64 mode if discovery fails - bool retryJucePlugin = false; -#endif + bool retryAsX64lugin = false; switch (type) { @@ -2667,17 +2694,17 @@ int main(int argc, const char* argv[]) case PLUGIN_VST2: #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST - retryJucePlugin = do_juce_check(filename, "VST2", doInit); + retryAsX64lugin = do_juce_check(filename, "VST2", doInit); #else - do_vst2_check(handle, filename, doInit); + retryAsX64lugin = do_vst2_check(handle, filename, doInit); #endif break; case PLUGIN_VST3: #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST3 - retryJucePlugin = do_juce_check(filename, "VST3", doInit); + retryAsX64lugin = do_juce_check(filename, "VST3", doInit); #else - do_vst3_check(handle, filename, doInit); + retryAsX64lugin = do_vst3_check(handle, filename, doInit); #endif break; @@ -2696,7 +2723,7 @@ int main(int argc, const char* argv[]) #endif case PLUGIN_CLAP: - do_clap_check(handle, filename, doInit); + retryAsX64lugin = do_clap_check(handle, filename, doInit); break; case PLUGIN_DLS: @@ -2709,9 +2736,14 @@ int main(int argc, const char* argv[]) break; } -#if defined(CARLA_OS_MAC) && defined(USING_JUCE) && defined(__aarch64__) - if (retryJucePlugin) + if (openLib && handle != nullptr) + lib_close(handle); + + gPipe = nullptr; + + if (retryAsX64lugin) { + #if defined(CARLA_OS_MAC) && defined(__aarch64__) DISCOVERY_OUT("warning", "No plugins found while scanning in arm64 mode, will try x86_64 now"); cpu_type_t pref = CPU_TYPE_X86_64; @@ -2728,13 +2760,8 @@ int main(int argc, const char* argv[]) int status; waitpid(pid, &status, 0); } + #endif } -#endif - - if (openLib && handle != nullptr) - lib_close(handle); - - gPipe = nullptr; // --------------------------------------------------------------------------------------------------------------- @@ -2748,11 +2775,6 @@ int main(int argc, const char* argv[]) #endif return 0; - -#ifdef USING_JUCE - // might be unused - (void)retryJucePlugin; -#endif } // -------------------------------------------------------------------------------------------------------------------