Browse Source

Make it possible to switch between some plugin type backends

tags/1.9.4
falkTX 12 years ago
parent
commit
26a2f4a447
10 changed files with 129 additions and 150 deletions
  1. +5
    -1
      source/backend/CarlaPlugin.hpp
  2. +47
    -0
      source/backend/engine/CarlaEngine.cpp
  3. +34
    -0
      source/backend/plugin/AuPlugin.cpp
  4. +1
    -1
      source/backend/plugin/CsoundPlugin.cpp
  5. +2
    -2
      source/backend/plugin/FluidSynthPlugin.cpp
  6. +5
    -2
      source/backend/plugin/JucePlugin.cpp
  7. +0
    -2
      source/backend/plugin/LadspaPlugin.cpp
  8. +31
    -44
      source/backend/plugin/LinuxSamplerPlugin.cpp
  9. +0
    -98
      source/backend/plugin/Vst3Plugin.cpp
  10. +4
    -0
      source/backend/plugin/VstPlugin.cpp

+ 5
- 1
source/backend/CarlaPlugin.hpp View File

@@ -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

// -------------------------------------------------------------------


+ 47
- 0
source/backend/engine/CarlaEngine.cpp View File

@@ -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)



+ 34
- 0
source/backend/plugin/AuPlugin.cpp View File

@@ -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

+ 1
- 1
source/backend/plugin/CsoundPlugin.cpp View File

@@ -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));


+ 2
- 2
source/backend/plugin/FluidSynthPlugin.cpp View File

@@ -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))


+ 5
- 2
source/backend/plugin/JucePlugin.cpp View File

@@ -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
}



+ 0
- 2
source/backend/plugin/LadspaPlugin.cpp View File

@@ -1487,8 +1487,6 @@ private:

CARLA_BACKEND_END_NAMESPACE

#else // WANT_LADSPA
# warning Building without LADSPA support
#endif

CARLA_BACKEND_START_NAMESPACE


+ 31
- 44
source/backend/plugin/LinuxSamplerPlugin.cpp View File

@@ -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
}


+ 0
- 98
source/backend/plugin/Vst3Plugin.cpp View File

@@ -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

+ 4
- 0
source/backend/plugin/VstPlugin.cpp View File

@@ -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;


Loading…
Cancel
Save