| @@ -18,7 +18,7 @@ | |||||
| #include "CarlaPluginInternal.hpp" | #include "CarlaPluginInternal.hpp" | ||||
| #include "CarlaEngine.hpp" | #include "CarlaEngine.hpp" | ||||
| #ifdef CARLA_OS_LINUX | |||||
| #if defined(CARLA_OS_LINUX) || defined(CARLA_OS_MAC) | |||||
| #include "CarlaLibJackHints.h" | #include "CarlaLibJackHints.h" | ||||
| #include "CarlaBackendUtils.hpp" | #include "CarlaBackendUtils.hpp" | ||||
| @@ -142,14 +142,20 @@ public: | |||||
| { | { | ||||
| const EngineOptions& options(kEngine->getOptions()); | const EngineOptions& options(kEngine->getOptions()); | ||||
| CarlaString binaryDir(options.binaryDir); | CarlaString binaryDir(options.binaryDir); | ||||
| #ifdef HAVE_LIBLO | |||||
| #ifdef HAVE_LIBLO | |||||
| const int sessionManager = fSetupLabel[4U] - '0'; | const int sessionManager = fSetupLabel[4U] - '0'; | ||||
| #endif | |||||
| #endif | |||||
| CarlaString ret; | CarlaString ret; | ||||
| #ifdef CARLA_OS_MAC | |||||
| ret += "export DYLD_LIBRARY_PATH=" + binaryDir + "/jack\n"; | |||||
| ret += "export DYLD_INSERT_LIBRARIES=" + binaryDir + "/libcarla_interposer-jack-x11.dylib\n"; | |||||
| ret += "export DYLD_FORCE_FLAT_NAMESPACE=1\n"; | |||||
| #else | |||||
| ret += "export LD_LIBRARY_PATH=" + binaryDir + "/jack\n"; | ret += "export LD_LIBRARY_PATH=" + binaryDir + "/jack\n"; | ||||
| ret += "export LD_PRELOAD=" + binaryDir + "/libcarla_interposer-jack-x11.so\n"; | ret += "export LD_PRELOAD=" + binaryDir + "/libcarla_interposer-jack-x11.so\n"; | ||||
| #ifdef HAVE_LIBLO | |||||
| #endif | |||||
| #ifdef HAVE_LIBLO | |||||
| if (sessionManager == LIBJACK_SESSION_MANAGER_NSM) | if (sessionManager == LIBJACK_SESSION_MANAGER_NSM) | ||||
| { | { | ||||
| for (int i=50; fOscServer == nullptr && --i>=0;) | for (int i=50; fOscServer == nullptr && --i>=0;) | ||||
| @@ -159,7 +165,7 @@ public: | |||||
| ret += lo_server_get_url(fOscServer); | ret += lo_server_get_url(fOscServer); | ||||
| ret += "\n"; | ret += "\n"; | ||||
| } | } | ||||
| #endif | |||||
| #endif | |||||
| if (kPlugin->getHints() & PLUGIN_HAS_CUSTOM_UI) | if (kPlugin->getHints() & PLUGIN_HAS_CUSTOM_UI) | ||||
| ret += "export CARLA_FRONTEND_WIN_ID=" + CarlaString(options.frontendWinId) + "\n"; | ret += "export CARLA_FRONTEND_WIN_ID=" + CarlaString(options.frontendWinId) + "\n"; | ||||
| @@ -362,15 +368,25 @@ protected: | |||||
| winIdStr[STR_MAX] = '\0'; | winIdStr[STR_MAX] = '\0'; | ||||
| const CarlaString libjackdir(CarlaString(options.binaryDir) + "/jack"); | const CarlaString libjackdir(CarlaString(options.binaryDir) + "/jack"); | ||||
| #ifdef CARLA_OS_MAC | |||||
| const CarlaString ldpreload(CarlaString(options.binaryDir) + "/libcarla_interposer-jack-x11.dylib"); | |||||
| #else | |||||
| const CarlaString ldpreload(CarlaString(options.binaryDir) + "/libcarla_interposer-jack-x11.so"); | const CarlaString ldpreload(CarlaString(options.binaryDir) + "/libcarla_interposer-jack-x11.so"); | ||||
| #endif | |||||
| const ScopedEngineEnvironmentLocker _seel(kEngine); | const ScopedEngineEnvironmentLocker _seel(kEngine); | ||||
| #ifdef CARLA_OS_MAC | |||||
| const CarlaScopedEnvVar sev2("DYLD_LIBRARY_PATH", libjackdir.buffer()); | |||||
| const CarlaScopedEnvVar sev1("DYLD_INSERT_LIBRARIES", ldpreload.isNotEmpty() ? ldpreload.buffer() : nullptr); | |||||
| const CarlaScopedEnvVar sev0("DYLD_FORCE_FLAT_NAMESPACE", "1"); | |||||
| #else | |||||
| const CarlaScopedEnvVar sev2("LD_LIBRARY_PATH", libjackdir.buffer()); | const CarlaScopedEnvVar sev2("LD_LIBRARY_PATH", libjackdir.buffer()); | ||||
| const CarlaScopedEnvVar sev1("LD_PRELOAD", ldpreload.isNotEmpty() ? ldpreload.buffer() : nullptr); | const CarlaScopedEnvVar sev1("LD_PRELOAD", ldpreload.isNotEmpty() ? ldpreload.buffer() : nullptr); | ||||
| #ifdef HAVE_LIBLO | |||||
| #endif | |||||
| #ifdef HAVE_LIBLO | |||||
| const CarlaScopedEnvVar sev3("NSM_URL", lo_server_get_url(fOscServer)); | const CarlaScopedEnvVar sev3("NSM_URL", lo_server_get_url(fOscServer)); | ||||
| #endif | |||||
| #endif | |||||
| if (kPlugin->getHints() & PLUGIN_HAS_CUSTOM_UI) | if (kPlugin->getHints() & PLUGIN_HAS_CUSTOM_UI) | ||||
| carla_setenv("CARLA_FRONTEND_WIN_ID", winIdStr); | carla_setenv("CARLA_FRONTEND_WIN_ID", winIdStr); | ||||
| @@ -2048,7 +2064,7 @@ CarlaPluginPtr CarlaPlugin::newJackApp(const Initializer& init) | |||||
| carla_debug("CarlaPlugin::newJackApp({%p, \"%s\", \"%s\", \"%s\"})", | carla_debug("CarlaPlugin::newJackApp({%p, \"%s\", \"%s\", \"%s\"})", | ||||
| init.engine, init.filename, init.name, init.label); | init.engine, init.filename, init.name, init.label); | ||||
| #ifdef CARLA_OS_LINUX | |||||
| #if defined(CARLA_OS_LINUX) || defined(CARLA_OS_MAC) | |||||
| std::shared_ptr<CarlaPluginJack> plugin(new CarlaPluginJack(init.engine, init.id)); | std::shared_ptr<CarlaPluginJack> plugin(new CarlaPluginJack(init.engine, init.id)); | ||||
| if (! plugin->init(plugin, init.filename, init.name, init.label, init.options)) | if (! plugin->init(plugin, init.filename, init.name, init.label, init.options)) | ||||
| @@ -586,13 +586,15 @@ class CarlaSettingsW(QDialog): | |||||
| if not LINUX: | if not LINUX: | ||||
| self.ui.ch_exp_wine_bridges.setVisible(False) | self.ui.ch_exp_wine_bridges.setVisible(False) | ||||
| self.ui.ch_exp_jack_apps.setVisible(False) | |||||
| self.ui.ch_exp_prevent_bad_behaviour.setVisible(False) | self.ui.ch_exp_prevent_bad_behaviour.setVisible(False) | ||||
| self.ui.lw_page.hideRow(self.TAB_INDEX_WINE) | self.ui.lw_page.hideRow(self.TAB_INDEX_WINE) | ||||
| if not MACOS: | if not MACOS: | ||||
| self.ui.label_engine_ui_bridges_mac_note.setVisible(False) | self.ui.label_engine_ui_bridges_mac_note.setVisible(False) | ||||
| if not (LINUX or MACOS): | |||||
| self.ui.ch_exp_jack_apps.setVisible(False) | |||||
| # FIXME, not implemented yet | # FIXME, not implemented yet | ||||
| self.ui.ch_engine_uis_always_on_top.hide() | self.ui.ch_engine_uis_always_on_top.hide() | ||||
| @@ -54,10 +54,12 @@ int QSafeSettings::valueIntPositive(const QString& key, const int defaultValue) | |||||
| QVariant var(value(key, defaultValue)); | QVariant var(value(key, defaultValue)); | ||||
| if (!var.isNull() && var.convert(QVariant::Int) && var.isValid()) | if (!var.isNull() && var.convert(QVariant::Int) && var.isValid()) | ||||
| return defaultValue; | |||||
| { | |||||
| const int value = var.toInt(); | |||||
| return value >= 0 ? value : defaultValue; | |||||
| } | |||||
| const int value = var.toInt(); | |||||
| return value >= 0 ? value : defaultValue; | |||||
| return defaultValue; | |||||
| } | } | ||||
| uint QSafeSettings::valueUInt(const QString& key, const uint defaultValue) const | uint QSafeSettings::valueUInt(const QString& key, const uint defaultValue) const | ||||
| @@ -31,15 +31,15 @@ INTERPOSER_X11_LIBS = $(X11_LIBS) $(LIBDL_LIBS) | |||||
| OBJS = | OBJS = | ||||
| TARGETS = | TARGETS = | ||||
| ifeq ($(LINUX),true) | |||||
| ifeq ($(LINUX)$(MACOS),true) | |||||
| OBJS += $(OBJDIR)/interposer-safe.cpp.o | OBJS += $(OBJDIR)/interposer-safe.cpp.o | ||||
| OBJS += $(OBJDIR)/interposer-jack-x11.cpp.o | OBJS += $(OBJDIR)/interposer-jack-x11.cpp.o | ||||
| TARGETS += $(BINDIR)/libcarla_interposer-safe.so | |||||
| TARGETS += $(BINDIR)/libcarla_interposer-jack-x11.so | |||||
| TARGETS += $(BINDIR)/libcarla_interposer-safe$(LIB_EXT) | |||||
| TARGETS += $(BINDIR)/libcarla_interposer-jack-x11$(LIB_EXT) | |||||
| ifeq ($(HAVE_X11),true) | ifeq ($(HAVE_X11),true) | ||||
| OBJS += $(OBJDIR)/interposer-x11.cpp.o | OBJS += $(OBJDIR)/interposer-x11.cpp.o | ||||
| TARGETS += $(BINDIR)/libcarla_interposer-x11.so | |||||
| TARGETS += $(BINDIR)/libcarla_interposer-x11$(LIB_EXT) | |||||
| endif | endif | ||||
| endif | endif | ||||
| @@ -57,19 +57,19 @@ debug: | |||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| $(BINDIR)/libcarla_interposer-safe.so: $(OBJDIR)/interposer-safe.cpp.o | |||||
| $(BINDIR)/libcarla_interposer-safe$(LIB_EXT): $(OBJDIR)/interposer-safe.cpp.o | |||||
| -@mkdir -p $(BINDIR) | -@mkdir -p $(BINDIR) | ||||
| @echo "Linking libcarla_interposer-safe.so" | |||||
| @echo "Linking libcarla_interposer-safe$(LIB_EXT)" | |||||
| $(SILENT)$(CXX) $< $(SHARED) $(LINK_FLAGS) $(INTERPOSER_SAFE_LIBS) -o $@ | $(SILENT)$(CXX) $< $(SHARED) $(LINK_FLAGS) $(INTERPOSER_SAFE_LIBS) -o $@ | ||||
| $(BINDIR)/libcarla_interposer-x11.so: $(OBJDIR)/interposer-x11.cpp.o | |||||
| $(BINDIR)/libcarla_interposer-x11$(LIB_EXT): $(OBJDIR)/interposer-x11.cpp.o | |||||
| -@mkdir -p $(BINDIR) | -@mkdir -p $(BINDIR) | ||||
| @echo "Linking libcarla_interposer-x11.so" | |||||
| @echo "Linking libcarla_interposer-x11$(LIB_EXT)" | |||||
| $(SILENT)$(CXX) $< $(SHARED) $(LINK_FLAGS) $(INTERPOSER_X11_LIBS) -o $@ | $(SILENT)$(CXX) $< $(SHARED) $(LINK_FLAGS) $(INTERPOSER_X11_LIBS) -o $@ | ||||
| $(BINDIR)/libcarla_interposer-jack-x11.so: $(OBJDIR)/interposer-jack-x11.cpp.o | |||||
| $(BINDIR)/libcarla_interposer-jack-x11$(LIB_EXT): $(OBJDIR)/interposer-jack-x11.cpp.o | |||||
| -@mkdir -p $(BINDIR) | -@mkdir -p $(BINDIR) | ||||
| @echo "Linking libcarla_interposer-jack-x11.so" | |||||
| @echo "Linking libcarla_interposer-jack-x11$(LIB_EXT)" | |||||
| $(SILENT)$(CXX) $< $(SHARED) $(LINK_FLAGS) $(INTERPOSER_X11_LIBS) -o $@ | $(SILENT)$(CXX) $< $(SHARED) $(LINK_FLAGS) $(INTERPOSER_X11_LIBS) -o $@ | ||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -31,7 +31,11 @@ struct ScopedLibOpen { | |||||
| long long winId; | long long winId; | ||||
| ScopedLibOpen() noexcept | ScopedLibOpen() noexcept | ||||
| #ifdef CARLA_OS_MAC | |||||
| : handle(dlopen("libjack.dylib", RTLD_NOW|RTLD_LOCAL)), | |||||
| #else | |||||
| : handle(dlopen("libjack.so.0", RTLD_NOW|RTLD_LOCAL)), | : handle(dlopen("libjack.so.0", RTLD_NOW|RTLD_LOCAL)), | ||||
| #endif | |||||
| winId(-1) | winId(-1) | ||||
| { | { | ||||
| CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); | CARLA_SAFE_ASSERT_RETURN(handle != nullptr,); | ||||
| @@ -23,11 +23,14 @@ endif | |||||
| BUILD_C_FLAGS += -I$(CWD) -I$(CWD)/includes | BUILD_C_FLAGS += -I$(CWD) -I$(CWD)/includes | ||||
| BUILD_CXX_FLAGS += -I$(CWD) -I$(CWD)/backend -I$(CWD)/includes -I$(CWD)/utils | BUILD_CXX_FLAGS += -I$(CWD) -I$(CWD)/backend -I$(CWD)/includes -I$(CWD)/utils | ||||
| LINK_FLAGS += -pthread -lrt | |||||
| LINK_FLAGS += -pthread | |||||
| ifeq ($(LINUX),true) | |||||
| LINK_FLAGS += -lrt | |||||
| endif | |||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| ifeq ($(LINUX),true) | |||||
| ifeq ($(LINUX)$(MACOS),true) | |||||
| ifneq ($(JACKBRIDGE_DIRECT),true) | ifneq ($(JACKBRIDGE_DIRECT),true) | ||||
| CAN_BUILD_LIBJACK=true | CAN_BUILD_LIBJACK=true | ||||
| endif | endif | ||||
| @@ -51,7 +54,11 @@ OBJS = \ | |||||
| $(OBJDIR)/libjack_time.cpp.o \ | $(OBJDIR)/libjack_time.cpp.o \ | ||||
| $(OBJDIR)/libjack_transport.cpp.o \ | $(OBJDIR)/libjack_transport.cpp.o \ | ||||
| $(OBJDIR)/ringbuffer.c.o | $(OBJDIR)/ringbuffer.c.o | ||||
| ifeq ($(MACOS),true) | |||||
| TARGET = $(BINDIR)/jack/libjack.dylib | |||||
| else | |||||
| TARGET = $(BINDIR)/jack/libjack.so.0 | TARGET = $(BINDIR)/jack/libjack.so.0 | ||||
| endif | |||||
| else | else | ||||
| OBJS = | OBJS = | ||||
| TARGET = | TARGET = | ||||
| @@ -73,7 +80,7 @@ debug: | |||||
| $(TARGET): $(OBJS) | $(TARGET): $(OBJS) | ||||
| -@mkdir -p $(BINDIR)/jack | -@mkdir -p $(BINDIR)/jack | ||||
| @echo "Linking libjack.so.0" | |||||
| @echo "Linking libjack" | |||||
| $(SILENT)$(CXX) $^ $(SHARED) $(LINK_FLAGS) $(LIBJACK_LIBS) -o $@ | $(SILENT)$(CXX) $^ $(SHARED) $(LINK_FLAGS) $(LIBJACK_LIBS) -o $@ | ||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -21,7 +21,6 @@ | |||||
| #include "CarlaJuceUtils.hpp" | #include "CarlaJuceUtils.hpp" | ||||
| #include <signal.h> | #include <signal.h> | ||||
| #include <sys/prctl.h> | |||||
| #include <sys/time.h> | #include <sys/time.h> | ||||
| // --------------------------------------------------------------------------------------------------------------------- | // --------------------------------------------------------------------------------------------------------------------- | ||||
| @@ -29,8 +29,14 @@ int jack_carla_interposed_action(uint, uint, void*) | |||||
| printWarning = false; | printWarning = false; | ||||
| carla_stderr2("Non-exported jack_carla_interposed_action called, this should not happen!!"); | carla_stderr2("Non-exported jack_carla_interposed_action called, this should not happen!!"); | ||||
| carla_stderr("Printing some info:"); | carla_stderr("Printing some info:"); | ||||
| #ifdef CARLA_OS_MAC | |||||
| carla_stderr("\tDYLD_LIBRARY_PATH: '%s'", std::getenv("DYLD_LIBRARY_PATH")); | |||||
| carla_stderr("\tDYLD_INSERT_LIBRARIES: '%s'", std::getenv("DYLD_INSERT_LIBRARIES")); | |||||
| carla_stderr("\tDYLD_FORCE_FLAT_NAMESPACE: '%s'", std::getenv("DYLD_FORCE_FLAT_NAMESPACE")); | |||||
| #else | |||||
| carla_stderr("\tLD_LIBRARY_PATH: '%s'", std::getenv("LD_LIBRARY_PATH")); | carla_stderr("\tLD_LIBRARY_PATH: '%s'", std::getenv("LD_LIBRARY_PATH")); | ||||
| carla_stderr("\tLD_PRELOAD: '%s'", std::getenv("LD_PRELOAD")); | carla_stderr("\tLD_PRELOAD: '%s'", std::getenv("LD_PRELOAD")); | ||||
| #endif | |||||
| std::fflush(stderr); | std::fflush(stderr); | ||||
| } | } | ||||