| @@ -56,6 +56,7 @@ CARLA_VST_UTILS_HPP = $(CWD)/utils/CarlaVstUtils.hpp $(CARLA_UTILS_HPP) | |||||
| # utils (misc stuff) | # utils (misc stuff) | ||||
| CARLA_BACKEND_UTILS_HPP = $(CWD)/utils/CarlaBackendUtils.hpp $(CARLA_BACKEND_H) $(CARLA_HOST_H) $(CARLA_STRING_HPP) | 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_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_ENGINE_UTILS_HPP = $(CWD)/utils/CarlaEngineUtils.hpp $(CARLA_ENGINE_HPP) $(CARLA_UTILS_HPP) | ||||
| CARLA_PATCHBAY_UTILS_HPP = $(CWD)/utils/CarlaPatchbayUtils.hpp $(LINKED_LIST_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_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_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_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_CLIENT_CPP_DEPS = $(CARLA_ENGINE_UTILS_HPP) | ||||
| CARLA_ENGINE_DATA_CPP_DEPS = $(CARLA_ENGINE_HPP) $(CARLA_MATH_UTILS_HPP) $(CARLA_MIDI_H) | 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_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_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_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_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_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) | 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) | $(error liblo missing, cannot continue) | ||||
| endif | 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) | # Check for optional libs (required by backend or bridges) | ||||
| @@ -69,6 +69,10 @@ ifeq ($(HAVE_X11),true) | |||||
| STANDALONE_FLAGS += $(X11_LIBS) | STANDALONE_FLAGS += $(X11_LIBS) | ||||
| endif | endif | ||||
| ifeq ($(LINUX),true) | |||||
| STANDALONE_FLAGS += -lmagic | |||||
| endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| OBJS = \ | OBJS = \ | ||||
| @@ -27,6 +27,7 @@ | |||||
| #include "CarlaPlugin.hpp" | #include "CarlaPlugin.hpp" | ||||
| #include "CarlaBackendUtils.hpp" | #include "CarlaBackendUtils.hpp" | ||||
| #include "CarlaBinaryUtils.hpp" | |||||
| #include "CarlaEngineUtils.hpp" | #include "CarlaEngineUtils.hpp" | ||||
| #include "CarlaMathUtils.hpp" | #include "CarlaMathUtils.hpp" | ||||
| #include "CarlaStateUtils.hpp" | #include "CarlaStateUtils.hpp" | ||||
| @@ -989,6 +990,7 @@ bool CarlaEngine::loadProject(const char* const filename) | |||||
| // check if using GIG or SF2 16outs | // check if using GIG or SF2 16outs | ||||
| static const char kUse16OutsSuffix[] = " (16 outs)"; | static const char kUse16OutsSuffix[] = " (16 outs)"; | ||||
| const BinaryType btype(getBinaryTypeFromFile(stateSave.binary)); | |||||
| const PluginType ptype(getPluginTypeFromString(stateSave.type)); | const PluginType ptype(getPluginTypeFromString(stateSave.type)); | ||||
| if (CarlaString(stateSave.label).endsWith(kUse16OutsSuffix)) | if (CarlaString(stateSave.label).endsWith(kUse16OutsSuffix)) | ||||
| @@ -999,7 +1001,7 @@ bool CarlaEngine::loadProject(const char* const filename) | |||||
| // TODO - proper find&load plugins | // 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)) | if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) | ||||
| plugin->loadStateSave(stateSave); | plugin->loadStateSave(stateSave); | ||||
| @@ -28,6 +28,7 @@ | |||||
| #include "CarlaPlugin.hpp" | #include "CarlaPlugin.hpp" | ||||
| #include "CarlaBackendUtils.hpp" | #include "CarlaBackendUtils.hpp" | ||||
| #include "CarlaBinaryUtils.hpp" | |||||
| #include "CarlaMathUtils.hpp" | #include "CarlaMathUtils.hpp" | ||||
| #include "CarlaStateUtils.hpp" | #include "CarlaStateUtils.hpp" | ||||
| @@ -1355,6 +1356,7 @@ protected: | |||||
| // check if using GIG or SF2 16outs | // check if using GIG or SF2 16outs | ||||
| static const char kUse16OutsSuffix[] = " (16 outs)"; | static const char kUse16OutsSuffix[] = " (16 outs)"; | ||||
| const BinaryType btype(getBinaryTypeFromFile(stateSave.binary)); | |||||
| const PluginType ptype(getPluginTypeFromString(stateSave.type)); | const PluginType ptype(getPluginTypeFromString(stateSave.type)); | ||||
| if (CarlaString(stateSave.label).endsWith(kUse16OutsSuffix)) | if (CarlaString(stateSave.label).endsWith(kUse16OutsSuffix)) | ||||
| @@ -1365,7 +1367,7 @@ protected: | |||||
| // TODO - proper find&load plugins | // 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)) | if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) | ||||
| plugin->loadStateSave(stateSave); | plugin->loadStateSave(stateSave); | ||||
| @@ -140,6 +140,9 @@ void CarlaPluginThread::run() | |||||
| if (name.isEmpty()) | if (name.isEmpty()) | ||||
| name = "(none)"; | name = "(none)"; | ||||
| if (fLabel.isEmpty()) | |||||
| fLabel = "\"\""; | |||||
| StringArray arguments; | StringArray arguments; | ||||
| #ifndef CARLA_OS_WIN | #ifndef CARLA_OS_WIN | ||||
| @@ -45,8 +45,9 @@ ifeq ($(HAVE_X11),true) | |||||
| LINK_FLAGS += $(X11_LIBS) | LINK_FLAGS += $(X11_LIBS) | ||||
| endif | endif | ||||
| # -------------------------------------------------------------- | |||||
| # Native | |||||
| ifeq ($(LINUX),true) | |||||
| LINK_FLAGS += -lmagic | |||||
| endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # Libs | # 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 | |||||