Signed-off-by: falkTX <falktx@falktx.com>pull/1807/head
| @@ -124,7 +124,7 @@ $(MODULEDIR)/carla_plugin.a: .FORCE | |||
| $(MODULEDIR)/jackbridge.a: .FORCE | |||
| @$(MAKE) -C source/jackbridge | |||
| $(MODULEDIR)/jackbridge.%.a: $(MODULEDIR)/jackbridge.a | |||
| $(MODULEDIR)/jackbridge.%.a: .FORCE | |||
| @$(MAKE) -C source/jackbridge $* | |||
| $(MODULEDIR)/native-plugins.a: .FORCE | |||
| @@ -304,6 +304,7 @@ typedef bool (*CarlaPluginCheckCacheCallback)(void* ptr, const char* filename, c | |||
| * @a carla_plugin_discovery_idle must be called at regular intervals afterwards. | |||
| */ | |||
| CARLA_PLUGIN_EXPORT CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* discoveryTool, | |||
| BinaryType btype, | |||
| PluginType ptype, | |||
| const char* pluginPath, | |||
| CarlaPluginDiscoveryCallback discoveryCb, | |||
| @@ -10,6 +10,7 @@ include ../Makefile.mk | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| BUILD_CXX_FLAGS += $(FLUIDSYNTH_FLAGS) | |||
| BUILD_CXX_FLAGS += $(MAGIC_LIBS) | |||
| BUILD_CXX_FLAGS += $(YSFX_FLAGS) | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla Plugin Host | |||
| * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2011-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -18,6 +18,7 @@ | |||
| #include "CarlaUtils.h" | |||
| #include "CarlaBackendUtils.hpp" | |||
| #include "CarlaBinaryUtils.hpp" | |||
| #include "CarlaJuceUtils.hpp" | |||
| #include "CarlaPipeUtils.hpp" | |||
| #include "CarlaSha1Utils.hpp" | |||
| @@ -64,12 +65,14 @@ class CarlaPluginDiscovery : private CarlaPipeServer | |||
| { | |||
| public: | |||
| CarlaPluginDiscovery(const char* const discoveryTool, | |||
| const BinaryType btype, | |||
| const PluginType ptype, | |||
| const std::vector<water::File>&& binaries, | |||
| const CarlaPluginDiscoveryCallback discoveryCb, | |||
| const CarlaPluginCheckCacheCallback checkCacheCb, | |||
| void* const callbackPtr) | |||
| : fPluginType(ptype), | |||
| : fBinaryType(btype), | |||
| fPluginType(ptype), | |||
| fDiscoveryCallback(discoveryCb), | |||
| fCheckCacheCallback(checkCacheCb), | |||
| fCallbackPtr(callbackPtr), | |||
| @@ -87,11 +90,13 @@ public: | |||
| } | |||
| CarlaPluginDiscovery(const char* const discoveryTool, | |||
| const BinaryType btype, | |||
| const PluginType ptype, | |||
| const CarlaPluginDiscoveryCallback discoveryCb, | |||
| const CarlaPluginCheckCacheCallback checkCacheCb, | |||
| void* const callbackPtr) | |||
| : fPluginType(ptype), | |||
| : fBinaryType(btype), | |||
| fPluginType(ptype), | |||
| fDiscoveryCallback(discoveryCb), | |||
| fCheckCacheCallback(checkCacheCb), | |||
| fCallbackPtr(callbackPtr), | |||
| @@ -340,6 +345,7 @@ protected: | |||
| } | |||
| private: | |||
| const BinaryType fBinaryType; | |||
| const PluginType fPluginType; | |||
| const CarlaPluginDiscoveryCallback fDiscoveryCallback; | |||
| const CarlaPluginCheckCacheCallback fCheckCacheCallback; | |||
| @@ -365,9 +371,25 @@ private: | |||
| fPluginsFoundInBinary = false; | |||
| fNextSha1Sum.clear(); | |||
| const char* helperTool; | |||
| switch (fBinaryType) | |||
| { | |||
| #ifndef CARLA_OS_WIN | |||
| case CB::BINARY_WIN32: | |||
| helperTool = "wine"; | |||
| break; | |||
| case CB::BINARY_WIN64: | |||
| helperTool = "wine64"; | |||
| break; | |||
| #endif | |||
| default: | |||
| helperTool = nullptr; | |||
| break; | |||
| } | |||
| if (fBinaries.empty()) | |||
| { | |||
| startPipeServer(fDiscoveryTool, | |||
| startPipeServer(helperTool, fDiscoveryTool, | |||
| getPluginTypeAsString(fPluginType), | |||
| ":all"); | |||
| } | |||
| @@ -389,7 +411,7 @@ private: | |||
| } | |||
| carla_stdout("Scanning \"%s\"...", filename.toRawUTF8()); | |||
| startPipeServer(fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8()); | |||
| startPipeServer(helperTool, fDiscoveryTool, getPluginTypeAsString(fPluginType), filename.toRawUTF8()); | |||
| } | |||
| } | |||
| @@ -455,7 +477,8 @@ static bool findDirectories(std::vector<water::File>& files, const char* const p | |||
| return files.empty(); | |||
| } | |||
| static bool findFiles(std::vector<water::File>& files, const char* const pluginPath, const char* const wildcard) | |||
| static bool findFiles(std::vector<water::File>& files, | |||
| const BinaryType btype, const char* const pluginPath, const char* const wildcard) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(pluginPath != nullptr, true); | |||
| @@ -479,14 +502,22 @@ static bool findFiles(std::vector<water::File>& files, const char* const pluginP | |||
| if (dir.findChildFiles(results, File::findFiles|File::ignoreHiddenFiles, true, wildcard) > 0) | |||
| { | |||
| files.reserve(files.size() + results.size()); | |||
| files.insert(files.end(), results.begin(), results.end()); | |||
| for (std::vector<File>::const_iterator cit = results.begin(); cit != results.end(); ++cit) | |||
| { | |||
| const File file(*cit); | |||
| if (CB::getBinaryTypeFromFile(file.getFullPathName().toRawUTF8()) == btype) | |||
| files.push_back(file); | |||
| } | |||
| } | |||
| } | |||
| return files.empty(); | |||
| } | |||
| static bool findVST3s(std::vector<water::File>& files, const char* const pluginPath) | |||
| static bool findVST3s(std::vector<water::File>& files, | |||
| const BinaryType btype, const char* const pluginPath) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(pluginPath != nullptr, true); | |||
| @@ -502,11 +533,9 @@ static bool findVST3s(std::vector<water::File>& files, const char* const pluginP | |||
| if (splitPaths.size() == 0) | |||
| return true; | |||
| #if defined(CARLA_OS_WIN) | |||
| static constexpr const uint flags = File::findDirectories|File::findFiles; | |||
| #else | |||
| static constexpr const uint flags = File::findDirectories; | |||
| #endif | |||
| const uint flags = btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64 | |||
| ? File::findDirectories|File::findFiles | |||
| : File::findDirectories; | |||
| for (String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it) | |||
| { | |||
| @@ -516,7 +545,14 @@ static bool findVST3s(std::vector<water::File>& files, const char* const pluginP | |||
| if (dir.findChildFiles(results, flags|File::ignoreHiddenFiles, true, "*.vst3") > 0) | |||
| { | |||
| files.reserve(files.size() + results.size()); | |||
| files.insert(files.end(), results.begin(), results.end()); | |||
| for (std::vector<File>::const_iterator cit = results.begin(); cit != results.end(); ++cit) | |||
| { | |||
| const File file(*cit); | |||
| if (CB::getBinaryTypeFromFile(file.getFullPathName().toRawUTF8()) == btype) | |||
| files.push_back(file); | |||
| } | |||
| } | |||
| } | |||
| @@ -524,12 +560,15 @@ static bool findVST3s(std::vector<water::File>& files, const char* const pluginP | |||
| } | |||
| CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discoveryTool, | |||
| const BinaryType btype, | |||
| const PluginType ptype, | |||
| const char* const pluginPath, | |||
| const CarlaPluginDiscoveryCallback discoveryCb, | |||
| const CarlaPluginCheckCacheCallback checkCacheCb, | |||
| void* const callbackPtr) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(btype != CB::BINARY_NONE, nullptr); | |||
| CARLA_SAFE_ASSERT_RETURN(ptype != CB::PLUGIN_NONE, nullptr); | |||
| CARLA_SAFE_ASSERT_RETURN(discoveryTool != nullptr && discoveryTool[0] != '\0', nullptr); | |||
| CARLA_SAFE_ASSERT_RETURN(discoveryCb != nullptr, nullptr); | |||
| @@ -547,44 +586,66 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov | |||
| case CB::PLUGIN_JSFX: | |||
| { | |||
| const CarlaScopedEnvVar csev("CARLA_DISCOVERY_PATH", pluginPath); | |||
| return new CarlaPluginDiscovery(discoveryTool, ptype, discoveryCb, checkCacheCb, callbackPtr); | |||
| return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr); | |||
| } | |||
| case CB::PLUGIN_INTERNAL: | |||
| case CB::PLUGIN_LV2: | |||
| case CB::PLUGIN_AU: | |||
| return new CarlaPluginDiscovery(discoveryTool, ptype, discoveryCb, checkCacheCb, callbackPtr); | |||
| return new CarlaPluginDiscovery(discoveryTool, btype, ptype, discoveryCb, checkCacheCb, callbackPtr); | |||
| case CB::PLUGIN_LADSPA: | |||
| case CB::PLUGIN_DSSI: | |||
| #if defined(CARLA_OS_MAC) | |||
| wildcard = "*.dylib"; | |||
| #elif defined(CARLA_OS_WIN) | |||
| #ifdef CARLA_OS_WIN | |||
| wildcard = "*.dll"; | |||
| #else | |||
| wildcard = "*.so"; | |||
| if (btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64) | |||
| { | |||
| wildcard = "*.dll"; | |||
| } | |||
| else | |||
| { | |||
| #ifdef CARLA_OS_MAC | |||
| wildcard = "*.dylib"; | |||
| #else | |||
| wildcard = "*.so"; | |||
| #endif | |||
| } | |||
| #endif | |||
| break; | |||
| case CB::PLUGIN_VST2: | |||
| #if defined(CARLA_OS_MAC) | |||
| directories = true; | |||
| wildcard = "*.vst"; | |||
| #elif defined(CARLA_OS_WIN) | |||
| #ifdef CARLA_OS_WIN | |||
| wildcard = "*.dll"; | |||
| #else | |||
| wildcard = "*.so"; | |||
| if (btype == CB::BINARY_WIN32 || btype == CB::BINARY_WIN64) | |||
| { | |||
| wildcard = "*.dll"; | |||
| } | |||
| else | |||
| { | |||
| #ifdef CARLA_OS_MAC | |||
| directories = true; | |||
| wildcard = "*.vst"; | |||
| #else | |||
| wildcard = "*.so"; | |||
| #endif | |||
| } | |||
| #endif | |||
| break; | |||
| case CB::PLUGIN_VST3: | |||
| directories = true; | |||
| wildcard = "*.vst3"; | |||
| break; | |||
| case CB::PLUGIN_CLAP: | |||
| wildcard = "*.clap"; | |||
| #ifdef CARLA_OS_MAC | |||
| directories = true; | |||
| #endif | |||
| break; | |||
| case CB::PLUGIN_DLS: | |||
| wildcard = "*.dls"; | |||
| break; | |||
| @@ -602,7 +663,7 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov | |||
| if (ptype == CB::PLUGIN_VST3) | |||
| { | |||
| if (findVST3s(files, pluginPath)) | |||
| if (findVST3s(files, btype, pluginPath)) | |||
| return nullptr; | |||
| } | |||
| else if (directories) | |||
| @@ -612,11 +673,12 @@ CarlaPluginDiscoveryHandle carla_plugin_discovery_start(const char* const discov | |||
| } | |||
| else | |||
| { | |||
| if (findFiles(files, pluginPath, wildcard)) | |||
| if (findFiles(files, btype, pluginPath, wildcard)) | |||
| return nullptr; | |||
| } | |||
| return new CarlaPluginDiscovery(discoveryTool, ptype, std::move(files), discoveryCb, checkCacheCb, callbackPtr); | |||
| return new CarlaPluginDiscovery(discoveryTool, btype, ptype, std::move(files), | |||
| discoveryCb, checkCacheCb, callbackPtr); | |||
| } | |||
| bool carla_plugin_discovery_idle(const CarlaPluginDiscoveryHandle handle) | |||
| @@ -79,11 +79,11 @@ LIBS_win64 = $(MODULEDIR)/lilv.win64.a | |||
| LINK_FLAGS += $(LILV_LIBS) | |||
| LIBS_native += $(MODULEDIR)/water.files.a | |||
| LIBS_arm32 = $(MODULEDIR)/water.files.arm32.a | |||
| LIBS_posix32 = $(MODULEDIR)/water.posix32.a | |||
| LIBS_posix64 = $(MODULEDIR)/water.posix64.a | |||
| LIBS_win32 = $(MODULEDIR)/water.win32.a | |||
| LIBS_win64 = $(MODULEDIR)/water.win64.a | |||
| LIBS_arm32 += $(MODULEDIR)/water.files.arm32.a | |||
| LIBS_posix32 += $(MODULEDIR)/water.posix32.a | |||
| LIBS_posix64 += $(MODULEDIR)/water.posix64.a | |||
| LIBS_win32 += $(MODULEDIR)/water.win32.a | |||
| LIBS_win64 += $(MODULEDIR)/water.win64.a | |||
| LINK_FLAGS += $(WATER_LIBS) | |||
| LINK_FLAGS += $(LIBDL_LIBS) | |||
| @@ -92,6 +92,11 @@ LIBS_native += $(MODULEDIR)/ysfx.a | |||
| LINK_FLAGS += $(YSFX_GRAPHICS_LIBS) | |||
| endif | |||
| ifeq ($(BUILDING_FOR_WINE),true) | |||
| LIBS_win32 += $(MODULEDIR)/jackbridge.win32e.a | |||
| LIBS_win64 += $(MODULEDIR)/jackbridge.win64e.a | |||
| endif | |||
| ifeq ($(USING_JUCE),true) | |||
| LIBS_native += $(MODULEDIR)/carla_juce.a | |||
| LIBS_native += $(MODULEDIR)/juce_audio_basics.a | |||
| @@ -18,7 +18,6 @@ | |||
| #include "CarlaBackendUtils.hpp" | |||
| #include "CarlaLibUtils.hpp" | |||
| #include "CarlaMathUtils.hpp" | |||
| #include "CarlaPipeUtils.cpp" | |||
| #include "CarlaScopeUtils.hpp" | |||
| #include "CarlaMIDI.h" | |||
| @@ -31,6 +30,10 @@ | |||
| #include "CarlaVst3Utils.hpp" | |||
| #include "CarlaClapUtils.hpp" | |||
| #ifndef BUILDING_CARLA_FOR_WINE | |||
| # include "CarlaPipeUtils.cpp" | |||
| #endif | |||
| #ifdef CARLA_OS_MAC | |||
| # include "CarlaMacUtils.cpp" | |||
| # ifdef __aarch64__ | |||
| @@ -80,6 +83,11 @@ | |||
| # pragma GCC diagnostic pop | |||
| #endif | |||
| // must be last | |||
| #ifdef BUILDING_CARLA_FOR_WINE | |||
| # include "../jackbridge/JackBridge.hpp" | |||
| #endif | |||
| #define MAX_DISCOVERY_AUDIO_IO 64 | |||
| #define MAX_DISCOVERY_CV_IO 32 | |||
| @@ -102,6 +110,7 @@ static constexpr const float kSampleRatef = 44100.0f; | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| // Dynamic discovery | |||
| #ifndef BUILDING_CARLA_FOR_WINE | |||
| class DiscoveryPipe : public CarlaPipeClient | |||
| { | |||
| public: | |||
| @@ -124,7 +133,7 @@ public: | |||
| if (! writeAndFixMessage(value)) | |||
| return false; | |||
| flushMessages(); | |||
| syncMessages(); | |||
| return true; | |||
| } | |||
| @@ -135,6 +144,37 @@ protected: | |||
| return true; | |||
| } | |||
| }; | |||
| #else | |||
| class DiscoveryPipe | |||
| { | |||
| void* pipe; | |||
| public: | |||
| DiscoveryPipe() noexcept : pipe(nullptr) {} | |||
| ~DiscoveryPipe() | |||
| { | |||
| jackbridge_discovery_pipe_destroy(pipe); | |||
| } | |||
| bool initPipeClient(const char* argv[]) | |||
| { | |||
| if (jackbridge_is_ok()) | |||
| pipe = jackbridge_discovery_pipe_create(argv); | |||
| return pipe != nullptr; | |||
| } | |||
| bool writeDiscoveryMessage(const char* const key, const char* const value) const noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0', false); | |||
| CARLA_SAFE_ASSERT_RETURN(value != nullptr, false); | |||
| jackbridge_discovery_pipe_message(pipe, key, value); | |||
| return true; | |||
| } | |||
| }; | |||
| #endif | |||
| CarlaScopedPointer<DiscoveryPipe> gPipe; | |||
| @@ -2667,6 +2707,7 @@ int main(int argc, const char* argv[]) | |||
| if (handle == nullptr) | |||
| { | |||
| print_lib_error(filename); | |||
| gPipe = nullptr; | |||
| return 1; | |||
| } | |||
| } | |||
| @@ -2685,6 +2726,7 @@ int main(int argc, const char* argv[]) | |||
| if (! lib_close(handle)) | |||
| { | |||
| print_lib_error(filename); | |||
| gPipe = nullptr; | |||
| return 1; | |||
| } | |||
| @@ -2693,6 +2735,7 @@ int main(int argc, const char* argv[]) | |||
| if (handle == nullptr) | |||
| { | |||
| print_lib_error(filename); | |||
| gPipe = nullptr; | |||
| return 1; | |||
| } | |||
| } | |||
| @@ -356,16 +356,16 @@ struct PluginPaths { | |||
| if (QDir(winePrefix).exists()) | |||
| { | |||
| vst2 += ":" + winePrefix + "/drive_c/Program Files/VSTPlugins"; | |||
| vst2 += ":" + winePrefix + "/drive_c/Program Files/Steinberg/VSTPlugins"; | |||
| vst2 += ":" + winePrefix + "/drive_c/Program Files/VstPlugins"; | |||
| vst2 += ":" + winePrefix + "/drive_c/Program Files/Steinberg/VstPlugins"; | |||
| vst3 += ":" + winePrefix + "/drive_c/Program Files/Common Files/VST3"; | |||
| clap += ":" + winePrefix + "/drive_c/Program Files/Common Files/CLAP"; | |||
| #ifdef CARLA_OS_64BIT | |||
| if (QDir(winePrefix + "/drive_c/Program Files (x86)").exists()) | |||
| { | |||
| vst2 += ":" + winePrefix + "/drive_c/Program Files (x86)/VSTPlugins"; | |||
| vst2 += ":" + winePrefix + "/drive_c/Program Files (x86)/Steinberg/VSTPlugins"; | |||
| vst2 += ":" + winePrefix + "/drive_c/Program Files (x86)/VstPlugins"; | |||
| vst2 += ":" + winePrefix + "/drive_c/Program Files (x86)/Steinberg/VstPlugins"; | |||
| vst3 += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/VST3"; | |||
| clap += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/CLAP"; | |||
| } | |||
| @@ -606,7 +606,7 @@ static PluginFavorite asPluginFavorite(const QByteArray& qdata) | |||
| CARLA_SAFE_ASSERT_RETURN(static_cast<size_t>(qdata.size()) >= sizeof(PluginFavoriteHeader) + sizeof(char) * 3, {}); | |||
| // read POD data first | |||
| const PluginFavoriteHeader* const data | |||
| const PluginFavoriteHeader* const data | |||
| = static_cast<const PluginFavoriteHeader*>(static_cast<const void*>(qdata.constData())); | |||
| PluginFavorite fav = { data->type, data->uniqueId, {}, {} }; | |||
| @@ -673,6 +673,7 @@ struct PluginListDialog::PrivateData { | |||
| bool hasLoadedLv2Plugins = false; | |||
| struct Discovery { | |||
| BinaryType btype = BINARY_NATIVE; | |||
| PluginType ptype = PLUGIN_NONE; | |||
| bool firstInit = true; | |||
| bool ignoreCache = false; | |||
| @@ -682,11 +683,7 @@ struct PluginListDialog::PrivateData { | |||
| CarlaScopedPointer<PluginRefreshDialog> dialog; | |||
| Discovery() | |||
| { | |||
| tool = carla_get_library_folder(); | |||
| tool += CARLA_OS_SEP_STR "carla-discovery-native"; | |||
| #ifdef CARLA_OS_WIN | |||
| tool += ".exe"; | |||
| #endif | |||
| restart(); | |||
| } | |||
| ~Discovery() | |||
| @@ -694,6 +691,86 @@ struct PluginListDialog::PrivateData { | |||
| if (handle != nullptr) | |||
| carla_plugin_discovery_stop(handle); | |||
| } | |||
| bool nextTool() | |||
| { | |||
| if (handle != nullptr) | |||
| { | |||
| carla_plugin_discovery_stop(handle); | |||
| handle = nullptr; | |||
| } | |||
| #ifdef CARLA_OS_WIN | |||
| #ifdef CARLA_OS_WIN64 | |||
| // look for win32 plugins on win64 | |||
| if (btype == BINARY_NATIVE) | |||
| { | |||
| btype = BINARY_WIN32; | |||
| ptype = PLUGIN_INTERNAL; | |||
| tool = carla_get_library_folder(); | |||
| tool += CARLA_OS_SEP_STR "carla-discovery-win32.exe"; | |||
| if (QFile(tool).exists()) | |||
| return true; | |||
| } | |||
| #endif | |||
| // no other types to try | |||
| return false; | |||
| #else // CARLA_OS_WIN | |||
| #ifndef CARLA_OS_MAC | |||
| // try 32bit plugins on 64bit systems, skipping macOS where 32bit is no longer supported | |||
| if (btype == BINARY_NATIVE) | |||
| { | |||
| btype = BINARY_POSIX32; | |||
| ptype = PLUGIN_INTERNAL; | |||
| tool = carla_get_library_folder(); | |||
| tool += CARLA_OS_SEP_STR "carla-discovery-posix32"; | |||
| if (QFile(tool).exists()) | |||
| return true; | |||
| } | |||
| #endif | |||
| // try wine bridges | |||
| #ifdef CARLA_OS_64BIT | |||
| if (btype == BINARY_NATIVE || btype == BINARY_POSIX32) | |||
| { | |||
| btype = BINARY_WIN64; | |||
| ptype = PLUGIN_INTERNAL; | |||
| tool = carla_get_library_folder(); | |||
| tool += CARLA_OS_SEP_STR "carla-discovery-win64.exe"; | |||
| if (QFile(tool).exists()) | |||
| return true; | |||
| } | |||
| #endif | |||
| { | |||
| btype = BINARY_WIN32; | |||
| ptype = PLUGIN_INTERNAL; | |||
| tool = carla_get_library_folder(); | |||
| tool += CARLA_OS_SEP_STR "carla-discovery-win32.exe"; | |||
| if (QFile(tool).exists()) | |||
| return true; | |||
| } | |||
| return false; | |||
| #endif // CARLA_OS_WIN | |||
| } | |||
| void restart() | |||
| { | |||
| btype = BINARY_NATIVE; | |||
| ptype = PLUGIN_NONE; | |||
| tool = carla_get_library_folder(); | |||
| tool += CARLA_OS_SEP_STR "carla-discovery-native"; | |||
| #ifdef CARLA_OS_WIN | |||
| tool += ".exe"; | |||
| #endif | |||
| } | |||
| } discovery; | |||
| PluginPaths paths; | |||
| @@ -788,10 +865,11 @@ PluginListDialog::PluginListDialog(QWidget* const parent, const HostSettings& ho | |||
| // custom action that listens for Ctrl+F shortcut | |||
| addAction(ui.act_focus_search); | |||
| #if BINARY_NATIVE == BINARY_POSIX32 || BINARY_NATIVE == BINARY_WIN32 | |||
| ui.ch_bridged->setText(tr("Bridged (64bit)")); | |||
| #else | |||
| #ifdef CARLA_OS_64BIT | |||
| ui.ch_bridged->setText(tr("Bridged (32bit)")); | |||
| #else | |||
| ui.ch_bridged->setChecked(false); | |||
| ui.ch_bridged->setEnabled(false); | |||
| #endif | |||
| #if !(defined(CARLA_OS_LINUX) || defined(CARLA_OS_MAC)) | |||
| @@ -1081,9 +1159,13 @@ void PluginListDialog::timerEvent(QTimerEvent* const event) | |||
| { | |||
| case PLUGIN_NONE: | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| ui.label->setText(tr("Discovering internal plugins...")); | |||
| p->discovery.ptype = PLUGIN_INTERNAL; | |||
| break; | |||
| if (p->discovery.btype == BINARY_NATIVE) | |||
| { | |||
| ui.label->setText(tr("Discovering internal plugins...")); | |||
| p->discovery.ptype = PLUGIN_INTERNAL; | |||
| break; | |||
| } | |||
| [[fallthrough]]; | |||
| case PLUGIN_INTERNAL: | |||
| ui.label->setText(tr("Discovering LADSPA plugins...")); | |||
| path = p->paths.ladspa; | |||
| @@ -1118,12 +1200,16 @@ void PluginListDialog::timerEvent(QTimerEvent* const event) | |||
| case PLUGIN_CLAP: | |||
| #ifndef CARLA_FRONTEND_ONLY_EMBEDDABLE_PLUGINS | |||
| #ifdef CARLA_OS_MAC | |||
| ui.label->setText(tr("Discovering AU plugins...")); | |||
| p->discovery.ptype = PLUGIN_AU; | |||
| break; | |||
| if (p->discovery.btype == BINARY_POSIX32 || p->discovery.btype == BINARY_POSIX64) | |||
| { | |||
| ui.label->setText(tr("Discovering AU plugins...")); | |||
| p->discovery.ptype = PLUGIN_AU; | |||
| break; | |||
| } | |||
| [[fallthrough]]; | |||
| case PLUGIN_AU: | |||
| #endif | |||
| if (p->paths.jsfx.isNotEmpty()) | |||
| if (p->discovery.btype == BINARY_NATIVE && p->paths.jsfx.isNotEmpty()) | |||
| { | |||
| ui.label->setText(tr("Discovering JSFX plugins...")); | |||
| path = p->paths.jsfx; | |||
| @@ -1132,20 +1218,29 @@ void PluginListDialog::timerEvent(QTimerEvent* const event) | |||
| } | |||
| [[fallthrough]]; | |||
| case PLUGIN_JSFX: | |||
| ui.label->setText(tr("Discovering SF2 kits...")); | |||
| path = p->paths.sf2; | |||
| p->discovery.ptype = PLUGIN_SF2; | |||
| break; | |||
| if (p->discovery.btype == BINARY_NATIVE && p->paths.sf2.isNotEmpty()) | |||
| { | |||
| ui.label->setText(tr("Discovering SF2 kits...")); | |||
| path = p->paths.sf2; | |||
| p->discovery.ptype = PLUGIN_SF2; | |||
| break; | |||
| } | |||
| [[fallthrough]]; | |||
| case PLUGIN_SF2: | |||
| ui.label->setText(tr("Discovering SFZ kits...")); | |||
| path = p->paths.sfz; | |||
| p->discovery.ptype = PLUGIN_SFZ; | |||
| break; | |||
| if (p->discovery.btype == BINARY_NATIVE && p->paths.sfz.isNotEmpty()) | |||
| { | |||
| ui.label->setText(tr("Discovering SFZ kits...")); | |||
| path = p->paths.sfz; | |||
| p->discovery.ptype = PLUGIN_SFZ; | |||
| break; | |||
| } | |||
| [[fallthrough]]; | |||
| case PLUGIN_SFZ: | |||
| #endif | |||
| default: | |||
| // discovery complete | |||
| refreshPluginsStop(); | |||
| if (! p->discovery.nextTool()) | |||
| refreshPluginsStop(); | |||
| } | |||
| if (p->timerId == 0) | |||
| @@ -1155,6 +1250,7 @@ void PluginListDialog::timerEvent(QTimerEvent* const event) | |||
| p->discovery.dialog->progressBar->setFormat(ui.label->text()); | |||
| p->discovery.handle = carla_plugin_discovery_start(p->discovery.tool.toUtf8().constData(), | |||
| p->discovery.btype, | |||
| p->discovery.ptype, | |||
| path.toUtf8().constData(), | |||
| discoveryCallback, checkCacheCallback, this); | |||
| @@ -1462,17 +1558,19 @@ void PluginListDialog::checkFilters() | |||
| const bool hideNonIDisp = ui.ch_inline_display->isChecked(); | |||
| const bool hideNonStereo = ui.ch_stereo->isChecked(); | |||
| #if 0 | |||
| if HAIKU or LINUX or MACOS: | |||
| nativeBins = [BINARY_POSIX32, BINARY_POSIX64] | |||
| wineBins = [BINARY_WIN32, BINARY_WIN64] | |||
| elif WINDOWS: | |||
| nativeBins = [BINARY_WIN32, BINARY_WIN64] | |||
| wineBins = [] | |||
| else: | |||
| nativeBins = [] | |||
| wineBins = [] | |||
| #endif | |||
| #if defined(CARLA_OS_WIN64) | |||
| static constexpr const BinaryType nativeBins[2] = { BINARY_WIN32, BINARY_WIN64 }; | |||
| static constexpr const BinaryType wineBins[2] = { BINARY_NONE, BINARY_NONE }; | |||
| #elif defined(CARLA_OS_WIN32) | |||
| static constexpr const BinaryType nativeBins[2] = { BINARY_WIN32, BINARY_NONE }; | |||
| static constexpr const BinaryType wineBins[2] = { BINARY_NONE, BINARY_NONE }; | |||
| #elif defined(CARLA_OS_MAC) | |||
| static constexpr const BinaryType nativeBins[2] = { BINARY_POSIX64, BINARY_NONE }; | |||
| static constexpr const BinaryType wineBins[2] = { BINARY_WIN32, BINARY_WIN64 }; | |||
| #else | |||
| static constexpr const BinaryType nativeBins[2] = { BINARY_POSIX32, BINARY_POSIX64 }; | |||
| static constexpr const BinaryType wineBins[2] = { BINARY_WIN32, BINARY_WIN64 }; | |||
| #endif | |||
| for (int i=0, c=ui.tableWidget->rowCount(); i<c; ++i) | |||
| { | |||
| @@ -1499,14 +1597,8 @@ void PluginListDialog::checkFilters() | |||
| const bool hasCV = cvIns + cvOuts > 0; | |||
| const bool hasGui = phints & PLUGIN_HAS_CUSTOM_UI; | |||
| const bool hasIDisp = phints & PLUGIN_HAS_INLINE_DISPLAY; | |||
| #if 0 | |||
| const bool isBridged = bool(not isNative and info.build in nativeBins); | |||
| const bool isBridgedWine = bool(not isNative and info.build in wineBins); | |||
| #else | |||
| const bool isBridged = false; | |||
| const bool isBridgedWine = false; | |||
| #endif | |||
| const bool isBridged = !isNative && (nativeBins[0] == info.build || nativeBins[1] == info.build); | |||
| const bool isBridgedWine = !isNative && (wineBins[0] == info.build || wineBins[1] == info.build); | |||
| const auto hasText = [text, ptext]() { | |||
| const QStringList textSplit = text.strip().split(' '); | |||
| @@ -1798,7 +1890,7 @@ void PluginListDialog::refreshPluginsStart() | |||
| p->plugins.cache.clear(); | |||
| // start discovery again | |||
| p->discovery.ptype = PLUGIN_NONE; | |||
| p->discovery.restart(); | |||
| if (p->timerId == 0) | |||
| p->timerId = startTimer(0); | |||
| @@ -1806,7 +1898,7 @@ void PluginListDialog::refreshPluginsStart() | |||
| void PluginListDialog::refreshPluginsStop() | |||
| { | |||
| // stop previous discovery if still running | |||
| // stop previous discovery if still running | |||
| if (p->discovery.handle != nullptr) | |||
| { | |||
| carla_plugin_discovery_stop(p->discovery.handle); | |||
| @@ -428,6 +428,10 @@ JACKBRIDGE_API void jackbridge_shm_close(void* shm) noexcept; | |||
| JACKBRIDGE_API void* jackbridge_shm_map(void* shm, uint64_t size) noexcept; | |||
| JACKBRIDGE_API void jackbridge_shm_unmap(void* shm, void* ptr) noexcept; | |||
| JACKBRIDGE_API void* jackbridge_discovery_pipe_create(const char* argv[]); | |||
| JACKBRIDGE_API void jackbridge_discovery_pipe_message(void* pipe, const char* key, const char* value); | |||
| JACKBRIDGE_API void jackbridge_discovery_pipe_destroy(void* pipe); | |||
| JACKBRIDGE_API void jackbridge_parent_deathsig(bool kill) noexcept; | |||
| #endif // JACKBRIDGE_HPP_INCLUDED | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * JackBridge (Part 2, Semaphore + Shared memory and other misc functions) | |||
| * Copyright (C) 2013-2019 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2013-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -22,9 +22,13 @@ | |||
| # include "CarlaProcessUtils.hpp" | |||
| # include "CarlaSemUtils.hpp" | |||
| # include "CarlaShmUtils.hpp" | |||
| # include "CarlaTimeUtils.hpp" | |||
| # ifdef __WINE__ | |||
| # include "utils/PipeClient.cpp" | |||
| # endif | |||
| #endif // ! JACKBRIDGE_DUMMY | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| bool jackbridge_sem_init(void* sem) noexcept | |||
| { | |||
| @@ -77,7 +81,7 @@ bool jackbridge_sem_timedwait(void* sem, uint msecs, bool server) noexcept | |||
| } | |||
| #endif | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| bool jackbridge_shm_is_valid(const void* shm) noexcept | |||
| { | |||
| @@ -137,7 +141,68 @@ void jackbridge_shm_unmap(void* shm, void* ptr) noexcept | |||
| #endif | |||
| } | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| #if !defined(JACKBRIDGE_DUMMY) && defined(__WINE__) | |||
| static void discovery_pipe_callback(void*, const char* const msg) noexcept | |||
| { | |||
| carla_stdout("discovery msgReceived %s", msg); | |||
| } | |||
| #endif | |||
| void* jackbridge_discovery_pipe_create(const char* argv[]) | |||
| { | |||
| #if defined(JACKBRIDGE_DUMMY) || !defined(__WINE__) | |||
| return nullptr; | |||
| // unused | |||
| (void)argv; | |||
| #else | |||
| return carla_pipe_client_new(argv, discovery_pipe_callback, nullptr); | |||
| #endif | |||
| } | |||
| void jackbridge_discovery_pipe_message(void* pipe, const char* key, const char* value) | |||
| { | |||
| #if defined(JACKBRIDGE_DUMMY) || !defined(__WINE__) | |||
| // unused | |||
| (void)pipe; | |||
| (void)key; | |||
| (void)value; | |||
| #else | |||
| carla_pipe_client_lock(pipe); | |||
| carla_pipe_client_write_and_fix_msg(pipe, key); | |||
| carla_pipe_client_write_and_fix_msg(pipe, value); | |||
| carla_pipe_client_flush_and_unlock(pipe); | |||
| #endif | |||
| } | |||
| void jackbridge_discovery_pipe_destroy(void* pipe) | |||
| { | |||
| #if defined(JACKBRIDGE_DUMMY) || !defined(__WINE__) | |||
| // unused | |||
| (void)pipe; | |||
| #else | |||
| carla_pipe_client_lock(pipe); | |||
| carla_pipe_client_write_msg(pipe, "exiting\n"); | |||
| carla_pipe_client_flush_and_unlock(pipe); | |||
| // NOTE: no more messages are handled after this point | |||
| // pData->clientClosingDown = true; | |||
| for (int i=0; i < 100 && carla_pipe_client_is_running(pipe); ++i) | |||
| { | |||
| carla_msleep(50); | |||
| carla_pipe_client_idle(pipe); | |||
| } | |||
| if (carla_pipe_client_is_running(pipe)) | |||
| carla_stderr2("jackbridge_discovery_pipe_destroy: pipe is still running!"); | |||
| carla_pipe_client_destroy(pipe); | |||
| #endif | |||
| } | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| void jackbridge_parent_deathsig(bool kill) noexcept | |||
| { | |||
| @@ -146,4 +211,4 @@ void jackbridge_parent_deathsig(bool kill) noexcept | |||
| #endif | |||
| } | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * JackBridge (Part 3, Export) | |||
| * Copyright (C) 2013-2015 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2013-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -18,7 +18,7 @@ | |||
| #include "CarlaUtils.hpp" | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| #if defined(CARLA_OS_WIN) && ! defined(__WINE__) | |||
| # define JACKBRIDGE_EXPORT extern "C" __declspec (dllexport) | |||
| @@ -26,7 +26,7 @@ | |||
| # define JACKBRIDGE_EXPORT extern "C" __attribute__ ((visibility("default"))) | |||
| #endif | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| JACKBRIDGE_EXPORT | |||
| const JackBridgeExportedFunctions* JACKBRIDGE_API jackbridge_get_exported_functions(); | |||
| @@ -140,6 +140,9 @@ const JackBridgeExportedFunctions* JACKBRIDGE_API jackbridge_get_exported_functi | |||
| funcs.shm_close_ptr = jackbridge_shm_close; | |||
| funcs.shm_map_ptr = jackbridge_shm_map; | |||
| funcs.shm_unmap_ptr = jackbridge_shm_unmap; | |||
| funcs.discovery_pipe_create_ptr = jackbridge_discovery_pipe_create; | |||
| funcs.discovery_pipe_message_ptr = jackbridge_discovery_pipe_message; | |||
| funcs.discovery_pipe_destroy_ptr = jackbridge_discovery_pipe_destroy; | |||
| funcs.parent_deathsig_ptr = jackbridge_parent_deathsig; | |||
| funcs.unique1 = funcs.unique2 = funcs.unique3 = 0xdeadf00d; | |||
| @@ -147,4 +150,4 @@ const JackBridgeExportedFunctions* JACKBRIDGE_API jackbridge_get_exported_functi | |||
| return &funcs; | |||
| } | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * JackBridge (Part 3, Export) | |||
| * Copyright (C) 2013-2015 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2013-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -17,8 +17,11 @@ | |||
| #include "JackBridgeExport.hpp" | |||
| #include "CarlaLibUtils.hpp" | |||
| #include "CarlaUtils.h" | |||
| // ----------------------------------------------------------------------------- | |||
| // #include <cstdio> | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| class JackBridgeExported | |||
| { | |||
| @@ -27,11 +30,11 @@ public: | |||
| : lib(nullptr), | |||
| func(nullptr) | |||
| { | |||
| #ifdef CARLA_OS_WIN64 | |||
| #ifdef CARLA_OS_WIN64 | |||
| lib = lib_open("jackbridge-wine64.dll"); | |||
| #else | |||
| #else | |||
| lib = lib_open("jackbridge-wine32.dll"); | |||
| #endif | |||
| #endif | |||
| CARLA_SAFE_ASSERT_RETURN(lib != nullptr,); | |||
| func = lib_symbol<jackbridge_exported_function_type>(lib, "jackbridge_get_exported_functions"); | |||
| @@ -59,12 +62,12 @@ public: | |||
| static const JackBridgeExported bridge; | |||
| CARLA_SAFE_ASSERT_RETURN(bridge.func != nullptr, fallback); | |||
| const JackBridgeExportedFunctions* const funcs(bridge.func()); | |||
| const JackBridgeExportedFunctions* const funcs = bridge.func(); | |||
| CARLA_SAFE_ASSERT_RETURN(funcs != nullptr, fallback); | |||
| CARLA_SAFE_ASSERT_RETURN(funcs->unique1 != 0, fallback); | |||
| CARLA_SAFE_ASSERT_RETURN(funcs->unique1 == funcs->unique2, fallback); | |||
| CARLA_SAFE_ASSERT_RETURN(funcs->unique2 == funcs->unique3, fallback); | |||
| CARLA_SAFE_ASSERT_RETURN(funcs->shm_map_ptr != nullptr, fallback); | |||
| CARLA_SAFE_ASSERT_RETURN(funcs->discovery_pipe_destroy_ptr != nullptr, fallback); | |||
| return *funcs; | |||
| } | |||
| @@ -77,7 +80,7 @@ private: | |||
| CARLA_DECLARE_NON_COPYABLE(JackBridgeExported); | |||
| }; | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| static const JackBridgeExportedFunctions& getBridgeInstance() noexcept | |||
| { | |||
| @@ -85,7 +88,7 @@ static const JackBridgeExportedFunctions& getBridgeInstance() noexcept | |||
| return funcs; | |||
| } | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| bool jackbridge_is_ok() noexcept | |||
| { | |||
| @@ -598,9 +601,28 @@ void jackbridge_shm_unmap(void* shm, void* ptr) noexcept | |||
| return getBridgeInstance().shm_unmap_ptr(shm, ptr); | |||
| } | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| void* jackbridge_discovery_pipe_create(const char* argv[]) | |||
| { | |||
| return getBridgeInstance().discovery_pipe_create_ptr(argv); | |||
| } | |||
| void jackbridge_discovery_pipe_message(void* pipe, const char* key, const char* value) | |||
| { | |||
| return getBridgeInstance().discovery_pipe_message_ptr(pipe, key, value); | |||
| } | |||
| void jackbridge_discovery_pipe_destroy(void* pipe) | |||
| { | |||
| return getBridgeInstance().discovery_pipe_destroy_ptr(pipe); | |||
| } | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| void jackbridge_parent_deathsig(bool kill) noexcept | |||
| { | |||
| return getBridgeInstance().parent_deathsig_ptr(kill); | |||
| } | |||
| // ----------------------------------------------------------------------------- | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * JackBridge (Part 3, Export) | |||
| * Copyright (C) 2013-2015 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2013-2023 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| @@ -14,6 +14,8 @@ | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #pragma once | |||
| #include "JackBridge.hpp" | |||
| extern "C" { | |||
| @@ -123,6 +125,9 @@ typedef void (JACKBRIDGE_API *jackbridgesym_shm_attach)(void*, const char*); | |||
| typedef void (JACKBRIDGE_API *jackbridgesym_shm_close)(void*); | |||
| typedef void* (JACKBRIDGE_API *jackbridgesym_shm_map)(void*, uint64_t); | |||
| typedef void (JACKBRIDGE_API *jackbridgesym_shm_unmap)(void*, void*); | |||
| typedef void* (JACKBRIDGE_API *jackbridgesym_discovery_pipe_create)(const char**); | |||
| typedef void (JACKBRIDGE_API *jackbridgesym_discovery_pipe_message)(void*, const char*, const char*); | |||
| typedef void (JACKBRIDGE_API *jackbridgesym_discovery_pipe_destroy)(void*); | |||
| typedef void (JACKBRIDGE_API *jackbridgesym_parent_deathsig)(bool); | |||
| // ----------------------------------------------------------------------------- | |||
| @@ -233,6 +238,9 @@ struct _JackBridgeExportedFunctions { | |||
| jackbridgesym_shm_close shm_close_ptr; | |||
| jackbridgesym_shm_map shm_map_ptr; | |||
| jackbridgesym_shm_unmap shm_unmap_ptr; | |||
| jackbridgesym_discovery_pipe_create discovery_pipe_create_ptr; | |||
| jackbridgesym_discovery_pipe_message discovery_pipe_message_ptr; | |||
| jackbridgesym_discovery_pipe_destroy discovery_pipe_destroy_ptr; | |||
| jackbridgesym_parent_deathsig parent_deathsig_ptr; | |||
| ulong unique3; | |||
| }; | |||
| @@ -10,7 +10,7 @@ include ../modules/Makefile.mk | |||
| # --------------------------------------------------------------------------------------------------------------------- | |||
| BUILD_CXX_FLAGS += $(JACKBRIDGE_FLAGS) | |||
| BUILD_CXX_FLAGS += $(JACKBRIDGE_FLAGS) -I../backend | |||
| LINK_FLAGS += $(JACKBRIDGE_LIBS) | |||
| ifeq ($(JACKBRIDGE_DIRECT),true) | |||
| @@ -18,6 +18,12 @@ BUILD_CXX_FLAGS += $(JACK_FLAGS) -DJACKBRIDGE_DIRECT | |||
| LINK_FLAGS += $(JACK_LIBS) | |||
| endif | |||
| ifneq ($(BUILDING_FOR_WINE),true) | |||
| ifeq ($(WINDOWS),true) | |||
| BUILD_CXX_FLAGS += -I../modules | |||
| endif | |||
| endif | |||
| WINE_32BIT_FLAGS = $(32BIT_FLAGS) -fpermissive | |||
| WINE_64BIT_FLAGS = $(64BIT_FLAGS) -fpermissive | |||
| WINE_BUILD_FLAGS = $(filter-out -flto,$(BUILD_CXX_FLAGS)) | |||
| @@ -88,7 +88,7 @@ BinaryType getBinaryTypeFromFile(const char* const filename) | |||
| #if defined(HAVE_LIBMAGIC) && ! defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) | |||
| static const CarlaMagic magic; | |||
| const char* const output(magic.getFileDescription(filename)); | |||
| const char* const output = magic.getFileDescription(filename); | |||
| if (output != nullptr && output[0] != '\0') | |||
| { | |||
| @@ -35,9 +35,8 @@ | |||
| #include <fcntl.h> | |||
| #include "water/text/String.h" | |||
| #ifdef CARLA_OS_WIN | |||
| # include "water/text/String.h" | |||
| # include <ctime> | |||
| #else | |||
| # include <cerrno> | |||
| @@ -1494,7 +1493,8 @@ uintptr_t CarlaPipeServer::getPID() const noexcept | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| bool CarlaPipeServer::startPipeServer(const char* const filename, | |||
| bool CarlaPipeServer::startPipeServer(const char* const helperTool, | |||
| const char* const filename, | |||
| const char* const arg1, | |||
| const char* const arg2, | |||
| const int size) noexcept | |||
| @@ -1642,31 +1642,30 @@ bool CarlaPipeServer::startPipeServer(const char* const filename, | |||
| //----------------------------------------------------------------------------------------------------------------- | |||
| // set arguments | |||
| const char* argv[8]; | |||
| const char* argv[9] = {}; | |||
| int i = 0; | |||
| if (helperTool != nullptr) | |||
| argv[i++] = helperTool; | |||
| //----------------------------------------------------------------------------------------------------------------- | |||
| // argv[0] => filename | |||
| argv[0] = filename; | |||
| argv[i++] = filename; | |||
| //----------------------------------------------------------------------------------------------------------------- | |||
| // argv[1-2] => args | |||
| argv[1] = arg1; | |||
| argv[2] = arg2; | |||
| argv[i++] = arg1; | |||
| argv[i++] = arg2; | |||
| //----------------------------------------------------------------------------------------------------------------- | |||
| // argv[3-6] => pipes | |||
| argv[3] = pipeRecvServerStr; | |||
| argv[4] = pipeSendServerStr; | |||
| argv[5] = pipeRecvClientStr; | |||
| argv[6] = pipeSendClientStr; | |||
| //----------------------------------------------------------------------------------------------------------------- | |||
| // argv[7] => null | |||
| argv[7] = nullptr; | |||
| argv[i++] = pipeRecvServerStr; | |||
| argv[i++] = pipeSendServerStr; | |||
| argv[i++] = pipeRecvClientStr; | |||
| argv[i++] = pipeSendClientStr; | |||
| //----------------------------------------------------------------------------------------------------------------- | |||
| // start process | |||
| @@ -1766,6 +1765,14 @@ bool CarlaPipeServer::startPipeServer(const char* const filename, | |||
| (void)size; (void)ovRecv; (void)process; | |||
| } | |||
| bool CarlaPipeServer::startPipeServer(const char* const filename, | |||
| const char* const arg1, | |||
| const char* const arg2, | |||
| const int size) noexcept | |||
| { | |||
| return startPipeServer(nullptr, filename, arg1, arg2, size); | |||
| } | |||
| void CarlaPipeServer::stopPipeServer(const uint32_t timeOutMilliseconds) noexcept | |||
| { | |||
| carla_debug("CarlaPipeServer::stopPipeServer(%i)", timeOutMilliseconds); | |||
| @@ -285,13 +285,20 @@ public: | |||
| * Start the pipe server using @a filename with 2 arguments. | |||
| * @see fail() | |||
| */ | |||
| bool startPipeServer(const char* const filename, const char* const arg1, const char* const arg2, const int size = -1) noexcept; | |||
| bool startPipeServer(const char* helperTool, | |||
| const char* filename, const char* arg1, const char* arg2, int size = -1) noexcept; | |||
| /*! | |||
| * Start the pipe server using @a filename with 2 arguments. | |||
| * @see fail() | |||
| */ | |||
| bool startPipeServer(const char* filename, const char* arg1, const char* arg2, int size = -1) noexcept; | |||
| /*! | |||
| * Stop the pipe server. | |||
| * This will send a quit message to the client, wait for it to close for @a timeOutMilliseconds, and close the pipes. | |||
| */ | |||
| void stopPipeServer(const uint32_t timeOutMilliseconds) noexcept; | |||
| void stopPipeServer(uint32_t timeOutMilliseconds) noexcept; | |||
| /*! | |||
| * Close the pipes without waiting for the child process to terminate. | |||