| @@ -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 | |||
| // ------------------------------------------------------------------- | |||
| @@ -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) | |||
| @@ -0,0 +1,34 @@ | |||
| /* | |||
| * Carla AU Plugin | |||
| * 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. | |||
| */ | |||
| #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 | |||
| @@ -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)); | |||
| @@ -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)) | |||
| @@ -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 | |||
| } | |||
| @@ -1487,8 +1487,6 @@ private: | |||
| CARLA_BACKEND_END_NAMESPACE | |||
| #else // WANT_LADSPA | |||
| # warning Building without LADSPA support | |||
| #endif | |||
| CARLA_BACKEND_START_NAMESPACE | |||
| @@ -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 | |||
| } | |||
| @@ -1,98 +0,0 @@ | |||
| /* | |||
| * Carla VST Plugin | |||
| * Copyright (C) 2011-2013 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. | |||
| */ | |||
| #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 | |||
| @@ -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; | |||