/* * Carla VST3 Plugin * Copyright (C) 2014-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 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. */ #include "CarlaPluginInternal.hpp" #include "CarlaEngine.hpp" #include "AppConfig.h" #if defined(USING_JUCE) && JUCE_PLUGINHOST_VST3 # define USE_JUCE_FOR_VST3 #endif #include "CarlaVst3Utils.hpp" #include "CarlaPluginUI.hpp" CARLA_BACKEND_START_NAMESPACE // -------------------------------------------------------------------------------------------------------------------- class CarlaPluginVST3 : public CarlaPlugin, private CarlaPluginUI::Callback { public: CarlaPluginVST3(CarlaEngine* const engine, const uint id) : CarlaPlugin(engine, id), fUI() { carla_debug("CarlaPluginVST3::CarlaPluginVST3(%p, %i)", engine, id); } ~CarlaPluginVST3() override { carla_debug("CarlaPluginVST3::~CarlaPluginVST3()"); pData->singleMutex.lock(); pData->masterMutex.lock(); if (pData->client != nullptr && pData->client->isActive()) pData->client->deactivate(true); if (pData->active) { deactivate(); pData->active = false; } } // ------------------------------------------------------------------- // Information (base) PluginType getType() const noexcept override { return PLUGIN_VST3; } // ------------------------------------------------------------------- // Information (count) // nothing // ------------------------------------------------------------------- // Information (per-plugin data) // ------------------------------------------------------------------- // Set data (state) // nothing // ------------------------------------------------------------------- // Set data (internal stuff) // ------------------------------------------------------------------- // Set data (plugin-specific stuff) // ------------------------------------------------------------------- // Set ui stuff // ------------------------------------------------------------------- // Plugin state // ------------------------------------------------------------------- // Plugin processing // ------------------------------------------------------------------- // Plugin buffers // ------------------------------------------------------------------- // Post-poned UI Stuff // nothing // ------------------------------------------------------------------- protected: void handlePluginUIClosed() override { // CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr,); carla_debug("CarlaPluginVST3::handlePluginUIClosed()"); showCustomUI(false); pData->engine->callback(true, true, ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, 0, 0, 0, 0.0f, nullptr); } void handlePluginUIResized(const uint width, const uint height) override { // CARLA_SAFE_ASSERT_RETURN(fUI.window != nullptr,); carla_debug("CarlaPluginVST3::handlePluginUIResized(%u, %u)", width, height); return; // unused (void)width; (void)height; } private: struct UI { bool isEmbed; bool isOpen; bool isVisible; CarlaPluginUI* window; UI() noexcept : isEmbed(false), isOpen(false), isVisible(false), window(nullptr) {} ~UI() { CARLA_ASSERT(isEmbed || ! isVisible); if (window != nullptr) { delete window; window = nullptr; } } CARLA_DECLARE_NON_COPY_STRUCT(UI); } fUI; }; // -------------------------------------------------------------------------------------------------------------------- CarlaPluginPtr CarlaPlugin::newVST3(const Initializer& init) { carla_debug("CarlaPlugin::newVST3({%p, \"%s\", \"%s\", " P_INT64 "})", init.engine, init.filename, init.name, init.uniqueId); #ifdef USE_JUCE_FOR_VST3 if (std::getenv("CARLA_DO_NOT_USE_JUCE_FOR_VST3") == nullptr) return newJuce(init, "VST3"); #endif init.engine->setLastError("VST3 support not available"); return nullptr; /* std::shared_ptr plugin(new CarlaPluginVST2(init.engine, init.id)); if (! plugin->init(plugin, init.filename, init.name, init.uniqueId, init.options)) return nullptr; return plugin; */ } // ------------------------------------------------------------------------------------------------------------------- CARLA_BACKEND_END_NAMESPACE