| @@ -56,6 +56,7 @@ CARLA_VST_UTILS_HPP = $(CWD)/utils/CarlaVstUtils.hpp $(CARLA_UTILS_HPP) | |||
| # utils (misc stuff) | |||
| CARLA_BACKEND_UTILS_HPP = $(CWD)/utils/CarlaBackendUtils.hpp $(CARLA_BACKEND_H) $(CARLA_HOST_H) $(CARLA_STRING_HPP) | |||
| CARLA_BINARY_UTILS_HPP = $(CWD)/utils/CarlaBinaryUtils.hpp $(CARLA_BACKEND_H) $(CARLA_UTILS_HPP) | |||
| CARLA_BRIDGE_UTILS_HPP = $(CWD)/utils/CarlaBridgeUtils.hpp $(CARLA_RING_BUFFER_HPP) | |||
| CARLA_ENGINE_UTILS_HPP = $(CWD)/utils/CarlaEngineUtils.hpp $(CARLA_ENGINE_HPP) $(CARLA_UTILS_HPP) | |||
| CARLA_PATCHBAY_UTILS_HPP = $(CWD)/utils/CarlaPatchbayUtils.hpp $(LINKED_LIST_HPP) | |||
| @@ -89,7 +90,7 @@ CARLA_ENGINE_GRAPH_HPP = $(CWD)/backend/engine/CarlaEngineGraph.hpp $ | |||
| CARLA_ENGINE_THREAD_HPP = $(CWD)/backend/engine/CarlaEngineThread.hpp $(CARLA_BACKEND_H) $(CARLA_THREAD_HPP) | |||
| CARLA_ENGINE_INTERNAL_HPP = $(CWD)/backend/engine/CarlaEngineInternal.hpp $(CARLA_ENGINE_OSC_HPP) $(CARLA_ENGINE_THREAD_HPP) $(CARLA_ENGINE_UTILS_HPP) | |||
| CARLA_ENGINE_CPP_DEPS = $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_PLUGIN_HPP) $(CARLA_BACKEND_UTILS_HPP) $(CARLA_ENGINE_UTILS_HPP) $(CARLA_MATH_UTILS_HPP) $(CARLA_STATE_UTILS_HPP) $(CARLA_MIDI_H) $(JACK_BRIDGE_HPP) | |||
| CARLA_ENGINE_CPP_DEPS = $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_PLUGIN_HPP) $(CARLA_BACKEND_UTILS_HPP) $(CARLA_BINARY_UTILS_HPP) $(CARLA_ENGINE_UTILS_HPP) $(CARLA_MATH_UTILS_HPP) $(CARLA_STATE_UTILS_HPP) $(CARLA_MIDI_H) $(JACK_BRIDGE_HPP) | |||
| CARLA_ENGINE_BRIDGE_CPP_DEPS = $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_PLUGIN_HPP) $(CARLA_BACKEND_UTILS_HPP) $(CARLA_BRIDGE_UTILS_HPP) $(CARLA_MIDI_H) $(JACK_BRIDGE_HPP) | |||
| CARLA_ENGINE_CLIENT_CPP_DEPS = $(CARLA_ENGINE_UTILS_HPP) | |||
| CARLA_ENGINE_DATA_CPP_DEPS = $(CARLA_ENGINE_HPP) $(CARLA_MATH_UTILS_HPP) $(CARLA_MIDI_H) | |||
| @@ -97,7 +98,7 @@ CARLA_ENGINE_GRAPH_CPP_DEPS = $(CARLA_ENGINE_GRAPH_HPP) $(CARLA_ENGINE_INTERN | |||
| CARLA_ENGINE_INTERNAL_CPP_DEPS = $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_PLUGIN_HPP) | |||
| CARLA_ENGINE_JACK_CPP_DEPS = $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_PLUGIN_HPP) $(CARLA_BACKEND_UTILS_HPP) $(CARLA_ENGINE_UTILS_HPP) $(CARLA_MATH_UTILS_HPP) $(CARLA_MIDI_H) $(CARLA_PATCHBAY_UTILS_HPP) $(JACK_BRIDGE_HPP) | |||
| CARLA_ENGINE_JUCE_CPP_DEPS = $(CARLA_ENGINE_GRAPH_HPP) $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_BACKEND_UTILS_HPP) $(CARLA_STRING_LIST_HPP) $(RT_LINKED_LIST_HPP) | |||
| CARLA_ENGINE_NATIVE_CPP_DEPS = $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_PLUGIN_HPP) $(CARLA_BACKEND_UTILS_HPP) $(CARLA_MATH_UTILS_HPP) $(CARLA_STATE_UTILS_HPP) $(CARLA_EXTERNAL_UI_HPP) $(CARLA_NATIVE_HPP) $(CARLA_DSSI_UTILS_CPP) $(CARLA_STATE_UTILS_CPP) | |||
| CARLA_ENGINE_NATIVE_CPP_DEPS = $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_PLUGIN_HPP) $(CARLA_BACKEND_UTILS_HPP) $(CARLA_BINARY_UTILS_HPP) $(CARLA_MATH_UTILS_HPP) $(CARLA_STATE_UTILS_HPP) $(CARLA_EXTERNAL_UI_HPP) $(CARLA_NATIVE_HPP) $(CARLA_DSSI_UTILS_CPP) $(CARLA_STATE_UTILS_CPP) | |||
| CARLA_ENGINE_OSC_CPP_DEPS = $(CARLA_ENGINE_HPP) $(CARLA_ENGINE_OSC_HPP) $(CARLA_PLUGIN_HPP) $(CARLA_BRIDGE_UTILS_HPP) $(CARLA_MIDI_H) | |||
| CARLA_ENGINE_OSC_SEND_CPP_DEPS = $(CARLA_BACKEND_UTILS_HPP) $(CARLA_ENGINE_INTERNAL_HPP) $(CARLA_MIDI_H) | |||
| CARLA_ENGINE_PORTS_CPP_DEPS = $(CARLA_ENGINE_UTILS_HPP) $(CARLA_MATH_UTILS_HPP) $(CARLA_MIDI_H) | |||
| @@ -135,6 +135,12 @@ ifneq ($(shell pkg-config --exists liblo && echo true),true) | |||
| $(error liblo missing, cannot continue) | |||
| endif | |||
| ifeq ($(LINUX),true) | |||
| ifeq (,$(wildcard /usr/include/magic.h)) | |||
| $(error libmagic missing, cannot continue) | |||
| endif | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| # Check for optional libs (required by backend or bridges) | |||
| @@ -69,6 +69,10 @@ ifeq ($(HAVE_X11),true) | |||
| STANDALONE_FLAGS += $(X11_LIBS) | |||
| endif | |||
| ifeq ($(LINUX),true) | |||
| STANDALONE_FLAGS += -lmagic | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| OBJS = \ | |||
| @@ -27,6 +27,7 @@ | |||
| #include "CarlaPlugin.hpp" | |||
| #include "CarlaBackendUtils.hpp" | |||
| #include "CarlaBinaryUtils.hpp" | |||
| #include "CarlaEngineUtils.hpp" | |||
| #include "CarlaMathUtils.hpp" | |||
| #include "CarlaStateUtils.hpp" | |||
| @@ -989,6 +990,7 @@ bool CarlaEngine::loadProject(const char* const filename) | |||
| // check if using GIG or SF2 16outs | |||
| static const char kUse16OutsSuffix[] = " (16 outs)"; | |||
| const BinaryType btype(getBinaryTypeFromFile(stateSave.binary)); | |||
| const PluginType ptype(getPluginTypeFromString(stateSave.type)); | |||
| if (CarlaString(stateSave.label).endsWith(kUse16OutsSuffix)) | |||
| @@ -999,7 +1001,7 @@ bool CarlaEngine::loadProject(const char* const filename) | |||
| // TODO - proper find&load plugins | |||
| if (addPlugin(ptype, stateSave.binary, stateSave.name, stateSave.label, stateSave.uniqueId, extraStuff)) | |||
| if (addPlugin(btype, ptype, stateSave.binary, stateSave.name, stateSave.label, stateSave.uniqueId, extraStuff)) | |||
| { | |||
| if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) | |||
| plugin->loadStateSave(stateSave); | |||
| @@ -28,6 +28,7 @@ | |||
| #include "CarlaPlugin.hpp" | |||
| #include "CarlaBackendUtils.hpp" | |||
| #include "CarlaBinaryUtils.hpp" | |||
| #include "CarlaMathUtils.hpp" | |||
| #include "CarlaStateUtils.hpp" | |||
| @@ -1355,6 +1356,7 @@ protected: | |||
| // check if using GIG or SF2 16outs | |||
| static const char kUse16OutsSuffix[] = " (16 outs)"; | |||
| const BinaryType btype(getBinaryTypeFromFile(stateSave.binary)); | |||
| const PluginType ptype(getPluginTypeFromString(stateSave.type)); | |||
| if (CarlaString(stateSave.label).endsWith(kUse16OutsSuffix)) | |||
| @@ -1365,7 +1367,7 @@ protected: | |||
| // TODO - proper find&load plugins | |||
| if (addPlugin(ptype, stateSave.binary, stateSave.name, stateSave.label, stateSave.uniqueId, extraStuff)) | |||
| if (addPlugin(btype, ptype, stateSave.binary, stateSave.name, stateSave.label, stateSave.uniqueId, extraStuff)) | |||
| { | |||
| if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) | |||
| plugin->loadStateSave(stateSave); | |||
| @@ -140,6 +140,9 @@ void CarlaPluginThread::run() | |||
| if (name.isEmpty()) | |||
| name = "(none)"; | |||
| if (fLabel.isEmpty()) | |||
| fLabel = "\"\""; | |||
| StringArray arguments; | |||
| #ifndef CARLA_OS_WIN | |||
| @@ -45,8 +45,9 @@ ifeq ($(HAVE_X11),true) | |||
| LINK_FLAGS += $(X11_LIBS) | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| # Native | |||
| ifeq ($(LINUX),true) | |||
| LINK_FLAGS += -lmagic | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| # Libs | |||
| @@ -0,0 +1,100 @@ | |||
| /* | |||
| * Carla binary utils | |||
| * Copyright (C) 2014 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 | |||
| * published by the Free Software Foundation; either version 2 of | |||
| * the License, or any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
| */ | |||
| #ifndef CARLA_BINARY_UTILS_HPP_INCLUDED | |||
| #define CARLA_BINARY_UTILS_HPP_INCLUDED | |||
| #include "CarlaBackend.h" | |||
| #include "CarlaUtils.hpp" | |||
| #ifdef CARLA_OS_LINUX | |||
| # include "magic.h" | |||
| #endif | |||
| CARLA_BACKEND_START_NAMESPACE | |||
| #ifdef CARLA_OS_LINUX | |||
| // ----------------------------------------------------------------------- | |||
| class CarlaMagic | |||
| { | |||
| public: | |||
| CarlaMagic() | |||
| : fMagic(magic_open(MAGIC_SYMLINK)) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(fMagic != nullptr,); | |||
| magic_load(fMagic, nullptr); | |||
| } | |||
| ~CarlaMagic() | |||
| { | |||
| if (fMagic != nullptr) | |||
| magic_close(fMagic); | |||
| } | |||
| const char* getFileDescription(const char* const filename) const | |||
| { | |||
| if (fMagic == nullptr) | |||
| return nullptr; | |||
| return magic_file(fMagic, filename); | |||
| } | |||
| private: | |||
| const magic_t fMagic; | |||
| }; | |||
| static const CarlaMagic& getCarlaMagicInstance() | |||
| { | |||
| static CarlaMagic magic; | |||
| return magic; | |||
| } | |||
| #endif | |||
| // ----------------------------------------------------------------------- | |||
| static inline | |||
| BinaryType getBinaryTypeFromFile(const char* const filename) | |||
| { | |||
| carla_stdout("getBinaryTypeFromFile(\"%s\")", filename); | |||
| #ifdef CARLA_OS_LINUX | |||
| if (filename == nullptr || filename[0] == '\0') | |||
| return BINARY_NATIVE; | |||
| const CarlaMagic& magic(getCarlaMagicInstance()); | |||
| const char* const output(magic.getFileDescription(filename)); | |||
| if (output == nullptr || output[0] == '\0') | |||
| return BINARY_NATIVE; | |||
| if (std::strstr(output, "PE32 executable") != nullptr && std::strstr(output, "MS Windows") != nullptr) | |||
| return std::strstr(output, "x86-64") != nullptr ? BINARY_WIN64 : BINARY_WIN32; | |||
| if (std::strstr(output, "ELF") != nullptr) | |||
| return (std::strstr(output, "x86-64") != nullptr || std::strstr(output, "aarch64") != nullptr) ? BINARY_POSIX64 : BINARY_POSIX32; | |||
| #endif | |||
| return BINARY_NATIVE; | |||
| } | |||
| // ----------------------------------------------------------------------- | |||
| CARLA_BACKEND_END_NAMESPACE | |||
| #endif // CARLA_BINARY_UTILS_HPP_INCLUDED | |||