/* * Carla VST3 utils * Copyright (C) 2021-2022 Filipe Coelho * * 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_VST3_UTILS_HPP_INCLUDED #define CARLA_VST3_UTILS_HPP_INCLUDED #include "CarlaBackend.h" #include "CarlaUtils.hpp" #include "travesty/audio_processor.h" #include "travesty/component.h" #include "travesty/edit_controller.h" #include "travesty/factory.h" #include "travesty/host.h" #if !(defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)) #if defined(__aarch64__) || defined(__arm64__) #define V3_ARCHITECTURE "aarch64" #elif defined(__TARGET_ARCH_ARM) #if __TARGET_ARCH_ARM == 9 #define V3_ARCHITECTURE "armv9l" #elif __TARGET_ARCH_ARM == 8 #define V3_ARCHITECTURE "armv8l" #elif __TARGET_ARCH_ARM == 7 #define V3_ARCHITECTURE "armv7l" #elif _TARGET_ARCH_ARM == 6 #define V3_ARCHITECTURE "armv6l" #elif __TARGET_ARCH_ARM == 5 #define V3_ARCHITECTURE "armv5l" #else #define V3_ARCHITECTURE "arm" #endif #elif defined(__arm__) #define V3_ARCHITECTURE "arm" #elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) #define V3_ARCHITECTURE "x86_64" #elif defined(__i386) || defined(__i386__) #define V3_ARCHITECTURE "i386" #elif defined(__ia64) || defined(__ia64__) #define V3_ARCHITECTURE "ia64" #elif defined(__mips64) #define V3_ARCHITECTURE "mips64" #elif defined(__mips) || defined(__mips__) #define V3_ARCHITECTURE "mips" #elif defined(__ppc64) || defined(__ppc64__) || defined(__powerpc64__) #define V3_ARCHITECTURE "ppc64" #elif defined(__ppc) || defined(__ppc__) || defined(__powerpc__) #define V3_ARCHITECTURE "ppc" #elif defined(__riscv) #if __riscv_xlen == 64 #define V3_ARCHITECTURE "riscv64" #else #define V3_ARCHITECTURE "riscv" #endif #else #define V3_ARCHITECTURE "unknown" #endif #if defined(__HAIKU__) #define V3_PLATFORM "haiku" #elif defined(__linux__) || defined(__linux) #define V3_PLATFORM "linux" #elif defined(__FreeBSD__) #define V3_PLATFORM "freebsd" #elif defined(__NetBSD__) #define V3_PLATFORM "netbsd" #elif defined(__OpenBSD__) #define V3_PLATFORM "openbsd" #elif defined(__GNU__) #define V3_PLATFORM "hurd" #else #define V3_PLATFORM "unknown" #endif #endif #if defined(CARLA_OS_MAC) #define V3_CONTENT_DIR "MacOS" #elif defined(_M_ARM64) #define V3_CONTENT_DIR "aarch64-win" /* TBD */ #elif defined(_M_ARM) #define V3_CONTENT_DIR "arm-win" /* TBD */ #elif defined(CARLA_OS_WIN64) #define V3_CONTENT_DIR "x86_64-win" #elif defined(CARLA_OS_WIN32) #define V3_CONTENT_DIR "x86-win" #else #define V3_CONTENT_DIR V3_ARCHITECTURE "-" V3_PLATFORM #endif #if defined(CARLA_OS_MAC) # define V3_ENTRYFNNAME "bundleEntry" # define V3_EXITFNNAME "bundleExit" typedef void (*V3_ENTRYFN)(void*); typedef void (*V3_EXITFN)(void); #elif defined(CARLA_OS_WIN) # define V3_ENTRYFNNAME "InitDll" # define V3_EXITFNNAME "ExitDll" typedef void (*V3_ENTRYFN)(void); typedef void (*V3_EXITFN)(void); #else # define V3_ENTRYFNNAME "ModuleEntry" # define V3_EXITFNNAME "ModuleExit" typedef void (*V3_ENTRYFN)(void*); typedef void (*V3_EXITFN)(void); #endif #define V3_GETFNNAME "GetPluginFactory" typedef v3_plugin_factory** (*V3_GETFN)(void); CARLA_BACKEND_START_NAMESPACE static inline PluginCategory getPluginCategoryFromV3SubCategories(const char* const subcategories) { if (std::strstr(subcategories, "Instrument") != nullptr) return PLUGIN_CATEGORY_SYNTH; return subcategories[0] != '\0' ? PLUGIN_CATEGORY_OTHER : PLUGIN_CATEGORY_NONE; } static inline constexpr uint32_t v3_cconst(const uint8_t a, const uint8_t b, const uint8_t c, const uint8_t d) noexcept { return static_cast((a << 24) | (b << 16) | (c << 8) | (d << 0)); } static inline const char* tuid2str(const v3_tuid iid) { static char buf[44]; std::snprintf(buf, sizeof(buf), "0x%08X,0x%08X,0x%08X,0x%08X", v3_cconst(iid[ 0], iid[ 1], iid[ 2], iid[ 3]), v3_cconst(iid[ 4], iid[ 5], iid[ 6], iid[ 7]), v3_cconst(iid[ 8], iid[ 9], iid[10], iid[11]), v3_cconst(iid[12], iid[13], iid[14], iid[15])); return buf; } CARLA_BACKEND_END_NAMESPACE #endif // CARLA_VST3_UTILS_HPP_INCLUDED