From 26a2f4a447c77b20580929c10269eb3c44061a97 Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 7 Jan 2014 20:40:07 +0000 Subject: [PATCH] Make it possible to switch between some plugin type backends --- source/backend/CarlaPlugin.hpp | 6 +- source/backend/engine/CarlaEngine.cpp | 47 ++++++++++ source/backend/plugin/AuPlugin.cpp | 34 +++++++ source/backend/plugin/CsoundPlugin.cpp | 2 +- source/backend/plugin/FluidSynthPlugin.cpp | 4 +- source/backend/plugin/JucePlugin.cpp | 7 +- source/backend/plugin/LadspaPlugin.cpp | 2 - source/backend/plugin/LinuxSamplerPlugin.cpp | 75 +++++++-------- source/backend/plugin/Vst3Plugin.cpp | 98 -------------------- source/backend/plugin/VstPlugin.cpp | 4 + 10 files changed, 129 insertions(+), 150 deletions(-) create mode 100644 source/backend/plugin/AuPlugin.cpp delete mode 100644 source/backend/plugin/Vst3Plugin.cpp diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp index 851bb7fd9..1b7253276 100644 --- a/source/backend/CarlaPlugin.hpp +++ b/source/backend/CarlaPlugin.hpp @@ -841,11 +841,15 @@ public: static CarlaPlugin* newDSSI(const Initializer& init); static CarlaPlugin* newLV2(const Initializer& init); static CarlaPlugin* newVST(const Initializer& init); + static CarlaPlugin* newAU(const Initializer& init); static CarlaPlugin* newCSOUND(const Initializer& init); static CarlaPlugin* newGIG(const Initializer& init, const bool use16Outs); static CarlaPlugin* newSF2(const Initializer& init, const bool use16Outs); static CarlaPlugin* newSFZ(const Initializer& init, const bool use16Outs); - static CarlaPlugin* newJuce(const Initializer& init); + + static CarlaPlugin* newJuce(const Initializer& init, const char* const format); + static CarlaPlugin* newFluidSynth(const Initializer& init, const bool use16Outs); + static CarlaPlugin* newLinuxSampler(const Initializer& init, const char* const format, const bool use16Outs); #endif // ------------------------------------------------------------------- diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 1477542a2..91ed5047b 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -447,6 +447,53 @@ void CarlaEngineProtectedData::processRackFull(float** const inBuf, const uint32 } #endif +// ----------------------------------------------------------------------- + +CarlaPlugin* CarlaPlugin::newGIG(const Initializer& init, const bool use16Outs) +{ + carla_debug("CarlaPlugin::newGIG({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs)); +#ifdef WANT_LINUXSAMPLER + return newLinuxSampler(init, "GIG", use16Outs); +#else + init.engine->setLastError("GIG support not available"); + return nullptr; + + // unused + (void)use16Outs; +#endif +} + +CarlaPlugin* CarlaPlugin::newSF2(const Initializer& init, const bool use16Outs) +{ + carla_debug("CarlaPlugin::newSF2({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs)); +// #if defined(WANT_FLUIDSYNTH) +// return newFluidSynth(init, use16Outs); +// #el +#if defined(WANT_LINUXSAMPLER) + return newLinuxSampler(init, "SF2", use16Outs); +#else + init.engine->setLastError("SF2 support not available"); + return nullptr; + + // unused + (void)use16Outs; +#endif +} + +CarlaPlugin* CarlaPlugin::newSFZ(const Initializer& init, const bool use16Outs) +{ + carla_debug("CarlaPlugin::newSFZ({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs)); +#ifdef WANT_LINUXSAMPLER + return newLinuxSampler(init, "SFZ", use16Outs); +#else + init.engine->setLastError("SFZ support not available"); + return nullptr; + + // unused + (void)use16Outs; +#endif +} + // ----------------------------------------------------------------------- // Carla Engine port (Abstract) diff --git a/source/backend/plugin/AuPlugin.cpp b/source/backend/plugin/AuPlugin.cpp new file mode 100644 index 000000000..3e417d97b --- /dev/null +++ b/source/backend/plugin/AuPlugin.cpp @@ -0,0 +1,34 @@ +/* + * Carla AU Plugin + * Copyright (C) 2014 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" + +CARLA_BACKEND_START_NAMESPACE + +CarlaPlugin* CarlaPlugin::newAU(const Initializer& init) +{ + carla_debug("CarlaPlugin::newAU({%p, \"%s\", \"%s\"})", init.engine, init.filename, init.name); + +#if defined(WANT_AU) && defined(HAVE_JUCE) + return newJuce(init, "AU"); +#else + init.engine->setLastError("AU support not available"); + return nullptr; +#endif +} + +CARLA_BACKEND_END_NAMESPACE diff --git a/source/backend/plugin/CsoundPlugin.cpp b/source/backend/plugin/CsoundPlugin.cpp index d42e5584a..cba33d7d3 100644 --- a/source/backend/plugin/CsoundPlugin.cpp +++ b/source/backend/plugin/CsoundPlugin.cpp @@ -83,7 +83,7 @@ CARLA_BACKEND_START_NAMESPACE CarlaPlugin* CarlaPlugin::newCSOUND(const Initializer& init) { - carla_debug("CarlaPlugin::newCsound(%p, \"%s\", \"%s\", \"%s\")", init.engine, init.filename, init.name, init.label); + carla_debug("CarlaPlugin::newCSOUND(%p, \"%s\", \"%s\", \"%s\")", init.engine, init.filename, init.name, init.label); #ifdef WANT_CSOUND CsoundPlugin* const plugin(new CsoundPlugin(init.engine, init.id)); diff --git a/source/backend/plugin/FluidSynthPlugin.cpp b/source/backend/plugin/FluidSynthPlugin.cpp index 3d4b56e70..8d5facac3 100644 --- a/source/backend/plugin/FluidSynthPlugin.cpp +++ b/source/backend/plugin/FluidSynthPlugin.cpp @@ -1669,9 +1669,9 @@ CARLA_BACKEND_END_NAMESPACE CARLA_BACKEND_START_NAMESPACE -CarlaPlugin* CarlaPlugin::newSF2(const Initializer& init, const bool use16Outs) +CarlaPlugin* CarlaPlugin::newFluidSynth(const Initializer& init, const bool use16Outs) { - carla_debug("CarlaPlugin::newSF2({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs)); + carla_debug("CarlaPlugin::newFluidSynth({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs)); #ifdef WANT_FLUIDSYNTH if (! fluid_is_soundfont(init.filename)) diff --git a/source/backend/plugin/JucePlugin.cpp b/source/backend/plugin/JucePlugin.cpp index 5cc5c2420..99412df9e 100644 --- a/source/backend/plugin/JucePlugin.cpp +++ b/source/backend/plugin/JucePlugin.cpp @@ -67,9 +67,9 @@ CARLA_BACKEND_END_NAMESPACE CARLA_BACKEND_START_NAMESPACE -CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init) +CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init, const char* const format) { - carla_debug("CarlaPlugin::newJuce({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label); + carla_debug("CarlaPlugin::newJuce({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, format); #if 0 //def HAVE_JUCE JucePlugin* const plugin(new JucePlugin(init.engine, init.id)); @@ -93,6 +93,9 @@ CarlaPlugin* CarlaPlugin::newJuce(const Initializer& init) #else init.engine->setLastError("Juce support not available"); return nullptr; + + // unused + (void)format; #endif } diff --git a/source/backend/plugin/LadspaPlugin.cpp b/source/backend/plugin/LadspaPlugin.cpp index 5f66d39f1..7405a9b6f 100644 --- a/source/backend/plugin/LadspaPlugin.cpp +++ b/source/backend/plugin/LadspaPlugin.cpp @@ -1487,8 +1487,6 @@ private: CARLA_BACKEND_END_NAMESPACE -#else // WANT_LADSPA -# warning Building without LADSPA support #endif CARLA_BACKEND_START_NAMESPACE diff --git a/source/backend/plugin/LinuxSamplerPlugin.cpp b/source/backend/plugin/LinuxSamplerPlugin.cpp index 11d04f977..c106cccab 100644 --- a/source/backend/plugin/LinuxSamplerPlugin.cpp +++ b/source/backend/plugin/LinuxSamplerPlugin.cpp @@ -163,10 +163,10 @@ CARLA_BACKEND_START_NAMESPACE class LinuxSamplerPlugin : public CarlaPlugin { public: - LinuxSamplerPlugin(CarlaEngine* const engine, const unsigned int id, const bool isGIG, const bool use16Outs) + LinuxSamplerPlugin(CarlaEngine* const engine, const unsigned int id, const char* const format, const bool use16Outs) : CarlaPlugin(engine, id), - kIsGIG(isGIG), - kUses16Outs(use16Outs), + fFormat(carla_strdup(format)), + fUses16Outs(use16Outs), fSampler(new LinuxSampler::Sampler()), fSamplerChannel(nullptr), fEngine(nullptr), @@ -216,6 +216,12 @@ public: fInstrumentIds.clear(); + if (fFormat != nullptr) + { + delete[] fFormat; + fFormat = nullptr; + } + clearBuffers(); } @@ -224,7 +230,7 @@ public: PluginType getType() const noexcept override { - return kIsGIG ? PLUGIN_GIG : PLUGIN_SFZ; + return getPluginTypeFromString(fFormat); } PluginCategory getCategory() const override @@ -934,7 +940,7 @@ public: const void* getExtraStuff() const noexcept override { - return kUses16Outs ? (const void*)0x1 : nullptr; + return fUses16Outs ? (const void*)0x1 : nullptr; } bool init(const char* filename, const char* const name, const char* label) @@ -985,10 +991,11 @@ public: // --------------------------------------------------------------- // Create the LinuxSampler Engine - const char* const stype = kIsGIG ? "gig" : "sfz"; + CarlaString stype(fFormat); + stype.toLower(); try { - fEngine = LinuxSampler::EngineFactory::Create(stype); + fEngine = LinuxSampler::EngineFactory::Create((const char*)stype); } catch (LinuxSampler::Exception& e) { @@ -1052,7 +1059,7 @@ public: fMaker = info.Artists.c_str(); pData->filename = carla_strdup(filename); - if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) + if (fUses16Outs && ! fLabel.endsWith(" (16 outs)")) fLabel += " (16 outs)"; if (name != nullptr) @@ -1077,7 +1084,7 @@ public: // Init LinuxSampler stuff fSamplerChannel = fSampler->AddSamplerChannel(); - fSamplerChannel->SetEngineType(stype); + fSamplerChannel->SetEngineType((const char*)stype); fSamplerChannel->SetAudioOutputDevice(fAudioOutputDevice); fEngineChannel = fSamplerChannel->GetEngineChannel(); @@ -1098,7 +1105,8 @@ public: pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; // set identifier string - CarlaString identifier(kIsGIG ? "GIG/" : "SFZ/"); + CarlaString identifier(fFormat); + identifier += "/"; if (const char* const shortname = std::strrchr(filename, OS_SEP)) identifier += shortname+1; @@ -1116,11 +1124,9 @@ public: // ------------------------------------------------------------------- - static CarlaPlugin* newLinuxSampler(const Initializer& init, bool isGIG, const bool use16Outs); - private: - const bool kIsGIG; // sfz if false - const bool kUses16Outs; + const char* fFormat; + const bool fUses16Outs; CarlaString fRealName; CarlaString fLabel; @@ -1142,17 +1148,24 @@ private: CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LinuxSamplerPlugin) }; -CarlaPlugin* LinuxSamplerPlugin::newLinuxSampler(const Initializer& init, const bool isGIG, const bool use16Outs) +CARLA_BACKEND_END_NAMESPACE + +#endif // WANT_LINUXSAMPLER + +CARLA_BACKEND_START_NAMESPACE + +CarlaPlugin* CarlaPlugin::newLinuxSampler(const Initializer& init, const char* const format, const bool use16Outs) { - carla_debug("LinuxSamplerPlugin::newLinuxSampler({%p, \"%s\", \"%s\", \"%s\"}, %s, %s)", init.engine, init.filename, init.name, init.label, bool2str(isGIG), bool2str(use16Outs)); + carla_debug("LinuxSamplerPlugin::newLinuxSampler({%p, \"%s\", \"%s\", \"%s\"}, %s, %s)", init.engine, init.filename, init.name, init.label, format, bool2str(use16Outs)); +#ifdef WANT_FLUIDSYNTH if (init.engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK && use16Outs) { init.engine->setLastError("Carla's rack mode can only work with Stereo modules, please choose the 2-channel only sample-library version"); return nullptr; } - LinuxSamplerPlugin* const plugin(new LinuxSamplerPlugin(init.engine, init.id, isGIG, use16Outs)); + LinuxSamplerPlugin* const plugin(new LinuxSamplerPlugin(init.engine, init.id, format, use16Outs)); if (! plugin->init(init.filename, init.name, init.label)) { @@ -1163,38 +1176,12 @@ CarlaPlugin* LinuxSamplerPlugin::newLinuxSampler(const Initializer& init, const plugin->reload(); return plugin; -} - -CARLA_BACKEND_END_NAMESPACE - -#endif // WANT_LINUXSAMPLER - -CARLA_BACKEND_START_NAMESPACE - -CarlaPlugin* CarlaPlugin::newGIG(const Initializer& init, const bool use16Outs) -{ - carla_debug("CarlaPlugin::newGIG({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs)); -#ifdef WANT_LINUXSAMPLER - return LinuxSamplerPlugin::newLinuxSampler(init, true, use16Outs); -#else - init.engine->setLastError("linuxsampler support not available"); - return nullptr; - - // unused - (void)use16Outs; -#endif -} - -CarlaPlugin* CarlaPlugin::newSFZ(const Initializer& init, const bool use16Outs) -{ - carla_debug("CarlaPlugin::newSFZ({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs)); -#ifdef WANT_LINUXSAMPLER - return LinuxSamplerPlugin::newLinuxSampler(init, false, use16Outs); #else init.engine->setLastError("linuxsampler support not available"); return nullptr; // unused + (void)format; (void)use16Outs; #endif } diff --git a/source/backend/plugin/Vst3Plugin.cpp b/source/backend/plugin/Vst3Plugin.cpp deleted file mode 100644 index d7a3555c9..000000000 --- a/source/backend/plugin/Vst3Plugin.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Carla VST Plugin - * Copyright (C) 2011-2013 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" - -#ifdef WANT_VST3 - -//#include "CarlaVstUtils.hpp" - -CARLA_BACKEND_START_NAMESPACE - -class Vst3Plugin : public CarlaPlugin -{ -public: - Vst3Plugin(CarlaEngine* const engine, const unsigned short id) - : CarlaPlugin(engine, id) - { - carla_debug("Vst3Plugin::Vst3Plugin(%p, %i)", engine, id); - } - - ~Vst3Plugin() override - { - carla_debug("Vst3Plugin::~Vst3Plugin()"); - - pData->singleMutex.lock(); - pData->masterMutex.lock(); - - if (pData->client != nullptr && pData->client->isActive()) - pData->client->deactivate(); - } - - // ------------------------------------------------------------------- - // Information (base) - - PluginType type() const override - { - return PLUGIN_VST3; - } - -private: - CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Vst3Plugin) -}; - -CARLA_BACKEND_END_NAMESPACE - -#else // WANT_VST3 -// no point on warning when the plugin doesn't even work yet -// # warning Building without VST3 support -#endif - -CARLA_BACKEND_START_NAMESPACE - -#if 0 -CarlaPlugin* CarlaPlugin::newVST3(const Initializer& init) -{ - carla_debug("CarlaPlugin::newVST3(%p, \"%s\", \"%s\", \"%s\")", init.engine, init.filename, init.name, init.label); - -#ifdef WANT_VST3 - Vst3Plugin* const plugin = new Vst3Plugin(init.engine, init.id); - - //if (! plugin->init(init.filename, init.name, init.label)) - { - delete plugin; - return nullptr; - } - - plugin->reload(); - - if (init.engine->getProccessMode() == PROCESS_MODE_CONTINUOUS_RACK && ! CarlaPluginProtectedData::canRunInRack(plugin)) - { - init.engine->setLastError("Carla's rack mode can only work with Stereo VST3 plugins, sorry!"); - delete plugin; - return nullptr; - } - - return plugin; -#else - init.engine->setLastError("VST3 support not available"); - return nullptr; -#endif -} -#endif - -CARLA_BACKEND_END_NAMESPACE diff --git a/source/backend/plugin/VstPlugin.cpp b/source/backend/plugin/VstPlugin.cpp index 6d0cebed0..bae2cbb18 100644 --- a/source/backend/plugin/VstPlugin.cpp +++ b/source/backend/plugin/VstPlugin.cpp @@ -2540,6 +2540,9 @@ CarlaPlugin* CarlaPlugin::newVST(const Initializer& init) carla_debug("CarlaPlugin::newVST({%p, \"%s\", \"%s\"})", init.engine, init.filename, init.name); #ifdef WANT_VST +# if defined(HAVE_JUCE) && ! defined(VESTIGE_HEADER) + return newJuce(init, "VST"); +# else VstPlugin* const plugin(new VstPlugin(init.engine, init.id)); if (! plugin->init(init.filename, init.name)) @@ -2558,6 +2561,7 @@ CarlaPlugin* CarlaPlugin::newVST(const Initializer& init) } return plugin; +# endif #else init.engine->setLastError("VST support not available"); return nullptr;