From cc88e0ae9c62687247003808017c4b28fe5b7980 Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 29 Dec 2020 21:30:07 +0000 Subject: [PATCH] Rough way of discoverying x64-only vsts on arm64 macOS --- source/discovery/carla-discovery.cpp | 42 +++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/source/discovery/carla-discovery.cpp b/source/discovery/carla-discovery.cpp index 766d8955c..916430fee 100644 --- a/source/discovery/carla-discovery.cpp +++ b/source/discovery/carla-discovery.cpp @@ -1411,9 +1411,9 @@ static void findMaxTotalChannels(juce::AudioProcessor* const filter, int& maxTot // ------------------------------------------------------------------------------------------------------------------- -static void 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) { - CARLA_SAFE_ASSERT_RETURN(stype != nullptr && stype[0] != 0,) // FIXME + CARLA_SAFE_ASSERT_RETURN(stype != nullptr && stype[0] != 0, false) // FIXME carla_debug("do_juce_check(%s, %s, %s)", filename_, stype, bool2str(doInit)); carla_juce_init(); @@ -1440,6 +1440,7 @@ static void do_juce_check(const char* const filename_, const char* const stype, pluginFormat = new juce::VSTPluginFormat(); #else DISCOVERY_OUT("error", "VST2 support not available"); + return false; #endif } else if (std::strcmp(stype, "VST3") == 0) @@ -1448,6 +1449,7 @@ static void do_juce_check(const char* const filename_, const char* const stype, pluginFormat = new juce::VST3PluginFormat(); #else DISCOVERY_OUT("error", "VST3 support not available"); + return false; #endif } else if (std::strcmp(stype, "AU") == 0) @@ -1456,27 +1458,32 @@ static void do_juce_check(const char* const filename_, const char* const stype, pluginFormat = new juce::AudioUnitPluginFormat(); #else DISCOVERY_OUT("error", "AU support not available"); + return false; #endif } if (pluginFormat == nullptr) { DISCOVERY_OUT("error", stype << " support not available"); - return; + return false; } #ifdef CARLA_OS_WIN - CARLA_CUSTOM_SAFE_ASSERT_RETURN("Plugin file/folder does not exist", juce::File(filename).exists(),); + CARLA_CUSTOM_SAFE_ASSERT_RETURN("Plugin file/folder does not exist", juce::File(filename).exists(), false); #endif - CARLA_SAFE_ASSERT_RETURN(pluginFormat->fileMightContainThisPluginType(filename),); + CARLA_SAFE_ASSERT_RETURN(pluginFormat->fileMightContainThisPluginType(filename), false); juce::OwnedArray results; pluginFormat->findAllTypesForFile(results, filename); if (results.size() == 0) { +#if defined(CARLA_OS_MAC) && defined(__aarch64__) + if (std::strcmp(stype, "VST2") == 0 || std::strcmp(stype, "VST3") == 0) + return true; +#endif DISCOVERY_OUT("error", "No plugins found"); - return; + return false; } for (juce::PluginDescription **it = results.begin(), **end = results.end(); it != end; ++it) @@ -1535,6 +1542,7 @@ static void do_juce_check(const char* const filename_, const char* const stype, carla_juce_idle(); carla_juce_cleanup(); + return false; } #endif // USING_JUCE_FOR_VST2 @@ -1787,7 +1795,27 @@ int main(int argc, char* argv[]) case PLUGIN_VST2: #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST - do_juce_check(filename, "VST2", doInit); + if (do_juce_check(filename, "VST2", doInit)) + { +# if defined(CARLA_OS_MAC) && defined(__aarch64__) + DISCOVERY_OUT("warning", "No plugins found while scanning in arm64 mode, will try x86_64 now"); + + const pid_t pid = vfork(); + if (pid >= 0) + { + if (pid == 0) + { + execl("/usr/bin/arch", "/usr/bin/arch", "-arch", "x86_64", argv[0], argv[1], argv[2], nullptr); + exit(1); + } + else + { + int status; + waitpid(pid, &status, 0); + } + } +# endif + } #else do_vst_check(handle, filename, doInit); #endif