/* * DISTRHO Cardinal Plugin * Copyright (C) 2021 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 3 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 LICENSE file. */ #include #include #ifdef NDEBUG # undef DEBUG #endif #include "OpenGL.hpp" #include "DistrhoPluginUtils.hpp" // fix blendish build, missing symbol in debug mode #ifdef DEBUG extern "C" { float bnd_clamp(float v, float mn, float mx) { return (v > mx)?mx:(v < mn)?mn:v; } } #endif // fix bogaudio build, another missing symbol #ifdef DEBUG namespace bogaudio { struct FollowerBase { static float efGainMaxDecibelsDebug; }; float FollowerBase::efGainMaxDecibelsDebug = 12.0f; } #endif // fopen_u8 #ifdef ARCH_WIN #include FILE* fopen_u8(const char* filename, const char* mode) { return _wfopen(rack::string::UTF8toUTF16(filename).c_str(), rack::string::UTF8toUTF16(mode).c_str()); } #endif // Compile those nice implementation-in-header little libraries #define NANOSVG_IMPLEMENTATION #define NANOSVG_ALL_COLOR_KEYWORDS #include // Define the global names to indicate this is Cardinal and not VCVRack namespace rack { const std::string APP_NAME = "Cardinal"; const std::string APP_EDITION = getPluginFormatName(); const std::string APP_EDITION_NAME = "Audio Plugin"; const std::string APP_VERSION_MAJOR = "2"; const std::string APP_VERSION = "2.0"; #if defined(ARCH_WIN) const std::string APP_ARCH = "win"; #elif defined(ARCH_MAC) const std::string APP_ARCH = "mac"; #else const std::string APP_ARCH = "lin"; #endif const std::string API_URL = ""; Exception::Exception(const char* format, ...) { va_list args; va_start(args, format); msg = string::fV(format, args); va_end(args); } } // Custom assets location #include #include #include #include namespace rack { namespace asset { std::string userDir; // ignored std::string systemDir; // points to plugin resources dir (or installed/local Rack dir) std::string bundlePath; // points to plugin manifests dir (or empty) // get rid of "res/" prefix static inline std::string& trim(std::string& s) { if (std::strncmp(s.c_str(), "res" DISTRHO_OS_SEP_STR, 4) == 0) s = s.substr(4, s.size()-4); #if DISTRHO_OS_SEP != '/' if (std::strncmp(s.c_str(), "res/", 4) == 0) s = s.substr(4, s.size()-4); #endif return s; } // ignored, returns the same as `system` std::string user(std::string filename) { return system(filename); } // get system resource, trimming "res/" prefix if we are loaded as a plugin bundle std::string system(std::string filename) { return system::join(systemDir, bundlePath.empty() ? filename : trim(filename)); } // get plugin resource, also trims "res/" as needed std::string plugin(plugin::Plugin* plugin, std::string filename) { DISTRHO_SAFE_ASSERT_RETURN(plugin != nullptr, {}); return system::join(plugin->path, bundlePath.empty() ? filename : trim(filename)); } // path to plugin manifest std::string pluginManifest(const std::string& dirname) { if (bundlePath.empty()) { if (dirname == "Core") return system::join(systemDir, "Core.json"); return system::join(systemDir, "..", "..", "plugins", dirname, "plugin.json"); } return system::join(bundlePath, dirname + ".json"); } // path to plugin files std::string pluginPath(const std::string& dirname) { if (bundlePath.empty()) { if (dirname == "Core") return systemDir; return system::join(systemDir, "..", "..", "plugins", dirname); } return system::join(systemDir, dirname); } } } // Define the stuff needed for VCVRack but unused for Cardinal #include #include namespace rack { namespace library { std::string appChangelogUrl; std::string appDownloadUrl; std::string appVersion; std::string loginStatus; std::map updateInfos; std::string updateStatus; std::string updateSlug; float updateProgress = 0.f; bool isSyncing = false; bool restartRequested = false; void checkAppUpdate() {} void checkUpdates() {} bool hasUpdates() { return false; } bool isAppUpdateAvailable() { return false; } bool isLoggedIn() { return false; } void logIn(const std::string&, const std::string&) {} void logOut() {} void syncUpdate(const std::string&) {} void syncUpdates() {} } namespace network { std::string encodeUrl(const std::string&) { return {}; } json_t* requestJson(Method, const std::string&, json_t*, const CookieMap&) { return nullptr; } bool requestDownload(const std::string&, const std::string&, float*, const CookieMap&) { return false; } } }