Browse Source

Update code to new APIs

tags/1.9.4
falkTX 11 years ago
parent
commit
edb2e1288c
19 changed files with 2151 additions and 2141 deletions
  1. +34
    -37
      source/backend/engine/CarlaEngine.cpp
  2. +57
    -57
      source/backend/engine/CarlaEngineJack.cpp
  3. +59
    -56
      source/backend/engine/CarlaEngineNative.cpp
  4. +10
    -9
      source/backend/engine/CarlaEngineOsc.cpp
  5. +8
    -8
      source/backend/engine/CarlaEngineRtAudio.cpp
  6. +15
    -15
      source/backend/engine/CarlaEngineThread.cpp
  7. +165
    -165
      source/backend/plugin/BridgePlugin.cpp
  8. +105
    -120
      source/backend/plugin/CarlaPlugin.cpp
  9. +6
    -8
      source/backend/plugin/CarlaPluginInternal.hpp
  10. +233
    -233
      source/backend/plugin/DssiPlugin.cpp
  11. +314
    -314
      source/backend/plugin/FluidSynthPlugin.cpp
  12. +181
    -181
      source/backend/plugin/LadspaPlugin.cpp
  13. +103
    -103
      source/backend/plugin/LinuxSamplerPlugin.cpp
  14. +374
    -374
      source/backend/plugin/Lv2Plugin.cpp
  15. +214
    -211
      source/backend/plugin/NativePlugin.cpp
  16. +4
    -4
      source/backend/plugin/Vst3Plugin.cpp
  17. +239
    -239
      source/backend/plugin/VstPlugin.cpp
  18. +5
    -5
      source/backend/standalone/CarlaStandalone.cpp
  19. +25
    -2
      source/modules/utils/RtList.hpp

+ 34
- 37
source/backend/engine/CarlaEngine.cpp View File

@@ -805,6 +805,10 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
//plugin = CarlaPlugin::newVST3(init);
break;

case PLUGIN_AU:
//plugin = CarlaPlugin::newAU(init);
break;

case PLUGIN_GIG:
plugin = CarlaPlugin::newGIG(init, (extra != nullptr));
break;
@@ -1517,98 +1521,91 @@ void CarlaEngine::setAboutToClose()
// -----------------------------------------------------------------------
// Global options

#define CARLA_ENGINE_SET_OPTION_RUNNING_CHECK \
if (isRunning()) \
return carla_stderr("CarlaEngine::setOption(%s, %i, \"%s\") - Cannot set this option while engine is running!", OptionsType2Str(option), value, valueStr);

void CarlaEngine::setOption(const OptionsType option, const int value, const char* const valueStr)
{
carla_debug("CarlaEngine::setOption(%s, %i, \"%s\")", OptionsType2Str(option), value, valueStr);

if (option >= OPTION_PROCESS_MODE && option < OPTION_PATH_RESOURCES && isRunning())
return carla_stderr("CarlaEngine::setOption(%s, %i, \"%s\") - Cannot set this option while engine is running!", OptionsType2Str(option), value, valueStr);

switch (option)
{
case OPTION_PROCESS_NAME:
carla_setprocname(valueStr);
break;

case OPTION_PROCESS_MODE:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK

if (value < PROCESS_MODE_SINGLE_CLIENT || value > PROCESS_MODE_BRIDGE)
return carla_stderr("CarlaEngine::setOption(%s, %i, \"%s\") - invalid value", OptionsType2Str(option), value, valueStr);
if (value < PROCESS_MODE_SINGLE_CLIENT || value > PROCESS_MODE_PATCHBAY)
return carla_stderr("CarlaEngine::setOption(OPTION_PROCESS_MODE, %i, \"%s\") - invalid value", value, valueStr);

fOptions.processMode = static_cast<ProcessMode>(value);
break;

case OPTION_TRANSPORT_MODE:
// FIXME: Always enable JACK transport for now
#if 0
if (value < CarlaBackend::TRANSPORT_MODE_INTERNAL || value > CarlaBackend::TRANSPORT_MODE_BRIDGE)
if (value < CarlaBackend::TRANSPORT_MODE_INTERNAL || value > CarlaBackend::TRANSPORT_MODE_JACK)
return carla_stderr2("carla_set_engine_option(OPTION_TRANSPORT_MODE, %i, \"%s\") - invalid value", value, valueStr);

fOptions.transportMode = static_cast<CarlaBackend::TransportMode>(value);
#endif
break;

case OPTION_MAX_PARAMETERS:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK

if (value < 0)
return; // TODO error here

fOptions.maxParameters = static_cast<uint>(value);
break;

case OPTION_FORCE_STEREO:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
fOptions.forceStereo = (value != 0);
break;

case OPTION_PREFER_PLUGIN_BRIDGES:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
fOptions.preferPluginBridges = (value != 0);
break;

case OPTION_PREFER_UI_BRIDGES:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
fOptions.preferUiBridges = (value != 0);
break;

case OPTION_UIS_ALWAYS_ON_TOP:
fOptions.uisAlwaysOnTop = (value != 0);
break;

#ifdef WANT_DSSI
case OPTION_USE_DSSI_VST_CHUNKS:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
fOptions.useDssiVstChunks = (value != 0);
break;
#endif

case OPTION_UI_BRIDGES_TIMEOUT:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
fOptions.oscUiTimeout = static_cast<uint>(value);
case OPTION_MAX_PARAMETERS:
if (value < 1)
return carla_stderr2("carla_set_engine_option(OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr);

fOptions.maxParameters = static_cast<uint>(value);
break;

case OPTION_JACK_AUTOCONNECT:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
fOptions.jackAutoConnect = (value != 0);
case OPTION_UI_BRIDGES_TIMEOUT:
if (value < 1)
return carla_stderr2("carla_set_engine_option(OPTION_UI_BRIDGES_TIMEOUT, %i, \"%s\") - invalid value", value, valueStr);

fOptions.uiBridgesTimeout = static_cast<uint>(value);
break;

#ifdef WANT_RTAUDIO
case OPTION_RTAUDIO_NUMBER_PERIODS:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
fOptions.rtaudioNumberPeriods = static_cast<uint>(value);
if (value < 2 || value > 3)
return carla_stderr2("carla_set_engine_option(OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr);

fOptions.rtaudioNumPeriods = static_cast<uint>(value);
break;

case OPTION_RTAUDIO_BUFFER_SIZE:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
if (value < 8)
return carla_stderr2("carla_set_engine_option(OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr);

fOptions.rtaudioBufferSize = static_cast<uint>(value);
break;

case OPTION_RTAUDIO_SAMPLE_RATE:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
if (value < 22050)
return carla_stderr2("carla_set_engine_option(OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr);

fOptions.rtaudioSampleRate = static_cast<uint>(value);
break;

case OPTION_RTAUDIO_DEVICE:
CARLA_ENGINE_SET_OPTION_RUNNING_CHECK
fOptions.rtaudioDevice = valueStr;
break;
#endif


+ 57
- 57
source/backend/engine/CarlaEngineJack.cpp View File

@@ -95,7 +95,7 @@ public:

fBuffer = (float*)jackbridge_port_get_buffer(kPort, bufferSize);

if (! kIsInput)
if (! fIsInput)
carla_zeroFloat(fBuffer, bufferSize);
}

@@ -151,7 +151,7 @@ public:

CARLA_ASSERT(engine->getBufferSize() == fBufferSize);

if (kIsInput)
if (fIsInput)
{
float* const jackBuffer((float*)jackbridge_port_get_buffer(kPort, fBufferSize));
carla_copyFloat(fBuffer, jackBuffer, fBufferSize);
@@ -164,9 +164,9 @@ public:

void writeBuffer(const uint32_t frames, const uint32_t timeOffset) override
{
CARLA_ASSERT(! kIsInput);
CARLA_ASSERT(! fIsInput);

if (kIsInput)
if (fIsInput)
return;

float* const jackBuffer((float*)jackbridge_port_get_buffer(kPort, fBufferSize));
@@ -226,7 +226,7 @@ public:

fJackBuffer = jackbridge_port_get_buffer(kPort, engine->getBufferSize());

if (! kIsInput)
if (! fIsInput)
jackbridge_midi_clear_buffer(fJackBuffer);
}

@@ -235,10 +235,10 @@ public:
if (kPort == nullptr)
return CarlaEngineEventPort::getEventCount();

CARLA_ASSERT(kIsInput);
CARLA_ASSERT(fIsInput);
CARLA_ASSERT(fJackBuffer != nullptr);

if (! kIsInput)
if (! fIsInput)
return 0;
if (fJackBuffer == nullptr)
return 0;
@@ -251,10 +251,10 @@ public:
if (kPort == nullptr)
return CarlaEngineEventPort::getEvent(index);

CARLA_ASSERT(kIsInput);
CARLA_ASSERT(fIsInput);
CARLA_ASSERT(fJackBuffer != nullptr);

if (! kIsInput)
if (! fIsInput)
return kFallbackJackEngineEvent;
if (fJackBuffer == nullptr)
return kFallbackJackEngineEvent;
@@ -342,14 +342,14 @@ public:
if (kPort == nullptr)
return CarlaEngineEventPort::writeControlEvent(time, channel, type, param, value);

CARLA_ASSERT(! kIsInput);
CARLA_ASSERT(! fIsInput);
CARLA_ASSERT(fJackBuffer != nullptr);
CARLA_ASSERT(type != kEngineControlEventTypeNull);
CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
CARLA_ASSERT(param < MAX_MIDI_VALUE);
CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f);

if (kIsInput)
if (fIsInput)
return;
if (fJackBuffer == nullptr)
return;
@@ -413,13 +413,13 @@ public:
if (kPort == nullptr)
return CarlaEngineEventPort::writeMidiEvent(time, channel, port, data, size);

CARLA_ASSERT(! kIsInput);
CARLA_ASSERT(! fIsInput);
CARLA_ASSERT(fJackBuffer != nullptr);
CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
CARLA_ASSERT(data != nullptr);
CARLA_ASSERT(size != 0);

if (kIsInput)
if (fIsInput)
return;
if (fJackBuffer == nullptr)
return;
@@ -475,7 +475,7 @@ public:
{
carla_debug("CarlaEngineClient::~CarlaEngineClient()");

if (kEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS && kClient != nullptr)
if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS && kClient != nullptr)
jackbridge_client_close(kClient);
}

@@ -483,7 +483,7 @@ public:
{
carla_debug("CarlaEngineJackClient::activate()");

if (kEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
{
CARLA_ASSERT(kClient != nullptr && ! fActive);

@@ -498,7 +498,7 @@ public:
{
carla_debug("CarlaEngineJackClient::deactivate()");

if (kEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
if (fEngine.getProccessMode() == PROCESS_MODE_MULTIPLE_CLIENTS)
{
CARLA_ASSERT(kClient != nullptr && fActive);

@@ -560,11 +560,11 @@ public:
case kEnginePortTypeNull:
break;
case kEnginePortTypeAudio:
return new CarlaEngineJackAudioPort(isInput, kEngine.getProccessMode(), kClient, port);
return new CarlaEngineJackAudioPort(isInput, fEngine.getProccessMode(), kClient, port);
case kEnginePortTypeCV:
return new CarlaEngineJackCVPort(isInput, kEngine.getProccessMode(), kEngine.getBufferSize(), kClient, port);
return new CarlaEngineJackCVPort(isInput, fEngine.getProccessMode(), fEngine.getBufferSize(), kClient, port);
case kEnginePortTypeEvent:
return new CarlaEngineJackEventPort(isInput, kEngine.getProccessMode(), kClient, port);
return new CarlaEngineJackEventPort(isInput, fEngine.getProccessMode(), kClient, port);
}

carla_stderr("CarlaEngineJackClient::addPort(%s, \"%s\", %s) - invalid type", EnginePortType2Str(portType), name, bool2str(isInput));
@@ -633,20 +633,20 @@ public:
// -------------------------------------------------------------------
// Maximum values

unsigned int maxClientNameSize() const override
unsigned int getMaxClientNameSize() const noexcept override
{
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
return static_cast<unsigned int>(jackbridge_client_name_size());

return CarlaEngine::maxClientNameSize();
return CarlaEngine::getMaxClientNameSize();
}

unsigned int maxPortNameSize() const override
unsigned int getMaxPortNameSize() const noexcept override
{
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
return static_cast<unsigned int>(jackbridge_port_name_size());

return CarlaEngine::maxPortNameSize();
return CarlaEngine::getMaxPortNameSize();
}

// -------------------------------------------------------------------
@@ -844,7 +844,7 @@ public:
}
#endif

bool isRunning() const override
bool isRunning() const noexcept override
{
#ifdef BUILD_BRIDGE
return (fClient != nullptr || ! fHasQuit);
@@ -853,19 +853,19 @@ public:
#endif
}

bool isOffline() const override
bool isOffline() const noexcept override
{
return fFreewheel;
}

EngineType type() const override
EngineType getType() const noexcept override
{
return kEngineTypeJack;
}

CarlaEngineClient* addClient(CarlaPlugin* const plugin) override
{
const char* const iconName(plugin->iconName());
const char* const iconName(plugin->getIconName());
jack_client_t* client = nullptr;

#ifdef BUILD_BRIDGE
@@ -894,7 +894,7 @@ public:
}
else if (fOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS)
{
client = jackbridge_client_open(plugin->name(), JackNullOption, nullptr);
client = jackbridge_client_open(plugin->getName(), JackNullOption, nullptr);

CARLA_ASSERT(client != nullptr);

@@ -914,18 +914,18 @@ public:
#ifndef BUILD_BRIDGE
const char* renamePlugin(const unsigned int id, const char* const newName) override
{
CARLA_ASSERT(kData->curPluginCount > 0);
CARLA_ASSERT(id < kData->curPluginCount);
CARLA_ASSERT(kData->plugins != nullptr);
CARLA_ASSERT(pData->curPluginCount > 0);
CARLA_ASSERT(id < pData->curPluginCount);
CARLA_ASSERT(pData->plugins != nullptr);
CARLA_ASSERT(newName != nullptr);

if (kData->plugins == nullptr)
if (pData->plugins == nullptr)
{
setLastError("Critical error: no plugins are currently loaded!");
return nullptr;
}

CarlaPlugin* const plugin(kData->plugins[id].plugin);
CarlaPlugin* const plugin(pData->plugins[id].plugin);

if (plugin == nullptr)
{
@@ -933,7 +933,7 @@ public:
return nullptr;
}

CARLA_ASSERT(plugin->id() == id);
CARLA_ASSERT(plugin->getId() == id);

bool needsReinit = (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT);
const char* name = getUniquePluginName(newName);
@@ -956,7 +956,7 @@ public:

if (jack_client_t* jclient = jackbridge_client_open(name, JackNullOption, nullptr))
{
const char* const iconName(plugin->iconName());
const char* const iconName(plugin->getIconName());
jackbridge_custom_publish_data(jclient, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1);

// close old client
@@ -1178,7 +1178,7 @@ protected:
{
saveTransportInfo();

if (kData->curPluginCount == 0)
if (pData->curPluginCount == 0)
{
#ifndef BUILD_BRIDGE
// pass-through
@@ -1202,13 +1202,13 @@ protected:
}
#endif

return proccessPendingEvents();
return runPendingRtEvents();
}

#ifdef BUILD_BRIDGE
CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock())
{
plugin->initBuffers();
processPlugin(plugin, nframes);
@@ -1217,11 +1217,11 @@ protected:
#else
if (fOptions.processMode == PROCESS_MODE_SINGLE_CLIENT)
{
for (unsigned int i=0; i < kData->curPluginCount; ++i)
for (unsigned int i=0; i < pData->curPluginCount; ++i)
{
CarlaPlugin* const plugin(kData->plugins[i].plugin);
CarlaPlugin* const plugin(pData->plugins[i].plugin);

if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock())
{
plugin->initBuffers();
processPlugin(plugin, nframes);
@@ -1252,7 +1252,7 @@ protected:
float* outBuf[2] = { audioOut1, audioOut2 };

// initialize input events
carla_zeroStruct<EngineEvent>(kData->bufEvents.in, INTERNAL_EVENT_COUNT);
carla_zeroStruct<EngineEvent>(pData->bufEvents.in, INTERNAL_EVENT_COUNT);
{
uint32_t engineEventIndex = 0;

@@ -1264,7 +1264,7 @@ protected:
if (! jackbridge_midi_event_get(&jackEvent, eventIn, jackEventIndex))
continue;

EngineEvent* const engineEvent(&kData->bufEvents.in[engineEventIndex++]);
EngineEvent* const engineEvent(&pData->bufEvents.in[engineEventIndex++]);
engineEvent->clear();

const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(jackEvent.buffer);
@@ -1347,7 +1347,7 @@ protected:

for (unsigned short i=0; i < INTERNAL_EVENT_COUNT; ++i)
{
EngineEvent* const engineEvent = &kData->bufEvents.out[i];
EngineEvent* const engineEvent = &pData->bufEvents.out[i];

uint8_t data[3] = { 0 };
uint8_t size = 0;
@@ -1423,7 +1423,7 @@ protected:
}
#endif // ! BUILD_BRIDGE

proccessPendingEvents();
runPendingRtEvents();
}

void handleJackLatencyCallback(const jack_latency_callback_mode_t mode)
@@ -1431,11 +1431,11 @@ protected:
if (fOptions.processMode != PROCESS_MODE_SINGLE_CLIENT)
return;

for (unsigned int i=0; i < kData->curPluginCount; ++i)
for (unsigned int i=0; i < pData->curPluginCount; ++i)
{
CarlaPlugin* const plugin(kData->plugins[i].plugin);
CarlaPlugin* const plugin(pData->plugins[i].plugin);

if (plugin != nullptr && plugin->enabled())
if (plugin != nullptr && plugin->isEnabled())
latencyPlugin(plugin, mode);
}
}
@@ -1652,9 +1652,9 @@ protected:

void handleJackShutdownCallback()
{
for (unsigned int i=0; i < kData->curPluginCount; ++i)
for (unsigned int i=0; i < pData->curPluginCount; ++i)
{
//CarlaPlugin* const plugin(kData->plugins[i].plugin);
//CarlaPlugin* const plugin(pData->plugins[i].plugin);

//if (plugin)
// plugin->x_client = nullptr;
@@ -2026,8 +2026,8 @@ private:

void processPlugin(CarlaPlugin* const plugin, const uint32_t nframes)
{
const uint32_t inCount(plugin->audioInCount());
const uint32_t outCount(plugin->audioOutCount());
const uint32_t inCount(plugin->getAudioInCount());
const uint32_t outCount(plugin->getAudioOutCount());

float* inBuffer[inCount];
float* outBuffer[outCount];
@@ -2071,14 +2071,14 @@ private:
}
}

setPeaks(plugin->id(), inPeaks, outPeaks);
setPluginPeaks(plugin->getId(), inPeaks, outPeaks);
}

void latencyPlugin(CarlaPlugin* const plugin, jack_latency_callback_mode_t mode)
{
//const uint32_t inCount(plugin->audioInCount());
//const uint32_t outCount(plugin->audioOutCount());
const uint32_t latency(plugin->latency());
const uint32_t latency(plugin->getLatencyInFrames());

if (latency == 0)
return;
@@ -2201,7 +2201,7 @@ private:
{
CarlaPlugin* const plugin((CarlaPlugin*)arg);

if (plugin != nullptr && plugin->enabled() && plugin->tryLock())
if (plugin != nullptr && plugin->isEnabled() && plugin->tryLock())
{
CarlaEngineJack* const engine((CarlaEngineJack*)CarlaPluginGetEngine(plugin));
CARLA_ASSERT(engine != nullptr);
@@ -2219,7 +2219,7 @@ private:
{
CarlaPlugin* const plugin((CarlaPlugin*)arg);

if (plugin != nullptr && plugin->enabled())
if (plugin != nullptr && plugin->isEnabled())
{
CarlaEngineJack* const engine((CarlaEngineJack*)CarlaPluginGetEngine(plugin));
CARLA_ASSERT(engine != nullptr);


+ 59
- 56
source/backend/engine/CarlaEngineNative.cpp View File

@@ -162,7 +162,7 @@ public:
init("Carla-Plugin");

// set control thread binary
CarlaString threadBinary(hostResourceDir());
CarlaString threadBinary(getResourceDir());
threadBinary += "/../";
threadBinary += "carla_control.py";

@@ -207,21 +207,21 @@ protected:
{
carla_debug("CarlaEngineNative::close()");

proccessPendingEvents();
runPendingRtEvents();
return CarlaEngine::close();
}

bool isRunning() const override
bool isRunning() const noexcept override
{
return fIsRunning;
}

bool isOffline() const override
bool isOffline() const noexcept override
{
return false;
}

EngineType type() const override
EngineType getType() const noexcept override
{
return kEngineTypePlugin;
}
@@ -231,15 +231,15 @@ protected:

uint32_t getParameterCount() override
{
if (kData->curPluginCount == 0 || kData->plugins == nullptr)
if (pData->curPluginCount == 0 || pData->plugins == nullptr)
return 0;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return 0;

return kData->plugins[0].plugin->parameterCount();
return pData->plugins[0].plugin->getParameterCount();
}

const Parameter* getParameterInfo(const uint32_t index) override
@@ -247,17 +247,17 @@ protected:
if (index >= getParameterCount())
return nullptr;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return nullptr;

static ::Parameter param;
static char strBufName[STR_MAX+1];
static char strBufUnit[STR_MAX+1];

const ParameterData& paramData(plugin->parameterData(index));
const ParameterRanges& paramRanges(plugin->parameterRanges(index));
const ParameterData& paramData(plugin->getParameterData(index));
const ParameterRanges& paramRanges(plugin->getParameterRanges(index));

plugin->getParameterName(index, strBufName);
plugin->getParameterUnit(index, strBufUnit);
@@ -307,9 +307,9 @@ protected:
if (index >= getParameterCount())
return 0.0f;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return 0.0f;

return plugin->getParameterValue(index);
@@ -320,9 +320,9 @@ protected:
if (index >= getParameterCount())
return nullptr;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return nullptr;

static char strBuf[STR_MAX+1];
@@ -337,15 +337,15 @@ protected:

uint32_t getMidiProgramCount() override
{
if (kData->curPluginCount == 0 || kData->plugins == nullptr)
if (pData->curPluginCount == 0 || pData->plugins == nullptr)
return 0;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return 0.0f;

return plugin->midiProgramCount();
return plugin->getMidiProgramCount();
}

const MidiProgram* getMidiProgramInfo(const uint32_t index) override
@@ -353,15 +353,15 @@ protected:
if (index >= getMidiProgramCount())
return nullptr;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return nullptr;

static ::MidiProgram midiProg;

{
const MidiProgramData& midiProgData(plugin->midiProgramData(index));
const MidiProgramData& midiProgData(plugin->getMidiProgramData(index));

midiProg.bank = midiProgData.bank;
midiProg.program = midiProgData.program;
@@ -379,9 +379,9 @@ protected:
if (index >= getParameterCount())
return;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return;

plugin->setParameterValue(index, value, false, false, false);
@@ -389,12 +389,12 @@ protected:

void setMidiProgram(const uint8_t, const uint32_t bank, const uint32_t program) override
{
if (kData->curPluginCount == 0 || kData->plugins == nullptr)
if (pData->curPluginCount == 0 || pData->plugins == nullptr)
return;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return;

plugin->setMidiProgramById(bank, program, false, false, false);
@@ -418,11 +418,11 @@ protected:

void activate() override
{
for (uint32_t i=0; i < kData->curPluginCount; ++i)
for (uint32_t i=0; i < pData->curPluginCount; ++i)
{
CarlaPlugin* const plugin(kData->plugins[i].plugin);
CarlaPlugin* const plugin(pData->plugins[i].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
continue;

plugin->setActive(true, true, false);
@@ -431,27 +431,27 @@ protected:

void deactivate() override
{
for (uint32_t i=0; i < kData->curPluginCount; ++i)
for (uint32_t i=0; i < pData->curPluginCount; ++i)
{
CarlaPlugin* const plugin(kData->plugins[i].plugin);
CarlaPlugin* const plugin(pData->plugins[i].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
continue;

plugin->setActive(false, true, false);
}

// just in case
proccessPendingEvents();
runPendingRtEvents();
}

void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const uint32_t midiEventCount, const ::MidiEvent* const midiEvents) override
{
if (kData->curPluginCount == 0)
if (pData->curPluginCount == 0)
{
carla_zeroFloat(outBuffer[0], frames);
carla_zeroFloat(outBuffer[1], frames);
return proccessPendingEvents();
return runPendingRtEvents();;
}

// ---------------------------------------------------------------
@@ -483,7 +483,7 @@ protected:
// ---------------------------------------------------------------
// initialize input events

carla_zeroStruct<EngineEvent>(kData->bufEvents.in, INTERNAL_EVENT_COUNT);
carla_zeroStruct<EngineEvent>(pData->bufEvents.in, INTERNAL_EVENT_COUNT);
{
uint32_t engineEventIndex = 0;

@@ -511,7 +511,7 @@ protected:

if (control == MIDI_CONTROL_ALL_SOUND_OFF || control == MIDI_CONTROL_ALL_NOTES_OFF)
{
EngineEvent& engineEvent(kData->bufEvents.in[engineEventIndex++]);
EngineEvent& engineEvent(pData->bufEvents.in[engineEventIndex++]);
engineEvent.clear();

engineEvent.type = kEngineEventTypeControl;
@@ -526,7 +526,7 @@ protected:
}
}

EngineEvent& engineEvent(kData->bufEvents.in[engineEventIndex++]);
EngineEvent& engineEvent(pData->bufEvents.in[engineEventIndex++]);
engineEvent.clear();

engineEvent.type = kEngineEventTypeMidi;
@@ -551,7 +551,7 @@ protected:
// process

processRack(inBuf, outBuf, frames);
proccessPendingEvents();
runPendingRtEvents();
}

// -------------------------------------------------------------------
@@ -566,9 +566,9 @@ protected:
else
{
#if 0
for (uint32_t i=0; i < kData->curPluginCount; ++i)
for (uint32_t i=0; i < pData->curPluginCount; ++i)
{
CarlaPlugin* const plugin(kData->plugins[i].plugin);
CarlaPlugin* const plugin(pData->plugins[i].plugin);

if (plugin == nullptr || ! plugin->enabled())
continue;
@@ -604,9 +604,9 @@ protected:
if (index >= getParameterCount())
return;

CarlaPlugin* const plugin(kData->plugins[0].plugin);
CarlaPlugin* const plugin(pData->plugins[0].plugin);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
return;

plugin->uiParameterChange(index, value);
@@ -652,11 +652,11 @@ protected:
bool firstPlugin = true;
char strBuf[STR_MAX+1];

for (unsigned int i=0; i < kData->curPluginCount; ++i)
for (unsigned int i=0; i < pData->curPluginCount; ++i)
{
CarlaPlugin* const plugin(kData->plugins[i].plugin);
CarlaPlugin* const plugin(pData->plugins[i].plugin);

if (plugin != nullptr && plugin->enabled())
if (plugin != nullptr && plugin->isEnabled())
{
if (! firstPlugin)
out << "\n";
@@ -666,8 +666,11 @@ protected:
if (*strBuf != 0)
out << QString(" <!-- %1 -->\n").arg(xmlSafeString(strBuf, true));

QString content;
fillXmlStringFromSaveState(content, plugin->getSaveState());

out << " <Plugin>\n";
out << getXMLFromSaveState(plugin->getSaveState());
out << content;
out << " </Plugin>\n";

firstPlugin = false;
@@ -698,11 +701,10 @@ protected:
{
if (node.toElement().tagName() == "Plugin")
{
const SaveState& saveState(getSaveStateDictFromXML(node));
CARLA_ASSERT(saveState.type != nullptr);
SaveState saveState;
fillSaveStateFromXmlNode(saveState, node);

if (saveState.type == nullptr)
continue;
CARLA_SAFE_ASSERT_CONTINUE(saveState.type != nullptr)

const void* extraStuff = nullptr;

@@ -713,7 +715,7 @@ protected:
// TODO - proper find&load plugins
if (addPlugin(getPluginTypeFromString(saveState.type), saveState.binary, saveState.name, saveState.label, extraStuff))
{
if (CarlaPlugin* plugin = getPlugin(kData->curPluginCount-1))
if (CarlaPlugin* plugin = getPlugin(pData->curPluginCount-1))
plugin->loadSaveState(saveState);
}
}
@@ -751,7 +753,8 @@ static const PluginDescriptor carlaDesc = {
PluginDescriptorFILL(CarlaEngineNative)
};

void CarlaEngine::registerNativePlugin()
CARLA_EXPORT
void carla_register_native_plugin_carla()
{
carla_register_native_plugin(&carlaDesc);
}


+ 10
- 9
source/backend/engine/CarlaEngineOsc.cpp View File

@@ -253,7 +253,7 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, cons
return 1;
}

if (pluginId > kEngine->currentPluginCount())
if (pluginId > kEngine->getCurrentPluginCount())
{
carla_stderr("CarlaEngineOsc::handleMessage() - failed to get plugin, wrong id '%i'", pluginId);
return 1;
@@ -262,7 +262,7 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, cons
// Get plugin
CarlaPlugin* const plugin = kEngine->getPluginUnchecked(pluginId);

if (plugin == nullptr || plugin->id() != pluginId)
if (plugin == nullptr || plugin->getId() != pluginId)
{
carla_stderr("CarlaEngineOsc::handleMessage() - invalid plugin id '%i', probably has been removed", pluginId);
return 1;
@@ -325,7 +325,7 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, cons
return handleMsgNoteOff(plugin, argc, argv, types);

// Plugin Bridges
if ((plugin->hints() & PLUGIN_IS_BRIDGE) > 0 && std::strlen(method) > 11 && std::strncmp(method, "bridge_", 7) == 0)
if ((plugin->getHints() & PLUGIN_IS_BRIDGE) > 0 && std::strlen(method) > 11 && std::strncmp(method, "bridge_", 7) == 0)
{
if (std::strcmp(method+7, "audio_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeAudioCount, argc, argv, types);
@@ -416,11 +416,11 @@ int CarlaEngineOsc::handleMsgRegister(const bool isTCP, const int argc, const lo
std::free(port);
}

for (unsigned short i=0; i < kEngine->currentPluginCount(); ++i)
for (unsigned short i=0; i < kEngine->getCurrentPluginCount(); ++i)
{
CarlaPlugin* const plugin = kEngine->getPluginUnchecked(i);

if (plugin && plugin->enabled())
if (plugin && plugin->isEnabled())
plugin->registerToOscClient();
}

@@ -516,7 +516,7 @@ int CarlaEngineOsc::handleMsgProgram(CARLA_ENGINE_OSC_HANDLE_ARGS2)
if (program < 0)
return 1;

if (program < static_cast<int32_t>(plugin->programCount()))
if (program < static_cast<int32_t>(plugin->getProgramCount()))
{
plugin->setProgram(program, false, true, true);
return 0;
@@ -540,7 +540,7 @@ int CarlaEngineOsc::handleMsgMidi(CARLA_ENGINE_OSC_HANDLE_ARGS2)
(void)plugin;
(void)argv;
#else
if (plugin->midiInCount() == 0)
if (plugin->getMidiInCount() == 0)
{
carla_stderr("CarlaEngineOsc::handleMsgMidi() - recived midi when plugin has no midi inputs");
return 1;
@@ -590,9 +590,10 @@ int CarlaEngineOsc::handleMsgExiting(CARLA_ENGINE_OSC_HANDLE_ARGS1)
carla_debug("CarlaEngineOsc::handleMsgExiting()");

// TODO - check for non-UIs (dssi-vst) and set to -1 instead
kEngine->callback(CALLBACK_SHOW_GUI, plugin->id(), 0, 0, 0.0f, nullptr);
kEngine->callback(CALLBACK_SHOW_GUI, plugin->getId(), 0, 0, 0.0f, nullptr);

plugin->freeOscData();
// TODO
//plugin->freeOscData();

return 0;
}


+ 8
- 8
source/backend/engine/CarlaEngineRtAudio.cpp View File

@@ -361,17 +361,17 @@ public:
return (! hasError);
}

bool isRunning() const override
bool isRunning() const noexcept override
{
return fAudio.isStreamRunning();
}

bool isOffline() const override
bool isOffline() const noexcept override
{
return false;
}

EngineType type() const override
EngineType getType() const noexcept override
{
return kEngineTypeRtAudio;
}
@@ -802,12 +802,12 @@ protected:
CARLA_ASSERT_INT2(nframes == fBufferSize, nframes, fBufferSize);
CARLA_ASSERT(outsPtr != nullptr);

if (kData->curPluginCount == 0 || fAudioCountOut == 0 || ! fAudioIsReady)
if (pData->curPluginCount == 0 || fAudioCountOut == 0 || ! fAudioIsReady)
{
if (fAudioCountOut > 0 && fAudioIsReady)
carla_zeroFloat(outsPtr, nframes*fAudioCountOut);

return proccessPendingEvents();
return runPendingRtEvents();
}

// initialize audio input
@@ -835,7 +835,7 @@ protected:
carla_zeroFloat(fAudioBufRackOut[1], nframes);

// initialize input events
carla_zeroMem(kData->bufEvents.in, sizeof(EngineEvent)*INTERNAL_EVENT_COUNT);
carla_zeroMem(pData->bufEvents.in, sizeof(EngineEvent)*INTERNAL_EVENT_COUNT);

if (fMidiInEvents.mutex.tryLock())
{
@@ -846,7 +846,7 @@ protected:
{
const RtMidiEvent& midiEvent(fMidiInEvents.data.getFirst(true));

EngineEvent& engineEvent(kData->bufEvents.in[engineEventIndex++]);
EngineEvent& engineEvent(pData->bufEvents.in[engineEventIndex++]);
engineEvent.clear();

const uint8_t midiStatus = MIDI_GET_STATUS_FROM_DATA(midiEvent.data);
@@ -1033,7 +1033,7 @@ protected:
//fMidiOutEvents...
}

proccessPendingEvents();
runPendingRtEvents();
return;

// unused


+ 15
- 15
source/backend/engine/CarlaEngineThread.cpp View File

@@ -69,32 +69,32 @@ void CarlaEngineThread::stopNow()
void CarlaEngineThread::run()
{
carla_debug("CarlaEngineThread::run()");
CARLA_ASSERT(kEngine->isRunning());
CARLA_ASSERT(fEngine->isRunning());

bool oscRegisted, usesSingleThread;
unsigned int i, count;
float value;

while (kEngine->isRunning() && ! fStopNow)
while (fEngine->isRunning() && ! fStopNow)
{
const CarlaMutex::ScopedLocker sl(fMutex);

#ifdef BUILD_BRIDGE
oscRegisted = kEngine->isOscBridgeRegistered();
oscRegisted = fEngine->isOscBridgeRegistered();
#else
oscRegisted = kEngine->isOscControlRegistered();
oscRegisted = fEngine->isOscControlRegistered();
#endif

for (i=0, count = kEngine->currentPluginCount(); i < count; ++i)
for (i=0, count = fEngine->getCurrentPluginCount(); i < count; ++i)
{
CarlaPlugin* const plugin = kEngine->getPluginUnchecked(i);
CarlaPlugin* const plugin = fEngine->getPluginUnchecked(i);

if (plugin == nullptr || ! plugin->enabled())
if (plugin == nullptr || ! plugin->isEnabled())
continue;

CARLA_SAFE_ASSERT_INT2(i == plugin->id(), i, plugin->id());
CARLA_SAFE_ASSERT_INT2(i == plugin->getId(), i, plugin->getId());

usesSingleThread = (plugin->hints() & PLUGIN_HAS_SINGLE_THREAD);
usesSingleThread = (plugin->getHints() & PLUGIN_HAS_SINGLE_THREAD);

// -------------------------------------------------------
// Process postponed events
@@ -107,9 +107,9 @@ void CarlaEngineThread::run()
// ---------------------------------------------------
// Update parameter outputs

for (uint32_t j=0; j < plugin->parameterCount(); ++j)
for (uint32_t j=0; j < plugin->getParameterCount(); ++j)
{
if (! plugin->parameterIsOutput(j))
if (! plugin->isParameterOutput(j))
continue;

value = plugin->getParameterValue(j);
@@ -122,9 +122,9 @@ void CarlaEngineThread::run()
if (oscRegisted)
{
#ifdef BUILD_BRIDGE
kEngine->osc_send_bridge_set_parameter_value(j, value);
fEngine->oscSend_bridge_set_parameter_value(j, value);
#else
kEngine->osc_send_control_set_parameter_value(i, j, value);
fEngine->oscSend_control_set_parameter_value(i, j, value);
#endif
}
}
@@ -134,12 +134,12 @@ void CarlaEngineThread::run()
// Update OSC control client peaks

if (oscRegisted)
kEngine->osc_send_control_set_peaks(i);
fEngine->oscSend_control_set_peaks(i);
#endif
}
}

kEngine->idleOsc();
fEngine->idleOsc();
carla_msleep(oscRegisted ? 30 : 50);
}
}


+ 165
- 165
source/backend/plugin/BridgePlugin.cpp View File

@@ -266,7 +266,7 @@ public:
{
carla_debug("BridgePlugin::BridgePlugin(%p, %i, %s, %s)", engine, id, BinaryType2Str(btype), PluginType2Str(ptype));

kData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_BRIDGE);
pData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_BRIDGE);

fHints |= PLUGIN_IS_BRIDGE;
}
@@ -275,38 +275,38 @@ public:
{
carla_debug("BridgePlugin::~BridgePlugin()");

kData->singleMutex.lock();
kData->masterMutex.lock();
pData->singleMutex.lock();
pData->masterMutex.lock();

if (kData->client != nullptr && kData->client->isActive())
kData->client->deactivate();
if (pData->client != nullptr && pData->client->isActive())
pData->client->deactivate();

if (kData->active)
if (pData->active)
{
deactivate();
kData->active = false;
pData->active = false;
}

if (kData->osc.thread.isRunning())
if (pData->osc.thread.isRunning())
{
fShmControl.writeOpcode(kPluginBridgeOpcodeQuit);
fShmControl.commitWrite();
fShmControl.waitForServer();
}

if (kData->osc.data.target != nullptr)
if (pData->osc.data.target != nullptr)
{
osc_send_hide(&kData->osc.data);
osc_send_quit(&kData->osc.data);
osc_send_hide(&pData->osc.data);
osc_send_quit(&pData->osc.data);
}

kData->osc.data.free();
pData->osc.data.free();

// Wait a bit first, then force kill
if (kData->osc.thread.isRunning() && ! kData->osc.thread.wait(kData->engine->getOptions().oscUiTimeout))
if (pData->osc.thread.isRunning() && ! pData->osc.thread.wait(pData->engine->getOptions().oscUiTimeout))
{
carla_stderr("Failed to properly stop Plugin Bridge thread");
kData->osc.thread.terminate();
pData->osc.thread.terminate();
}

if (fNeedsSemDestroy)
@@ -398,7 +398,7 @@ public:

float getParameterValue(const uint32_t parameterId) override
{
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

return fParams[parameterId].value;
}
@@ -425,14 +425,14 @@ public:

void getParameterName(const uint32_t parameterId, char* const strBuf) override
{
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

std::strncpy(strBuf, (const char*)fParams[parameterId].name, STR_MAX);
}

void getParameterUnit(const uint32_t parameterId, char* const strBuf) override
{
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

std::strncpy(strBuf, (const char*)fParams[parameterId].unit, STR_MAX);
}
@@ -470,15 +470,15 @@ public:

void setParameterValue(const uint32_t parameterId, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) override
{
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

const float fixedValue(kData->param.fixValue(parameterId, value));
const float fixedValue(pData->param.fixValue(parameterId, value));
fParams[parameterId].value = fixedValue;

const bool doLock(sendGui || sendOsc || sendCallback);

if (doLock)
kData->singleMutex.lock();
pData->singleMutex.lock();

fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameter);
fShmControl.writeInt(parameterId);
@@ -487,7 +487,7 @@ public:
if (doLock)
{
fShmControl.commitWrite();
kData->singleMutex.unlock();
pData->singleMutex.unlock();
}

CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback);
@@ -495,17 +495,17 @@ public:

void setProgram(int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback) override
{
CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(kData->prog.count));
CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(pData->prog.count));

if (index < -1)
index = -1;
else if (index > static_cast<int32_t>(kData->prog.count))
else if (index > static_cast<int32_t>(pData->prog.count))
return;

const bool doLock(sendGui || sendOsc || sendCallback);

if (doLock)
kData->singleMutex.lock();
pData->singleMutex.lock();

fShmControl.writeOpcode(kPluginBridgeOpcodeSetProgram);
fShmControl.writeInt(index);
@@ -513,7 +513,7 @@ public:
if (doLock)
{
fShmControl.commitWrite();
kData->singleMutex.unlock();
pData->singleMutex.unlock();
}

CarlaPlugin::setProgram(index, sendGui, sendOsc, sendCallback);
@@ -521,17 +521,17 @@ public:

void setMidiProgram(int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback) override
{
CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(kData->midiprog.count));
CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(pData->midiprog.count));

if (index < -1)
index = -1;
else if (index > static_cast<int32_t>(kData->midiprog.count))
else if (index > static_cast<int32_t>(pData->midiprog.count))
return;

const bool doLock(sendGui || sendOsc || sendCallback);

if (doLock)
kData->singleMutex.lock();
pData->singleMutex.lock();

fShmControl.writeOpcode(kPluginBridgeOpcodeSetMidiProgram);
fShmControl.writeInt(index);
@@ -539,7 +539,7 @@ public:
if (doLock)
{
fShmControl.commitWrite();
kData->singleMutex.unlock();
pData->singleMutex.unlock();
}

CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback);
@@ -597,14 +597,14 @@ public:
void showGui(const bool yesNo) override
{
if (yesNo)
osc_send_show(&kData->osc.data);
osc_send_show(&pData->osc.data);
else
osc_send_hide(&kData->osc.data);
osc_send_hide(&pData->osc.data);
}

void idleGui() override
{
if (! kData->osc.thread.isRunning())
if (! pData->osc.thread.isRunning())
carla_stderr2("TESTING: Bridge has closed!");

CarlaPlugin::idleGui();
@@ -616,12 +616,12 @@ public:
void reload() override
{
carla_debug("BridgePlugin::reload() - start");
CARLA_ASSERT(kData->engine != nullptr);
CARLA_ASSERT(pData->engine != nullptr);

if (kData->engine == nullptr)
if (pData->engine == nullptr)
return;

const ProcessMode processMode(kData->engine->getProccessMode());
const ProcessMode processMode(pData->engine->getProccessMode());

// Safely disable plugin for reload
const ScopedDisabler sd(this);
@@ -631,12 +631,12 @@ public:

if (fInfo.aIns > 0)
{
kData->audioIn.createNew(fInfo.aIns);
pData->audioIn.createNew(fInfo.aIns);
}

if (fInfo.aOuts > 0)
{
kData->audioOut.createNew(fInfo.aOuts);
pData->audioOut.createNew(fInfo.aOuts);
needsCtrlIn = true;
}

@@ -646,7 +646,7 @@ public:
if (fInfo.mOuts > 0)
needsCtrlOut = true;

const uint portNameSize(kData->engine->maxPortNameSize());
const uint portNameSize(pData->engine->maxPortNameSize());
CarlaString portName;

// Audio Ins
@@ -669,8 +669,8 @@ public:
portName += "input";
portName.truncate(portNameSize);

kData->audioIn.ports[j].port = (CarlaEngineAudioPort*)kData->client->addPort(kEnginePortTypeAudio, portName, true);
kData->audioIn.ports[j].rindex = j;
pData->audioIn.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, true);
pData->audioIn.ports[j].rindex = j;
}

// Audio Outs
@@ -693,8 +693,8 @@ public:
portName += "output";
portName.truncate(portNameSize);

kData->audioOut.ports[j].port = (CarlaEngineAudioPort*)kData->client->addPort(kEnginePortTypeAudio, portName, false);
kData->audioOut.ports[j].rindex = j;
pData->audioOut.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false);
pData->audioOut.ports[j].rindex = j;
}

if (needsCtrlIn)
@@ -710,7 +710,7 @@ public:
portName += "event-in";
portName.truncate(portNameSize);

kData->event.portIn = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, true);
pData->event.portIn = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, true);
}

if (needsCtrlOut)
@@ -726,10 +726,10 @@ public:
portName += "event-out";
portName.truncate(portNameSize);

kData->event.portOut = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, false);
pData->event.portOut = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, false);
}

bufferSizeChanged(kData->engine->getBufferSize());
bufferSizeChanged(pData->engine->getBufferSize());
reloadPrograms(true);

carla_debug("BridgePlugin::reload() - end");
@@ -765,10 +765,10 @@ public:
// --------------------------------------------------------------------------------------------------------
// Check if active

if (! kData->active)
if (! pData->active)
{
// disable any output sound
for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
carla_zeroFloat(outBuffer[i], frames);

return;
@@ -777,26 +777,26 @@ public:
// --------------------------------------------------------------------------------------------------------
// Check if needs reset

if (kData->needsReset)
if (pData->needsReset)
{
// TODO

kData->needsReset = false;
pData->needsReset = false;
}

// --------------------------------------------------------------------------------------------------------
// Event Input

if (kData->event.portIn != nullptr)
if (pData->event.portIn != nullptr)
{
// ----------------------------------------------------------------------------------------------------
// MIDI Input (External)

if (kData->extNotes.mutex.tryLock())
if (pData->extNotes.mutex.tryLock())
{
while (! kData->extNotes.data.isEmpty())
while (! pData->extNotes.data.isEmpty())
{
const ExternalMidiNote& note(kData->extNotes.data.getFirst(true));
const ExternalMidiNote& note(pData->extNotes.data.getFirst(true));

CARLA_ASSERT(note.channel >= 0 && note.channel < MAX_MIDI_CHANNELS);

@@ -814,7 +814,7 @@ public:
fShmControl.writeChar(data3);
}

kData->extNotes.mutex.unlock();
pData->extNotes.mutex.unlock();

} // End of MIDI Input (External)

@@ -823,15 +823,15 @@ public:

bool allNotesOffSent = false;

uint32_t nEvents = kData->event.portIn->getEventCount();
uint32_t nEvents = pData->event.portIn->getEventCount();
uint32_t nextBankId = 0;

if (kData->midiprog.current >= 0 && kData->midiprog.count > 0)
nextBankId = kData->midiprog.data[kData->midiprog.current].bank;
if (pData->midiprog.current >= 0 && pData->midiprog.count > 0)
nextBankId = pData->midiprog.data[pData->midiprog.current].bank;

for (i=0; i < nEvents; ++i)
{
const EngineEvent& event(kData->event.portIn->getEvent(i));
const EngineEvent& event(pData->event.portIn->getEvent(i));

// Control change
switch (event.type)
@@ -851,7 +851,7 @@ public:
case kEngineControlEventTypeParameter:
{
// Control backend stuff
if (event.channel == kData->ctrlChannel)
if (event.channel == pData->ctrlChannel)
{
float value;

@@ -898,28 +898,28 @@ public:
}

// Control plugin parameters
for (k=0; k < kData->param.count; ++k)
for (k=0; k < pData->param.count; ++k)
{
if (kData->param.data[k].midiChannel != event.channel)
if (pData->param.data[k].midiChannel != event.channel)
continue;
if (kData->param.data[k].midiCC != ctrlEvent.param)
if (pData->param.data[k].midiCC != ctrlEvent.param)
continue;
if (kData->param.data[k].type != PARAMETER_INPUT)
if (pData->param.data[k].type != PARAMETER_INPUT)
continue;
if ((kData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0)
if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0)
continue;

float value;

if (kData->param.data[k].hints & PARAMETER_IS_BOOLEAN)
if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN)
{
value = (ctrlEvent.value < 0.5f) ? kData->param.ranges[k].min : kData->param.ranges[k].max;
value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max;
}
else
{
value = kData->param.ranges[k].unnormalizeValue(ctrlEvent.value);
value = pData->param.ranges[k].unnormalizeValue(ctrlEvent.value);

if (kData->param.data[k].hints & PARAMETER_IS_INTEGER)
if (pData->param.data[k].hints & PARAMETER_IS_INTEGER)
value = std::rint(value);
}

@@ -941,20 +941,20 @@ public:
}

case kEngineControlEventTypeMidiBank:
if (event.channel == kData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
nextBankId = ctrlEvent.param;
break;

case kEngineControlEventTypeMidiProgram:
if (event.channel == kData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
{
const uint32_t nextProgramId(ctrlEvent.param);

if (kData->midiprog.count > 0)
if (pData->midiprog.count > 0)
{
for (k=0; k < kData->midiprog.count; ++k)
for (k=0; k < pData->midiprog.count; ++k)
{
if (kData->midiprog.data[k].bank == nextBankId && kData->midiprog.data[k].program == nextProgramId)
if (pData->midiprog.data[k].bank == nextBankId && pData->midiprog.data[k].program == nextProgramId)
{
setMidiProgram(k, false, false, false);
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0f);
@@ -978,7 +978,7 @@ public:
case kEngineControlEventTypeAllNotesOff:
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF)
{
if (event.channel == kData->ctrlChannel && ! allNotesOffSent)
if (event.channel == pData->ctrlChannel && ! allNotesOffSent)
{
allNotesOffSent = true;
sendMidiAllNotesOffToCallback();
@@ -1035,7 +1035,7 @@ public:
}
}

kData->postRtEvents.trySplice();
pData->postRtEvents.trySplice();

} // End of Event Input

@@ -1049,13 +1049,13 @@ public:
if (frames == 0)
return false;

if (kData->audioIn.count > 0)
if (pData->audioIn.count > 0)
{
CARLA_ASSERT(inBuffer != nullptr);
if (inBuffer == nullptr)
return false;
}
if (kData->audioOut.count > 0)
if (pData->audioOut.count > 0)
{
CARLA_ASSERT(outBuffer != nullptr);
if (outBuffer == nullptr)
@@ -1067,13 +1067,13 @@ public:
// --------------------------------------------------------------------------------------------------------
// Try lock, silence otherwise

if (kData->engine->isOffline())
if (pData->engine->isOffline())
{
kData->singleMutex.lock();
pData->singleMutex.lock();
}
else if (! kData->singleMutex.tryLock())
else if (! pData->singleMutex.tryLock())
{
for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
carla_zeroFloat(outBuffer[i], frames);

return false;
@@ -1093,7 +1093,7 @@ public:

if (! waitForServer())
{
kData->singleMutex.unlock();
pData->singleMutex.unlock();
return true;
}

@@ -1104,22 +1104,22 @@ public:
// Post-processing (dry/wet, volume and balance)

{
const bool doVolume = (fHints & PLUGIN_CAN_VOLUME) != 0 && kData->postProc.volume != 1.0f;
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && kData->postProc.dryWet != 1.0f;
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (kData->postProc.balanceLeft != -1.0f || kData->postProc.balanceRight != 1.0f);
const bool doVolume = (fHints & PLUGIN_CAN_VOLUME) != 0 && pData->postProc.volume != 1.0f;
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f;
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f);

bool isPair;
float bufValue, oldBufLeft[doBalance ? frames : 1];

for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
{
// Dry/Wet
if (doDryWet)
{
for (k=0; k < frames; ++k)
{
bufValue = inBuffer[(kData->audioIn.count == 1) ? 0 : i][k];
outBuffer[i][k] = (outBuffer[i][k] * kData->postProc.dryWet) + (bufValue * (1.0f - kData->postProc.dryWet));
bufValue = inBuffer[(pData->audioIn.count == 1) ? 0 : i][k];
outBuffer[i][k] = (outBuffer[i][k] * pData->postProc.dryWet) + (bufValue * (1.0f - pData->postProc.dryWet));
}
}

@@ -1130,12 +1130,12 @@ public:

if (isPair)
{
CARLA_ASSERT(i+1 < kData->audioOut.count);
CARLA_ASSERT(i+1 < pData->audioOut.count);
carla_copyFloat(oldBufLeft, outBuffer[i], frames);
}

float balRangeL = (kData->postProc.balanceLeft + 1.0f)/2.0f;
float balRangeR = (kData->postProc.balanceRight + 1.0f)/2.0f;
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f;
float balRangeR = (pData->postProc.balanceRight + 1.0f)/2.0f;

for (k=0; k < frames; ++k)
{
@@ -1158,7 +1158,7 @@ public:
if (doVolume)
{
for (k=0; k < frames; ++k)
outBuffer[i][k] *= kData->postProc.volume;
outBuffer[i][k] *= pData->postProc.volume;
}
}

@@ -1166,7 +1166,7 @@ public:

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

kData->singleMutex.unlock();
pData->singleMutex.unlock();
return true;
}

@@ -1269,7 +1269,7 @@ public:
CARLA_ASSERT(pIns + pOuts <= pTotal);

// delete old data
kData->param.clear();
pData->param.clear();

if (fParams != nullptr)
{
@@ -1277,13 +1277,13 @@ public:
fParams = nullptr;
}

CARLA_SAFE_ASSERT_INT2(pTotal < static_cast<int32_t>(kData->engine->getOptions().maxParameters), pTotal, kData->engine->getOptions().maxParameters);
CARLA_SAFE_ASSERT_INT2(pTotal < static_cast<int32_t>(pData->engine->getOptions().maxParameters), pTotal, pData->engine->getOptions().maxParameters);

const int32_t count(carla_min<int32_t>(pTotal, kData->engine->getOptions().maxParameters, 0));
const int32_t count(carla_min<int32_t>(pTotal, pData->engine->getOptions().maxParameters, 0));

if (count > 0)
{
kData->param.createNew(count);
pData->param.createNew(count);
fParams = new BridgeParamInfo[count];
}

@@ -1302,10 +1302,10 @@ public:

CARLA_ASSERT(count >= 0);

kData->prog.clear();
pData->prog.clear();

if (count > 0)
kData->prog.createNew(count);
pData->prog.createNew(count);

break;
}
@@ -1318,10 +1318,10 @@ public:

CARLA_ASSERT(count >= 0);

kData->midiprog.clear();
pData->midiprog.clear();

if (count > 0)
kData->midiprog.createNew(count);
pData->midiprog.createNew(count);

break;
}
@@ -1369,11 +1369,11 @@ public:
const char* const name = (const char*)&argv[1]->s;
const char* const unit = (const char*)&argv[2]->s;

CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(kData->param.count), index, kData->param.count);
CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(pData->param.count), index, pData->param.count);
CARLA_ASSERT(name != nullptr);
CARLA_ASSERT(unit != nullptr);

if (index >= 0 && static_cast<int32_t>(kData->param.count))
if (index >= 0 && static_cast<int32_t>(pData->param.count))
{
fParams[index].name = name;
fParams[index].unit = unit;
@@ -1393,21 +1393,21 @@ public:
const int32_t channel = argv[4]->i;
const int32_t cc = argv[5]->i;

CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(kData->param.count), index, kData->param.count);
CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(pData->param.count), index, pData->param.count);
CARLA_ASSERT(type >= 0);
CARLA_ASSERT(rindex >= 0);
CARLA_ASSERT(hints >= 0);
CARLA_ASSERT(channel >= 0 && channel < 16);
CARLA_ASSERT(cc >= -1);

if (index >= 0 && static_cast<int32_t>(kData->param.count))
if (index >= 0 && static_cast<int32_t>(pData->param.count))
{
kData->param.data[index].type = static_cast<ParameterType>(type);
kData->param.data[index].index = index;
kData->param.data[index].rindex = rindex;
kData->param.data[index].hints = hints;
kData->param.data[index].midiChannel = channel;
kData->param.data[index].midiCC = cc;
pData->param.data[index].type = static_cast<ParameterType>(type);
pData->param.data[index].index = index;
pData->param.data[index].rindex = rindex;
pData->param.data[index].hints = hints;
pData->param.data[index].midiChannel = channel;
pData->param.data[index].midiCC = cc;
}

break;
@@ -1425,19 +1425,19 @@ public:
const float stepSmall = argv[5]->f;
const float stepLarge = argv[6]->f;

CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(kData->param.count), index, kData->param.count);
CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(pData->param.count), index, pData->param.count);
CARLA_ASSERT(min < max);
CARLA_ASSERT(def >= min);
CARLA_ASSERT(def <= max);

if (index >= 0 && static_cast<int32_t>(kData->param.count))
if (index >= 0 && static_cast<int32_t>(pData->param.count))
{
kData->param.ranges[index].def = def;
kData->param.ranges[index].min = min;
kData->param.ranges[index].max = max;
kData->param.ranges[index].step = step;
kData->param.ranges[index].stepSmall = stepSmall;
kData->param.ranges[index].stepLarge = stepLarge;
pData->param.ranges[index].def = def;
pData->param.ranges[index].min = min;
pData->param.ranges[index].max = max;
pData->param.ranges[index].step = step;
pData->param.ranges[index].stepSmall = stepSmall;
pData->param.ranges[index].stepLarge = stepLarge;
}

break;
@@ -1450,15 +1450,15 @@ public:
const int32_t index = argv[0]->i;
const char* const name = (const char*)&argv[1]->s;

CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(kData->prog.count), index, kData->prog.count);
CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(pData->prog.count), index, pData->prog.count);
CARLA_ASSERT(name != nullptr);

if (index >= 0 && index < static_cast<int32_t>(kData->prog.count))
if (index >= 0 && index < static_cast<int32_t>(pData->prog.count))
{
if (kData->prog.names[index] != nullptr)
delete[] kData->prog.names[index];
if (pData->prog.names[index] != nullptr)
delete[] pData->prog.names[index];

kData->prog.names[index] = carla_strdup(name);
pData->prog.names[index] = carla_strdup(name);
}

break;
@@ -1473,19 +1473,19 @@ public:
const int32_t program = argv[2]->i;
const char* const name = (const char*)&argv[3]->s;

CARLA_ASSERT_INT2(index < static_cast<int32_t>(kData->midiprog.count), index, kData->midiprog.count);
CARLA_ASSERT_INT2(index < static_cast<int32_t>(pData->midiprog.count), index, pData->midiprog.count);
CARLA_ASSERT(bank >= 0);
CARLA_ASSERT(program >= 0 && program < 128);
CARLA_ASSERT(name != nullptr);

if (index >= 0 && index < static_cast<int32_t>(kData->midiprog.count))
if (index >= 0 && index < static_cast<int32_t>(pData->midiprog.count))
{
if (kData->midiprog.data[index].name != nullptr)
delete[] kData->midiprog.data[index].name;
if (pData->midiprog.data[index].name != nullptr)
delete[] pData->midiprog.data[index].name;

kData->midiprog.data[index].bank = bank;
kData->midiprog.data[index].program = program;
kData->midiprog.data[index].name = carla_strdup(name);
pData->midiprog.data[index].bank = bank;
pData->midiprog.data[index].program = program;
pData->midiprog.data[index].name = carla_strdup(name);
}

break;
@@ -1505,7 +1505,7 @@ public:
break;

if (std::strcmp(key, CARLA_BRIDGE_MSG_HIDE_GUI) == 0)
kData->engine->callback(CALLBACK_SHOW_GUI, fId, 0, 0, 0.0f, nullptr);
pData->engine->callback(CALLBACK_SHOW_GUI, fId, 0, 0, 0.0f, nullptr);
else if (std::strcmp(key, CARLA_BRIDGE_MSG_SAVED) == 0)
fSaved = true;

@@ -1519,11 +1519,11 @@ public:
const int32_t index = argv[0]->i;
const float value = argv[1]->f;

CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(kData->param.count), index, kData->param.count);
CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(pData->param.count), index, pData->param.count);

if (index >= 0 && static_cast<int32_t>(kData->param.count))
if (index >= 0 && static_cast<int32_t>(pData->param.count))
{
const float fixedValue(kData->param.fixValue(index, value));
const float fixedValue(pData->param.fixValue(index, value));
fParams[index].value = fixedValue;

CarlaPlugin::setParameterValue(index, fixedValue, false, true, true);
@@ -1539,10 +1539,10 @@ public:
const int32_t index = argv[0]->i;
const float value = argv[1]->f;

CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(kData->param.count), index, kData->param.count);
CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(pData->param.count), index, pData->param.count);

if (index >= 0 && static_cast<int32_t>(kData->param.count))
kData->param.ranges[index].def = value;
if (index >= 0 && static_cast<int32_t>(pData->param.count))
pData->param.ranges[index].def = value;

break;
}
@@ -1553,7 +1553,7 @@ public:

const int32_t index = argv[0]->i;

CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(kData->prog.count), index, kData->prog.count);
CARLA_ASSERT_INT2(index >= 0 && index < static_cast<int32_t>(pData->prog.count), index, pData->prog.count);

setProgram(index, false, true, true);

@@ -1566,7 +1566,7 @@ public:

const int32_t index = argv[0]->i;

CARLA_ASSERT_INT2(index < static_cast<int32_t>(kData->midiprog.count), index, kData->midiprog.count);
CARLA_ASSERT_INT2(index < static_cast<int32_t>(pData->midiprog.count), index, pData->midiprog.count);

setMidiProgram(index, false, true, true);

@@ -1655,7 +1655,7 @@ public:

CARLA_ASSERT(error != nullptr);

kData->engine->setLastError(error);
pData->engine->setLastError(error);

fInitError = true;
fInitiated = true;
@@ -1675,20 +1675,20 @@ public:

bool init(const char* const filename, const char* const name, const char* const label, const char* const bridgeBinary)
{
CARLA_ASSERT(kData->engine != nullptr);
CARLA_ASSERT(kData->client == nullptr);
CARLA_ASSERT(pData->engine != nullptr);
CARLA_ASSERT(pData->client == nullptr);

// ---------------------------------------------------------------
// first checks

if (kData->engine == nullptr)
if (pData->engine == nullptr)
{
return false;
}

if (kData->client != nullptr)
if (pData->client != nullptr)
{
kData->engine->setLastError("Plugin client is already registered");
pData->engine->setLastError("Plugin client is already registered");
return false;
}

@@ -1696,7 +1696,7 @@ public:
// set info

if (name != nullptr)
fName = kData->engine->getUniquePluginName(name);
fName = pData->engine->getUniquePluginName(name);

fFilename = filename;
fBridgeBinary = bridgeBinary;
@@ -1776,16 +1776,16 @@ public:

// initial values
fShmControl.writeOpcode(kPluginBridgeOpcodeSetBufferSize);
fShmControl.writeInt(kData->engine->getBufferSize());
fShmControl.writeInt(pData->engine->getBufferSize());

fShmControl.writeOpcode(kPluginBridgeOpcodeSetSampleRate);
fShmControl.writeFloat(kData->engine->getSampleRate());
fShmControl.writeFloat(pData->engine->getSampleRate());

fShmControl.commitWrite();

// register plugin now so we can receive OSC (and wait for it)
fHints |= PLUGIN_IS_BRIDGE;
registerEnginePlugin(kData->engine, fId, this);
registerEnginePlugin(pData->engine, fId, this);

// init OSC
{
@@ -1793,13 +1793,13 @@ public:
std::strncpy(shmIdStr, &fShmAudioPool.filename[fShmAudioPool.filename.length()-6], 6);
std::strncat(shmIdStr, &fShmControl.filename[fShmControl.filename.length()-6], 6);

kData->osc.thread.setOscData(bridgeBinary, label, getPluginTypeAsString(fPluginType), shmIdStr);
kData->osc.thread.start();
pData->osc.thread.setOscData(bridgeBinary, label, getPluginTypeAsString(fPluginType), shmIdStr);
pData->osc.thread.start();
}

for (int i=0; i < 200; ++i)
{
if (fInitiated || ! kData->osc.thread.isRunning())
if (fInitiated || ! pData->osc.thread.isRunning())
break;
carla_msleep(50);
}
@@ -1807,15 +1807,15 @@ public:
if (fInitError || ! fInitiated)
{
// unregister so it gets handled properly
registerEnginePlugin(kData->engine, fId, nullptr);
registerEnginePlugin(pData->engine, fId, nullptr);

kData->osc.thread.quit();
pData->osc.thread.quit();

if (kData->osc.thread.isRunning())
kData->osc.thread.terminate();
if (pData->osc.thread.isRunning())
pData->osc.thread.terminate();

if (! fInitError)
kData->engine->setLastError("Timeout while waiting for a response from plugin-bridge\n(or the plugin crashed on initialization?)");
pData->engine->setLastError("Timeout while waiting for a response from plugin-bridge\n(or the plugin crashed on initialization?)");

return false;
}
@@ -1826,18 +1826,18 @@ public:
if (fName.isEmpty())
{
if (name != nullptr)
fName = kData->engine->getUniquePluginName(name);
fName = pData->engine->getUniquePluginName(name);
else if (label != nullptr)
fName = kData->engine->getUniquePluginName(label);
fName = pData->engine->getUniquePluginName(label);
else
fName = kData->engine->getUniquePluginName("unknown");
fName = pData->engine->getUniquePluginName("unknown");
}

kData->client = kData->engine->addClient(this);
pData->client = pData->engine->addClient(this);

if (kData->client == nullptr || ! kData->client->isOk())
if (pData->client == nullptr || ! pData->client->isOk())
{
kData->engine->setLastError("Failed to register plugin client");
pData->engine->setLastError("Failed to register plugin client");
return false;
}

@@ -1896,7 +1896,7 @@ private:
if (! fShmControl.waitForServer())
{
carla_stderr("waitForServer() timeout");
kData->active = false; // TODO
pData->active = false; // TODO
return false;
}



+ 105
- 120
source/backend/plugin/CarlaPlugin.cpp View File

@@ -117,8 +117,8 @@ public:

private:
struct Lib {
void* const lib;
const char* const filename;
void* lib;
const char* filename;
int count;

#ifndef CARLA_PROPER_CPP11_SUPPORT
@@ -256,29 +256,6 @@ unsigned int CarlaPluginProtectedData::loadSettings(const unsigned int options,
return newOptions;
}

// -------------------------------------------------------------------
// Plugin Helpers

CarlaEngine* CarlaPluginGetEngine(CarlaPlugin* const plugin)
{
return CarlaPluginProtectedData::getEngine(plugin);
}

CarlaEngineClient* CarlaPluginGetEngineClient(CarlaPlugin* const plugin)
{
return CarlaPluginProtectedData::getEngineClient(plugin);
}

CarlaEngineAudioPort* CarlaPluginGetAudioInPort(CarlaPlugin* const plugin, const uint32_t index)
{
return CarlaPluginProtectedData::getAudioInPort(plugin, index);
}

CarlaEngineAudioPort* CarlaPluginGetAudioOutPort(CarlaPlugin* const plugin, const uint32_t index)
{
return CarlaPluginProtectedData::getAudioOutPort(plugin, index);
}

// -------------------------------------------------------------------
// Constructor and destructor

@@ -290,10 +267,10 @@ CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id)
fIconName("plugin"),
pData(new CarlaPluginProtectedData(engine, this))
{
CARLA_ASSERT(kData != nullptr);
CARLA_ASSERT(pData != nullptr);
CARLA_ASSERT(engine != nullptr);
CARLA_ASSERT(id < engine->maxPluginNumber());
CARLA_ASSERT(id == engine->currentPluginCount());
CARLA_ASSERT(id < engine->getMaxPluginNumber());
CARLA_ASSERT(id == engine->getCurrentPluginCount());
carla_debug("CarlaPlugin::CarlaPlugin(%p, %i)", engine, id);

switch (engine->getProccessMode())
@@ -454,7 +431,7 @@ unsigned int CarlaPlugin::getAvailableOptions() const

float CarlaPlugin::getParameterValue(const uint32_t parameterId) const
{
CARLA_ASSERT(parameterId < parameterCount());
CARLA_ASSERT(parameterId < getParameterCount());
CARLA_ASSERT(false); // this should never happen
return 0.0f;

@@ -464,8 +441,8 @@ float CarlaPlugin::getParameterValue(const uint32_t parameterId) const

float CarlaPlugin::getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId) const
{
CARLA_ASSERT(parameterId < parameterCount());
CARLA_ASSERT(scalePointId < parameterScalePointCount(parameterId));
CARLA_ASSERT(parameterId < getParameterCount());
CARLA_ASSERT(scalePointId < getParameterScalePointCount(parameterId));
CARLA_ASSERT(false); // this should never happen
return 0.0f;

@@ -496,7 +473,7 @@ void CarlaPlugin::getRealName(char* const strBuf) const noexcept

void CarlaPlugin::getParameterName(const uint32_t parameterId, char* const strBuf) const
{
CARLA_ASSERT(parameterId < parameterCount());
CARLA_ASSERT(parameterId < getParameterCount());
CARLA_ASSERT(false); // this should never happen
*strBuf = '\0';
return;
@@ -507,7 +484,7 @@ void CarlaPlugin::getParameterName(const uint32_t parameterId, char* const strBu

void CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const strBuf) const
{
CARLA_ASSERT(parameterId < parameterCount());
CARLA_ASSERT(parameterId < getParameterCount());
*strBuf = '\0';
return;

@@ -517,7 +494,7 @@ void CarlaPlugin::getParameterSymbol(const uint32_t parameterId, char* const str

void CarlaPlugin::getParameterText(const uint32_t parameterId, char* const strBuf) const
{
CARLA_ASSERT(parameterId < parameterCount());
CARLA_ASSERT(parameterId < getParameterCount());
CARLA_ASSERT(false); // this should never happen
*strBuf = '\0';
return;
@@ -528,7 +505,7 @@ void CarlaPlugin::getParameterText(const uint32_t parameterId, char* const strBu

void CarlaPlugin::getParameterUnit(const uint32_t parameterId, char* const strBuf) const
{
CARLA_ASSERT(parameterId < parameterCount());
CARLA_ASSERT(parameterId < getParameterCount());
*strBuf = '\0';
return;

@@ -538,8 +515,8 @@ void CarlaPlugin::getParameterUnit(const uint32_t parameterId, char* const strBu

void CarlaPlugin::getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const
{
CARLA_ASSERT(parameterId < parameterCount());
CARLA_ASSERT(scalePointId < parameterScalePointCount(parameterId));
CARLA_ASSERT(parameterId < getParameterCount());
CARLA_ASSERT(scalePointId < getParameterScalePointCount(parameterId));
CARLA_ASSERT(false); // this should never happen
*strBuf = '\0';
return;
@@ -611,7 +588,7 @@ const SaveState& CarlaPlugin::getSaveState()
// ----------------------------
// Basic info

switch (type())
switch (getType())
{
case PLUGIN_NONE:
saveState.type = carla_strdup("None");
@@ -634,6 +611,9 @@ const SaveState& CarlaPlugin::getSaveState()
case PLUGIN_VST3:
saveState.type = carla_strdup("VST3");
break;
case PLUGIN_AU:
saveState.type = carla_strdup("AU");
break;
case PLUGIN_GIG:
saveState.type = carla_strdup("GIG");
break;
@@ -650,7 +630,7 @@ const SaveState& CarlaPlugin::getSaveState()
saveState.name = carla_strdup(fName);
saveState.label = carla_strdup(strBuf);
saveState.binary = carla_strdup(fFilename);
saveState.uniqueID = uniqueId();
saveState.uniqueID = getUniqueId();

// ----------------------------
// Internals
@@ -672,7 +652,7 @@ const SaveState& CarlaPlugin::getSaveState()
if (fOptions & PLUGIN_OPTION_USE_CHUNKS)
{
void* data = nullptr;
const int32_t dataSize(chunkData(&data));
const int32_t dataSize(getChunkData(&data));

if (data != nullptr && dataSize > 0)
{
@@ -785,7 +765,7 @@ struct ParamSymbol {
void CarlaPlugin::loadSaveState(const SaveState& saveState)
{
char strBuf[STR_MAX+1];
const bool usesMultiProgs(type() == PLUGIN_SF2 || (type() == PLUGIN_INTERNAL && (fHints & PLUGIN_IS_SYNTH) != 0));
const bool usesMultiProgs(getType() == PLUGIN_SF2 || (getType() == PLUGIN_INTERNAL && (fHints & PLUGIN_IS_SYNTH) != 0));

// ---------------------------------------------------------------------
// Part 1 - PRE-set custom data (only that which reload programs)
@@ -797,7 +777,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState)

bool wantData = false;

if (type() == PLUGIN_DSSI && (std::strcmp(key, "reloadprograms") == 0 || std::strcmp(key, "load") == 0 || std::strncmp(key, "patches", 7) == 0))
if (getType() == PLUGIN_DSSI && (std::strcmp(key, "reloadprograms") == 0 || std::strcmp(key, "load") == 0 || std::strncmp(key, "patches", 7) == 0))
wantData = true;
else if (usesMultiProgs && std::strcmp(key, "midiPrograms") == 0)
wantData = true;
@@ -856,7 +836,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState)

NonRtList<ParamSymbol*> paramSymbols;

if (type() == PLUGIN_LADSPA || type() == PLUGIN_LV2)
if (getType() == PLUGIN_LADSPA || getType() == PLUGIN_LV2)
{
for (uint32_t i=0; i < pData->param.count; ++i)
{
@@ -881,7 +861,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState)

int32_t index = -1;

if (type() == PLUGIN_LADSPA)
if (getType() == PLUGIN_LADSPA)
{
// Try to set by symbol, otherwise use index
if (stateParameter->symbol != nullptr && *stateParameter->symbol != 0)
@@ -902,7 +882,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState)
else
index = stateParameter->index;
}
else if (type() == PLUGIN_LV2)
else if (getType() == PLUGIN_LV2)
{
// Symbol only
if (stateParameter->symbol != nullptr && *stateParameter->symbol != 0)
@@ -963,7 +943,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState)
const StateCustomData* const stateCustomData(*it);
const char* const key(stateCustomData->key);

if (type() == PLUGIN_DSSI && (std::strcmp(key, "reloadprograms") == 0 || std::strcmp(key, "load") == 0 || std::strncmp(key, "patches", 7) == 0))
if (getType() == PLUGIN_DSSI && (std::strcmp(key, "reloadprograms") == 0 || std::strcmp(key, "load") == 0 || std::strncmp(key, "patches", 7) == 0))
continue;
if (usesMultiProgs && std::strcmp(key, "midiPrograms") == 0)
continue;
@@ -1002,11 +982,14 @@ bool CarlaPlugin::saveStateToFile(const char* const filename)
if (! file.open(QIODevice::WriteOnly | QIODevice::Text))
return false;

QString content;
fillXmlStringFromSaveState(content, getSaveState());

QTextStream out(&file);
out << "<?xml version='1.0' encoding='UTF-8'?>\n";
out << "<!DOCTYPE CARLA-PRESET>\n";
out << "<CARLA-PRESET VERSION='1.0'>\n";
out << getXMLFromSaveState(getSaveState());
out << content;
out << "</CARLA-PRESET>\n";

file.close();
@@ -1035,7 +1018,9 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename)
return false;
}

loadSaveState(getSaveStateDictFromXML(xmlNode));
SaveState saveState;
fillSaveStateFromXmlNode(saveState, xmlNode);
loadSaveState(saveState);

return true;
}
@@ -1057,7 +1042,7 @@ void CarlaPlugin::setName(const char* const newName)

void CarlaPlugin::setOption(const unsigned int option, const bool yesNo)
{
CARLA_ASSERT(availableOptions() & option);
CARLA_ASSERT(getAvailableOptions() & option);

if (yesNo)
fOptions |= option;
@@ -1105,7 +1090,7 @@ void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool se
const float value(active ? 1.0f : 0.0f);

if (sendOsc)
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, value);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_ACTIVE, value);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_ACTIVE, 0, value, nullptr);
@@ -1131,7 +1116,7 @@ void CarlaPlugin::setDryWet(const float value, const bool sendOsc, const bool se
pData->postProc.dryWet = fixedValue;

if (sendOsc)
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, fixedValue);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_DRYWET, fixedValue);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_DRYWET, 0, fixedValue, nullptr);
@@ -1149,7 +1134,7 @@ void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool se
pData->postProc.volume = fixedValue;

if (sendOsc)
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, fixedValue);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_VOLUME, fixedValue);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_VOLUME, 0, fixedValue, nullptr);
@@ -1167,7 +1152,7 @@ void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bo
pData->postProc.balanceLeft = fixedValue;

if (sendOsc)
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, fixedValue);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, fixedValue);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_BALANCE_LEFT, 0, fixedValue, nullptr);
@@ -1185,7 +1170,7 @@ void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const b
pData->postProc.balanceRight = fixedValue;

if (sendOsc)
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, fixedValue);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, fixedValue);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_BALANCE_RIGHT, 0, fixedValue, nullptr);
@@ -1203,7 +1188,7 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s
pData->postProc.panning = fixedValue;

if (sendOsc)
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, fixedValue);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_PANNING, fixedValue);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_PANNING, 0, fixedValue, nullptr);
@@ -1226,13 +1211,13 @@ void CarlaPlugin::setCtrlChannel(const int8_t channel, const bool sendOsc, const
const float ctrlf(channel);

if (sendOsc)
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, ctrlf);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, ctrlf);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_CTRL_CHANNEL, 0, ctrlf, nullptr);

if (fHints & PLUGIN_IS_BRIDGE)
osc_send_control(&pData->osc.data, PARAMETER_CTRL_CHANNEL, ctrlf);
osc_send_control(pData->osc.data, PARAMETER_CTRL_CHANNEL, ctrlf);
#else
return;

@@ -1257,7 +1242,7 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu
uiParameterChange(parameterId, value);

if (sendOsc)
pData->engine->osc_send_control_set_parameter_value(fId, parameterId, value);
pData->engine->oscSend_control_set_parameter_value(fId, parameterId, value);
#endif

if (sendCallback)
@@ -1323,7 +1308,7 @@ void CarlaPlugin::setParameterMidiChannel(const uint32_t parameterId, uint8_t ch

#ifndef BUILD_BRIDGE
if (sendOsc)
pData->engine->osc_send_control_set_parameter_midi_channel(fId, parameterId, channel);
pData->engine->oscSend_control_set_parameter_midi_channel(fId, parameterId, channel);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED, fId, parameterId, channel, 0.0f, nullptr);
@@ -1352,7 +1337,7 @@ void CarlaPlugin::setParameterMidiCC(const uint32_t parameterId, int16_t cc, con

#ifndef BUILD_BRIDGE
if (sendOsc)
pData->engine->osc_send_control_set_parameter_midi_cc(fId, parameterId, cc);
pData->engine->oscSend_control_set_parameter_midi_cc(fId, parameterId, cc);

if (sendCallback)
pData->engine->callback(CALLBACK_PARAMETER_MIDI_CC_CHANGED, fId, parameterId, cc, 0.0f, nullptr);
@@ -1459,7 +1444,7 @@ void CarlaPlugin::setProgram(int32_t index, const bool sendGui, const bool sendO

#ifndef BUILD_BRIDGE
if (sendOsc)
pData->engine->osc_send_control_set_program(fId, fixedIndex);
pData->engine->oscSend_control_set_program(fId, fixedIndex);
#endif

if (sendCallback)
@@ -1473,20 +1458,20 @@ void CarlaPlugin::setProgram(int32_t index, const bool sendGui, const bool sendO
uiProgramChange(fixedIndex);
#endif

if (type() == PLUGIN_GIG || type() == PLUGIN_SF2 || type() == PLUGIN_SFZ)
if (getType() == PLUGIN_GIG || getType() == PLUGIN_SF2 || getType() == PLUGIN_SFZ)
return;

for (uint32_t i=0; i < pData->param.count; ++i)
{
const float value(pData->param.ranges[i].fixValue(getParameterValue(i)));
const float value(pData->param.ranges[i].getFixedValue(getParameterValue(i)));

pData->param.ranges[i].def = value;

if (sendOsc || sendCallback)
{
#ifndef BUILD_BRIDGE
pData->engine->osc_send_control_set_default_value(fId, i, value);
pData->engine->osc_send_control_set_parameter_value(fId, i, value);
pData->engine->oscSend_control_set_default_value(fId, i, value);
pData->engine->oscSend_control_set_parameter_value(fId, i, value);
#endif

pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, i, 0, value, nullptr);
@@ -1519,7 +1504,7 @@ void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool s

#ifndef BUILD_BRIDGE
if (sendOsc)
pData->engine->osc_send_control_set_midi_program(fId, fixedIndex);
pData->engine->oscSend_control_set_midi_program(fId, fixedIndex);
#endif

if (sendCallback)
@@ -1532,20 +1517,20 @@ void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool s
uiMidiProgramChange(fixedIndex);
#endif

if (type() == PLUGIN_GIG || type() == PLUGIN_SF2 || type() == PLUGIN_SFZ)
if (getType() == PLUGIN_GIG || getType() == PLUGIN_SF2 || getType() == PLUGIN_SFZ)
return;

for (uint32_t i=0; i < pData->param.count; ++i)
{
const float value(pData->param.ranges[i].fixValue(getParameterValue(i)));
const float value(pData->param.ranges[i].getFixedValue(getParameterValue(i)));

pData->param.ranges[i].def = value;

if (sendOsc || sendCallback)
{
#ifndef BUILD_BRIDGE
pData->engine->osc_send_control_set_default_value(fId, i, value);
pData->engine->osc_send_control_set_parameter_value(fId, i, value);
pData->engine->oscSend_control_set_default_value(fId, i, value);
pData->engine->oscSend_control_set_parameter_value(fId, i, value);
#endif

pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, i, 0, value, nullptr);
@@ -1641,7 +1626,7 @@ bool CarlaPlugin::tryLock()

void CarlaPlugin::unlock()
{
pData->masterMutex.unlock(true);
pData->masterMutex.unlock();
}

// -------------------------------------------------------------------
@@ -1673,7 +1658,7 @@ void CarlaPlugin::registerToOscClient()
#endif

#ifndef BUILD_BRIDGE
pData->engine->osc_send_control_add_plugin_start(fId, fName);
pData->engine->oscSend_control_add_plugin_start(fId, fName);
#endif

// Base data
@@ -1690,7 +1675,7 @@ void CarlaPlugin::registerToOscClient()
#ifdef BUILD_BRIDGE
pData->engine->osc_send_bridge_plugin_info(category(), fHints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId());
#else
pData->engine->osc_send_control_set_plugin_data(fId, type(), category(), fHints, bufName, bufLabel, bufMaker, bufCopyright, uniqueId());
pData->engine->oscSend_control_set_plugin_data(fId, getType(), getCategory(), fHints, bufName, bufLabel, bufMaker, bufCopyright, getUniqueId());
#endif
}

@@ -1704,7 +1689,7 @@ void CarlaPlugin::registerToOscClient()
pData->engine->osc_send_bridge_midi_count(midiInCount(), midiOutCount(), midiInCount() + midiOutCount());
pData->engine->osc_send_bridge_parameter_count(cIns, cOuts, cTotals);
#else
pData->engine->osc_send_control_set_plugin_ports(fId, audioInCount(), audioOutCount(), midiInCount(), midiOutCount(), cIns, cOuts, cTotals);
pData->engine->oscSend_control_set_plugin_ports(fId, getAudioInCount(), getAudioOutCount(), getMidiInCount(), getMidiOutCount(), cIns, cOuts, cTotals);
#endif
}

@@ -1730,10 +1715,10 @@ void CarlaPlugin::registerToOscClient()
pData->engine->osc_send_bridge_parameter_ranges(i, paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
pData->engine->osc_send_bridge_set_parameter_value(i, getParameterValue(i));
#else
pData->engine->osc_send_control_set_parameter_data(fId, i, paramData.type, paramData.hints, bufName, bufUnit, getParameterValue(i));
pData->engine->osc_send_control_set_parameter_ranges(fId, i, paramRanges.min, paramRanges.max, paramRanges.def, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
pData->engine->osc_send_control_set_parameter_midi_cc(fId, i, paramData.midiCC);
pData->engine->osc_send_control_set_parameter_midi_channel(fId, i, paramData.midiChannel);
pData->engine->oscSend_control_set_parameter_data(fId, i, paramData.type, paramData.hints, bufName, bufUnit, getParameterValue(i));
pData->engine->oscSend_control_set_parameter_ranges(fId, i, paramRanges.min, paramRanges.max, paramRanges.def, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
pData->engine->oscSend_control_set_parameter_midi_cc(fId, i, paramData.midiCC);
pData->engine->oscSend_control_set_parameter_midi_channel(fId, i, paramData.midiChannel);
#endif
}
}
@@ -1749,12 +1734,12 @@ void CarlaPlugin::registerToOscClient()

pData->engine->osc_send_bridge_set_program(pData->prog.current);
#else
pData->engine->osc_send_control_set_program_count(fId, pData->prog.count);
pData->engine->oscSend_control_set_program_count(fId, pData->prog.count);

for (uint32_t i=0; i < pData->prog.count; ++i)
pData->engine->osc_send_control_set_program_name(fId, i, pData->prog.names[i]);
pData->engine->oscSend_control_set_program_name(fId, i, pData->prog.names[i]);

pData->engine->osc_send_control_set_program(fId, pData->prog.current);
pData->engine->oscSend_control_set_program(fId, pData->prog.current);
#endif
}

@@ -1773,31 +1758,31 @@ void CarlaPlugin::registerToOscClient()

pData->engine->osc_send_bridge_set_midi_program(pData->midiprog.current);
#else
pData->engine->osc_send_control_set_midi_program_count(fId, pData->midiprog.count);
pData->engine->oscSend_control_set_midi_program_count(fId, pData->midiprog.count);

for (uint32_t i=0; i < pData->midiprog.count; ++i)
{
const MidiProgramData& mpData(pData->midiprog.data[i]);

pData->engine->osc_send_control_set_midi_program_data(fId, i, mpData.bank, mpData.program, mpData.name);
pData->engine->oscSend_control_set_midi_program_data(fId, i, mpData.bank, mpData.program, mpData.name);
}

pData->engine->osc_send_control_set_midi_program(fId, pData->midiprog.current);
pData->engine->oscSend_control_set_midi_program(fId, pData->midiprog.current);
#endif
}

#ifndef BUILD_BRIDGE
pData->engine->osc_send_control_add_plugin_end(fId);
pData->engine->oscSend_control_add_plugin_end(fId);

// Internal Parameters
{
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, pData->postProc.dryWet);
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, pData->postProc.volume);
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, pData->postProc.balanceLeft);
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, pData->postProc.balanceRight);
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, pData->postProc.panning);
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, pData->ctrlChannel);
pData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, pData->active ? 1.0f : 0.0f);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_DRYWET, pData->postProc.dryWet);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_VOLUME, pData->postProc.volume);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, pData->postProc.balanceLeft);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, pData->postProc.balanceRight);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_PANNING, pData->postProc.panning);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, pData->ctrlChannel);
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_ACTIVE, pData->active ? 1.0f : 0.0f);
}
#endif
}
@@ -1835,7 +1820,7 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url)
return;
#endif

osc_send_sample_rate(&pData->osc.data, pData->engine->getSampleRate());
osc_send_sample_rate(pData->osc.data, pData->engine->getSampleRate());

for (NonRtList<CustomData>::Itenerator it = pData->custom.begin(); it.valid(); it.next())
{
@@ -1846,37 +1831,37 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url)
CARLA_ASSERT(cData.value != nullptr);

if (std::strcmp(cData.type, CUSTOM_DATA_STRING) == 0)
osc_send_configure(&pData->osc.data, cData.key, cData.value);
osc_send_configure(pData->osc.data, cData.key, cData.value);
}

if (pData->prog.current >= 0)
osc_send_program(&pData->osc.data, pData->prog.current);
osc_send_program(pData->osc.data, pData->prog.current);

if (pData->midiprog.current >= 0)
{
const MidiProgramData& curMidiProg(pData->midiprog.getCurrent());

if (type() == PLUGIN_DSSI)
osc_send_program(&pData->osc.data, curMidiProg.bank, curMidiProg.program);
if (getType() == PLUGIN_DSSI)
osc_send_program(pData->osc.data, curMidiProg.bank, curMidiProg.program);
else
osc_send_midi_program(&pData->osc.data, curMidiProg.bank, curMidiProg.program);
osc_send_midi_program(pData->osc.data, curMidiProg.bank, curMidiProg.program);
}

for (uint32_t i=0; i < pData->param.count; ++i)
osc_send_control(&pData->osc.data, pData->param.data[i].rindex, getParameterValue(i));
osc_send_control(pData->osc.data, pData->param.data[i].rindex, getParameterValue(i));

carla_stdout("CarlaPlugin::updateOscData() - done");
}

void CarlaPlugin::freeOscData()
{
pData->osc.data.free();
}
// void CarlaPlugin::freeOscData()
// {
// pData->osc.data.free();
// }

bool CarlaPlugin::waitForOscGuiShow()
{
carla_stdout("CarlaPlugin::waitForOscGuiShow()");
uint i=0, oscUiTimeout = pData->engine->getOptions().oscUiTimeout;
uint i=0, oscUiTimeout = pData->engine->getOptions().uiBridgesTimeout;

// wait for UI 'update' call
for (; i < oscUiTimeout/100; ++i)
@@ -1884,7 +1869,7 @@ bool CarlaPlugin::waitForOscGuiShow()
if (pData->osc.data.target != nullptr)
{
carla_stdout("CarlaPlugin::waitForOscGuiShow() - got response, asking UI to show itself now");
osc_send_show(&pData->osc.data);
osc_send_show(pData->osc.data);
return true;
}
else
@@ -1926,9 +1911,9 @@ void CarlaPlugin::sendMidiSingleNote(const uint8_t channel, const uint8_t note,
if (sendOsc)
{
if (velo > 0)
pData->engine->osc_send_control_note_on(fId, channel, note, velo);
pData->engine->oscSend_control_note_on(fId, channel, note, velo);
else
pData->engine->osc_send_control_note_off(fId, channel, note);
pData->engine->oscSend_control_note_off(fId, channel, note);
}

if (sendCallback)
@@ -1986,7 +1971,7 @@ void CarlaPlugin::postRtEventsRun()
{
// Update OSC control client
if (pData->engine->isOscControlRegistered())
pData->engine->osc_send_control_set_parameter_value(fId, event.value1, event.value3);
pData->engine->oscSend_control_set_parameter_value(fId, event.value1, event.value3);

// Update Host
pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, event.value1, 0, event.value3, nullptr);
@@ -2002,7 +1987,7 @@ void CarlaPlugin::postRtEventsRun()
#ifndef BUILD_BRIDGE
// Update OSC control client
if (pData->engine->isOscControlRegistered())
pData->engine->osc_send_control_set_program(fId, event.value1);
pData->engine->oscSend_control_set_program(fId, event.value1);

// Update Host
pData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, event.value1, 0, 0.0f, nullptr);
@@ -2017,8 +2002,8 @@ void CarlaPlugin::postRtEventsRun()

if (sendOsc)
{
pData->engine->osc_send_control_set_parameter_value(fId, j, value);
pData->engine->osc_send_control_set_default_value(fId, j, pData->param.ranges[j].def);
pData->engine->oscSend_control_set_parameter_value(fId, j, value);
pData->engine->oscSend_control_set_default_value(fId, j, pData->param.ranges[j].def);
}

pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, j, 0, value, nullptr);
@@ -2036,7 +2021,7 @@ void CarlaPlugin::postRtEventsRun()
#ifndef BUILD_BRIDGE
// Update OSC control client
if (pData->engine->isOscControlRegistered())
pData->engine->osc_send_control_set_midi_program(fId, event.value1);
pData->engine->oscSend_control_set_midi_program(fId, event.value1);

// Update Host
pData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, event.value1, 0, 0.0f, nullptr);
@@ -2051,8 +2036,8 @@ void CarlaPlugin::postRtEventsRun()

if (sendOsc)
{
pData->engine->osc_send_control_set_parameter_value(fId, j, value);
pData->engine->osc_send_control_set_default_value(fId, j, pData->param.ranges[j].def);
pData->engine->oscSend_control_set_parameter_value(fId, j, value);
pData->engine->oscSend_control_set_default_value(fId, j, pData->param.ranges[j].def);
}

pData->engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, fId, j, 0, value, nullptr);
@@ -2069,7 +2054,7 @@ void CarlaPlugin::postRtEventsRun()
#ifndef BUILD_BRIDGE
// Update OSC control client
if (pData->engine->isOscControlRegistered())
pData->engine->osc_send_control_note_on(fId, event.value1, event.value2, int(event.value3));
pData->engine->oscSend_control_note_on(fId, event.value1, event.value2, int(event.value3));

// Update Host
pData->engine->callback(CALLBACK_NOTE_ON, fId, event.value1, event.value2, int(event.value3), nullptr);
@@ -2083,7 +2068,7 @@ void CarlaPlugin::postRtEventsRun()
#ifndef BUILD_BRIDGE
// Update OSC control client
if (pData->engine->isOscControlRegistered())
pData->engine->osc_send_control_note_off(fId, event.value1, event.value2);
pData->engine->oscSend_control_note_off(fId, event.value1, event.value2);

// Update Host
pData->engine->callback(CALLBACK_NOTE_OFF, fId, event.value1, event.value2, 0.0f, nullptr);
@@ -2098,7 +2083,7 @@ void CarlaPlugin::postRtEventsRun()

void CarlaPlugin::uiParameterChange(const uint32_t index, const float value)
{
CARLA_ASSERT(index < parameterCount());
CARLA_ASSERT(index < getParameterCount());
return;

// unused
@@ -2108,7 +2093,7 @@ void CarlaPlugin::uiParameterChange(const uint32_t index, const float value)

void CarlaPlugin::uiProgramChange(const uint32_t index)
{
CARLA_ASSERT(index < programCount());
CARLA_ASSERT(index < getProgramCount());
return;

// unused
@@ -2117,7 +2102,7 @@ void CarlaPlugin::uiProgramChange(const uint32_t index)

void CarlaPlugin::uiMidiProgramChange(const uint32_t index)
{
CARLA_ASSERT(index < midiProgramCount());
CARLA_ASSERT(index < getMidiProgramCount());
return;

// unused
@@ -2156,7 +2141,7 @@ CarlaPlugin::ScopedDisabler::ScopedDisabler(CarlaPlugin* const plugin)
{
carla_debug("CarlaPlugin::ScopedDisabler(%p)", plugin);
CARLA_ASSERT(plugin != nullptr);
CARLA_ASSERT(plugin->kData != nullptr);
CARLA_ASSERT(plugin->pData != nullptr);
CARLA_ASSERT(plugin->pData->client != nullptr);

if (plugin == nullptr)


+ 6
- 8
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -327,10 +327,10 @@ struct PluginParameterData {
count = 0;
}

float fixValue(const uint32_t parameterId, const float& value)
float getFixedValue(const uint32_t parameterId, const float& value) const
{
CARLA_ASSERT_INT2(parameterId < count, parameterId, count);
return ranges[parameterId].fixValue(value);
CARLA_SAFE_ASSERT_RETURN(parameterId < count, 0.0f);
return ranges[parameterId].getFixedValue(value);
}

CARLA_DECLARE_NON_COPY_STRUCT(PluginParameterData)
@@ -472,8 +472,6 @@ struct ExternalMidiNote {
: channel(-1),
note(0),
velo(0) {}

CARLA_DECLARE_NON_COPY_STRUCT(ExternalMidiNote)
};

// -----------------------------------------------------------------------
@@ -535,7 +533,7 @@ struct CarlaPluginProtectedData {
mutex.unlock();
}

CARLA_DECLARE_NON_COPY_STRUCT_WITH_LEAK_DETECTOR(ExternalNotes)
CARLA_DECLARE_NON_COPY_STRUCT(ExternalNotes)

} extNotes;

@@ -577,7 +575,7 @@ struct CarlaPluginProtectedData {
mutex.unlock();
}

CARLA_DECLARE_NON_COPY_STRUCT_WITH_LEAK_DETECTOR(PostRtEvents)
CARLA_DECLARE_NON_COPY_STRUCT(PostRtEvents)

} postRtEvents;

@@ -596,7 +594,7 @@ struct CarlaPluginProtectedData {
balanceRight(1.0f),
panning(0.0f) {}

CARLA_DECLARE_NON_COPY_STRUCT_WITH_LEAK_DETECTOR(PostProc)
CARLA_DECLARE_NON_COPY_STRUCT(PostProc)

} postProc;
#endif


+ 233
- 233
source/backend/plugin/DssiPlugin.cpp
File diff suppressed because it is too large
View File


+ 314
- 314
source/backend/plugin/FluidSynthPlugin.cpp
File diff suppressed because it is too large
View File


+ 181
- 181
source/backend/plugin/LadspaPlugin.cpp View File

@@ -47,16 +47,16 @@ public:
{
carla_debug("LadspaPlugin::~LadspaPlugin()");

kData->singleMutex.lock();
kData->masterMutex.lock();
pData->singleMutex.lock();
pData->masterMutex.lock();

if (kData->client != nullptr && kData->client->isActive())
kData->client->deactivate();
if (pData->client != nullptr && pData->client->isActive())
pData->client->deactivate();

if (kData->active)
if (pData->active)
{
deactivate();
kData->active = false;
pData->active = false;
}

if (fDescriptor != nullptr)
@@ -141,9 +141,9 @@ public:

uint32_t parameterScalePointCount(const uint32_t parameterId) const override
{
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

const int32_t rindex(kData->param.data[parameterId].rindex);
const int32_t rindex(pData->param.data[parameterId].rindex);

if (fRdfDescriptor != nullptr && rindex < static_cast<int32_t>(fRdfDescriptor->PortCount))
{
@@ -175,11 +175,11 @@ public:
if (! isDssiVst)
options |= PLUGIN_OPTION_FIXED_BUFFER;

if (kData->engine->getProccessMode() != PROCESS_MODE_CONTINUOUS_RACK)
if (pData->engine->getProccessMode() != PROCESS_MODE_CONTINUOUS_RACK)
{
if (fOptions & PLUGIN_OPTION_FORCE_STEREO)
options |= PLUGIN_OPTION_FORCE_STEREO;
else if (kData->audioIn.count <= 1 && kData->audioOut.count <= 1 && (kData->audioIn.count != 0 || kData->audioOut.count != 0))
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0))
options |= PLUGIN_OPTION_FORCE_STEREO;
}

@@ -189,7 +189,7 @@ public:
float getParameterValue(const uint32_t parameterId) override
{
CARLA_ASSERT(fParamBuffers != nullptr);
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

return fParamBuffers[parameterId];
}
@@ -197,10 +197,10 @@ public:
float getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId) override
{
CARLA_ASSERT(fRdfDescriptor != nullptr);
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);
CARLA_ASSERT(scalePointId < parameterScalePointCount(parameterId));

const int32_t rindex(kData->param.data[parameterId].rindex);
const int32_t rindex(pData->param.data[parameterId].rindex);

if (fRdfDescriptor != nullptr && rindex < static_cast<int32_t>(fRdfDescriptor->PortCount))
{
@@ -263,9 +263,9 @@ public:
void getParameterName(const uint32_t parameterId, char* const strBuf) override
{
CARLA_ASSERT(fDescriptor != nullptr);
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

const int32_t rindex(kData->param.data[parameterId].rindex);
const int32_t rindex(pData->param.data[parameterId].rindex);

if (rindex < static_cast<int32_t>(fDescriptor->PortCount))
std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX);
@@ -275,9 +275,9 @@ public:

void getParameterSymbol(const uint32_t parameterId, char* const strBuf) override
{
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

const int32_t rindex(kData->param.data[parameterId].rindex);
const int32_t rindex(pData->param.data[parameterId].rindex);

if (fRdfDescriptor != nullptr && rindex < static_cast<int32_t>(fRdfDescriptor->PortCount))
{
@@ -295,9 +295,9 @@ public:

void getParameterUnit(const uint32_t parameterId, char* const strBuf) override
{
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

const int32_t rindex(kData->param.data[parameterId].rindex);
const int32_t rindex(pData->param.data[parameterId].rindex);

if (fRdfDescriptor != nullptr && rindex < static_cast<int32_t>(fRdfDescriptor->PortCount))
{
@@ -335,10 +335,10 @@ public:
void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) override
{
CARLA_ASSERT(fRdfDescriptor != nullptr);
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);
CARLA_ASSERT(scalePointId < parameterScalePointCount(parameterId));

const int32_t rindex(kData->param.data[parameterId].rindex);
const int32_t rindex(pData->param.data[parameterId].rindex);

if (fRdfDescriptor != nullptr && rindex < static_cast<int32_t>(fRdfDescriptor->PortCount))
{
@@ -374,9 +374,9 @@ public:

void setParameterValue(const uint32_t parameterId, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) override
{
CARLA_ASSERT(parameterId < kData->param.count);
CARLA_ASSERT(parameterId < pData->param.count);

const float fixedValue(kData->param.fixValue(parameterId, value));
const float fixedValue(pData->param.fixValue(parameterId, value));
fParamBuffers[parameterId] = fixedValue;

CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback);
@@ -393,28 +393,28 @@ public:
void reload() override
{
carla_debug("LadspaPlugin::reload() - start");
CARLA_ASSERT(kData->engine != nullptr);
CARLA_ASSERT(pData->engine != nullptr);
CARLA_ASSERT(fDescriptor != nullptr);
CARLA_ASSERT(fHandle != nullptr);

if (kData->engine == nullptr)
if (pData->engine == nullptr)
return;
if (fDescriptor == nullptr)
return;
if (fHandle == nullptr)
return;

const ProcessMode processMode(kData->engine->getProccessMode());
const ProcessMode processMode(pData->engine->getProccessMode());

// Safely disable plugin for reload
const ScopedDisabler sd(this);

if (kData->active)
if (pData->active)
deactivate();

clearBuffers();

const float sampleRate(static_cast<float>(kData->engine->getSampleRate()));
const float sampleRate(static_cast<float>(pData->engine->getSampleRate()));
const uint32_t portCount(static_cast<uint32_t>(fDescriptor->PortCount));

uint32_t aIns, aOuts, params, j;
@@ -471,7 +471,7 @@ public:

if (aIns > 0)
{
kData->audioIn.createNew(aIns);
pData->audioIn.createNew(aIns);
fAudioInBuffers = new float*[aIns];

for (uint32_t i=0; i < aIns; ++i)
@@ -480,7 +480,7 @@ public:

if (aOuts > 0)
{
kData->audioOut.createNew(aOuts);
pData->audioOut.createNew(aOuts);
fAudioOutBuffers = new float*[aOuts];
needsCtrlIn = true;

@@ -490,13 +490,13 @@ public:

if (params > 0)
{
kData->param.createNew(params);
pData->param.createNew(params);

fParamBuffers = new float[params];
carla_zeroFloat(fParamBuffers, params);
}

const uint portNameSize(kData->engine->maxPortNameSize());
const uint portNameSize(pData->engine->maxPortNameSize());
CarlaString portName;

for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCtrl=0; i < portCount; ++i)
@@ -523,27 +523,27 @@ public:
if (LADSPA_IS_PORT_INPUT(portType))
{
j = iAudioIn++;
kData->audioIn.ports[j].port = (CarlaEngineAudioPort*)kData->client->addPort(kEnginePortTypeAudio, portName, true);
kData->audioIn.ports[j].rindex = i;
pData->audioIn.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, true);
pData->audioIn.ports[j].rindex = i;

if (forcedStereoIn)
{
portName += "_2";
kData->audioIn.ports[1].port = (CarlaEngineAudioPort*)kData->client->addPort(kEnginePortTypeAudio, portName, true);
kData->audioIn.ports[1].rindex = i;
pData->audioIn.ports[1].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, true);
pData->audioIn.ports[1].rindex = i;
}
}
else if (LADSPA_IS_PORT_OUTPUT(portType))
{
j = iAudioOut++;
kData->audioOut.ports[j].port = (CarlaEngineAudioPort*)kData->client->addPort(kEnginePortTypeAudio, portName, false);
kData->audioOut.ports[j].rindex = i;
pData->audioOut.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false);
pData->audioOut.ports[j].rindex = i;

if (forcedStereoOut)
{
portName += "_2";
kData->audioOut.ports[1].port = (CarlaEngineAudioPort*)kData->client->addPort(kEnginePortTypeAudio, portName, false);
kData->audioOut.ports[1].rindex = i;
pData->audioOut.ports[1].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false);
pData->audioOut.ports[1].rindex = i;
}
}
else
@@ -552,11 +552,11 @@ public:
else if (LADSPA_IS_PORT_CONTROL(portType))
{
j = iCtrl++;
kData->param.data[j].index = j;
kData->param.data[j].rindex = i;
kData->param.data[j].hints = 0x0;
kData->param.data[j].midiChannel = 0;
kData->param.data[j].midiCC = -1;
pData->param.data[j].index = j;
pData->param.data[j].rindex = i;
pData->param.data[j].hints = 0x0;
pData->param.data[j].midiChannel = 0;
pData->param.data[j].midiCC = -1;

float min, max, def, step, stepSmall, stepLarge;

@@ -599,7 +599,7 @@ public:
min *= sampleRate;
max *= sampleRate;
def *= sampleRate;
kData->param.data[j].hints |= PARAMETER_USES_SAMPLERATE;
pData->param.data[j].hints |= PARAMETER_USES_SAMPLERATE;
}

if (LADSPA_IS_HINT_TOGGLED(portRangeHints.HintDescriptor))
@@ -607,14 +607,14 @@ public:
step = max - min;
stepSmall = step;
stepLarge = step;
kData->param.data[j].hints |= PARAMETER_IS_BOOLEAN;
pData->param.data[j].hints |= PARAMETER_IS_BOOLEAN;
}
else if (LADSPA_IS_HINT_INTEGER(portRangeHints.HintDescriptor))
{
step = 1.0f;
stepSmall = 1.0f;
stepLarge = 10.0f;
kData->param.data[j].hints |= PARAMETER_IS_INTEGER;
pData->param.data[j].hints |= PARAMETER_IS_INTEGER;
}
else
{
@@ -626,9 +626,9 @@ public:

if (LADSPA_IS_PORT_INPUT(portType))
{
kData->param.data[j].type = PARAMETER_INPUT;
kData->param.data[j].hints |= PARAMETER_IS_ENABLED;
kData->param.data[j].hints |= PARAMETER_IS_AUTOMABLE;
pData->param.data[j].type = PARAMETER_INPUT;
pData->param.data[j].hints |= PARAMETER_IS_ENABLED;
pData->param.data[j].hints |= PARAMETER_IS_AUTOMABLE;
needsCtrlIn = true;
}
else if (LADSPA_IS_PORT_OUTPUT(portType))
@@ -642,8 +642,8 @@ public:
stepSmall = 1.0f;
stepLarge = 1.0f;

kData->param.data[j].type = PARAMETER_LATENCY;
kData->param.data[j].hints = 0;
pData->param.data[j].type = PARAMETER_LATENCY;
pData->param.data[j].hints = 0;
}
else if (std::strcmp(fDescriptor->PortNames[i], "_sample-rate") == 0)
{
@@ -652,37 +652,37 @@ public:
stepSmall = 1.0f;
stepLarge = 1.0f;

kData->param.data[j].type = PARAMETER_SAMPLE_RATE;
kData->param.data[j].hints = 0;
pData->param.data[j].type = PARAMETER_SAMPLE_RATE;
pData->param.data[j].hints = 0;
}
else
{
kData->param.data[j].type = PARAMETER_OUTPUT;
kData->param.data[j].hints |= PARAMETER_IS_ENABLED;
kData->param.data[j].hints |= PARAMETER_IS_AUTOMABLE;
pData->param.data[j].type = PARAMETER_OUTPUT;
pData->param.data[j].hints |= PARAMETER_IS_ENABLED;
pData->param.data[j].hints |= PARAMETER_IS_AUTOMABLE;
needsCtrlOut = true;
}
}
else
{
kData->param.data[j].type = PARAMETER_UNKNOWN;
pData->param.data[j].type = PARAMETER_UNKNOWN;
carla_stderr2("WARNING - Got a broken Port (Control, but not input or output)");
}

// extra parameter hints
if (LADSPA_IS_HINT_LOGARITHMIC(portRangeHints.HintDescriptor))
kData->param.data[j].hints |= PARAMETER_IS_LOGARITHMIC;
pData->param.data[j].hints |= PARAMETER_IS_LOGARITHMIC;

// check for scalepoints, require at least 2 to make it useful
if (hasPortRDF && fRdfDescriptor->Ports[i].ScalePointCount > 1)
kData->param.data[j].hints |= PARAMETER_USES_SCALEPOINTS;
pData->param.data[j].hints |= PARAMETER_USES_SCALEPOINTS;

kData->param.ranges[j].min = min;
kData->param.ranges[j].max = max;
kData->param.ranges[j].def = def;
kData->param.ranges[j].step = step;
kData->param.ranges[j].stepSmall = stepSmall;
kData->param.ranges[j].stepLarge = stepLarge;
pData->param.ranges[j].min = min;
pData->param.ranges[j].max = max;
pData->param.ranges[j].def = def;
pData->param.ranges[j].step = step;
pData->param.ranges[j].stepSmall = stepSmall;
pData->param.ranges[j].stepLarge = stepLarge;

// Start parameters in their default values
fParamBuffers[j] = def;
@@ -717,7 +717,7 @@ public:
portName += "events-in";
portName.truncate(portNameSize);

kData->event.portIn = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, true);
pData->event.portIn = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, true);
}

if (needsCtrlOut)
@@ -733,7 +733,7 @@ public:
portName += "events-out";
portName.truncate(portNameSize);

kData->event.portOut = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, false);
pData->event.portOut = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, false);
}

if (forcedStereoIn || forcedStereoOut)
@@ -757,17 +757,17 @@ public:
fHints |= PLUGIN_CAN_BALANCE;

// extra plugin hints
kData->extraHints = 0x0;
pData->extraHints = 0x0;

if (aIns <= 2 && aOuts <= 2 && (aIns == aOuts || aIns == 0 || aOuts == 0))
kData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK;
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK;

// check latency
if (fHints & PLUGIN_CAN_DRYWET)
{
for (uint32_t i=0; i < kData->param.count; ++i)
for (uint32_t i=0; i < pData->param.count; ++i)
{
if (kData->param.data[i].type != PARAMETER_LATENCY)
if (pData->param.data[i].type != PARAMETER_LATENCY)
continue;

// we need to pre-run the plugin so it can update its latency control-port
@@ -780,7 +780,7 @@ public:
tmpIn[j][0] = 0.0f;
tmpIn[j][1] = 0.0f;

fDescriptor->connect_port(fHandle, kData->audioIn.ports[j].rindex, tmpIn[j]);
fDescriptor->connect_port(fHandle, pData->audioIn.ports[j].rindex, tmpIn[j]);
}

for (j=0; j < aOuts; ++j)
@@ -788,7 +788,7 @@ public:
tmpOut[j][0] = 0.0f;
tmpOut[j][1] = 0.0f;

fDescriptor->connect_port(fHandle, kData->audioOut.ports[j].rindex, tmpOut[j]);
fDescriptor->connect_port(fHandle, pData->audioOut.ports[j].rindex, tmpOut[j]);
}

if (fDescriptor->activate != nullptr)
@@ -801,20 +801,20 @@ public:

const uint32_t latency = (uint32_t)fParamBuffers[i];

if (kData->latency != latency)
if (pData->latency != latency)
{
kData->latency = latency;
kData->client->setLatency(latency);
kData->recreateLatencyBuffers();
pData->latency = latency;
pData->client->setLatency(latency);
pData->recreateLatencyBuffers();
}

break;
}
}

bufferSizeChanged(kData->engine->getBufferSize());
bufferSizeChanged(pData->engine->getBufferSize());

if (kData->active)
if (pData->active)
activate();

carla_debug("LadspaPlugin::reload() - end");
@@ -858,10 +858,10 @@ public:
// --------------------------------------------------------------------------------------------------------
// Check if active

if (! kData->active)
if (! pData->active)
{
// disable any output sound
for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
carla_zeroFloat(outBuffer[i], frames);

return;
@@ -870,33 +870,33 @@ public:
// --------------------------------------------------------------------------------------------------------
// Check if needs reset

if (kData->needsReset)
if (pData->needsReset)
{
if (kData->latency > 0)
if (pData->latency > 0)
{
for (i=0; i < kData->audioIn.count; ++i)
carla_zeroFloat(kData->latencyBuffers[i], kData->latency);
for (i=0; i < pData->audioIn.count; ++i)
carla_zeroFloat(pData->latencyBuffers[i], pData->latency);
}

kData->needsReset = false;
pData->needsReset = false;
}

// --------------------------------------------------------------------------------------------------------
// Event Input and Processing

if (kData->event.portIn != nullptr)
if (pData->event.portIn != nullptr)
{
// ----------------------------------------------------------------------------------------------------
// Event Input (System)

bool sampleAccurate = (fOptions & PLUGIN_OPTION_FIXED_BUFFER) == 0;

uint32_t time, nEvents = kData->event.portIn->getEventCount();
uint32_t time, nEvents = pData->event.portIn->getEventCount();
uint32_t timeOffset = 0;

for (i=0; i < nEvents; ++i)
{
const EngineEvent& event(kData->event.portIn->getEvent(i));
const EngineEvent& event(pData->event.portIn->getEvent(i));

time = event.time;

@@ -930,7 +930,7 @@ public:
{
#ifndef BUILD_BRIDGE
// Control backend stuff
if (event.channel == kData->ctrlChannel)
if (event.channel == pData->ctrlChannel)
{
float value;

@@ -978,28 +978,28 @@ public:
#endif

// Control plugin parameters
for (k=0; k < kData->param.count; ++k)
for (k=0; k < pData->param.count; ++k)
{
if (kData->param.data[k].midiChannel != event.channel)
if (pData->param.data[k].midiChannel != event.channel)
continue;
if (kData->param.data[k].midiCC != ctrlEvent.param)
if (pData->param.data[k].midiCC != ctrlEvent.param)
continue;
if (kData->param.data[k].type != PARAMETER_INPUT)
if (pData->param.data[k].type != PARAMETER_INPUT)
continue;
if ((kData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0)
if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0)
continue;

float value;

if (kData->param.data[k].hints & PARAMETER_IS_BOOLEAN)
if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN)
{
value = (ctrlEvent.value < 0.5f) ? kData->param.ranges[k].min : kData->param.ranges[k].max;
value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max;
}
else
{
value = kData->param.ranges[k].unnormalizeValue(ctrlEvent.value);
value = pData->param.ranges[k].unnormalizeValue(ctrlEvent.value);

if (kData->param.data[k].hints & PARAMETER_IS_INTEGER)
if (pData->param.data[k].hints & PARAMETER_IS_INTEGER)
value = std::rint(value);
}

@@ -1026,7 +1026,7 @@ public:
}
}

kData->postRtEvents.trySplice();
pData->postRtEvents.trySplice();

if (frames > timeOffset)
processSingle(inBuffer, outBuffer, frames - timeOffset, timeOffset);
@@ -1047,25 +1047,25 @@ public:
// --------------------------------------------------------------------------------------------------------
// Control Output

if (kData->event.portOut != nullptr)
if (pData->event.portOut != nullptr)
{
uint8_t channel;
uint16_t param;
float value;

for (k=0; k < kData->param.count; ++k)
for (k=0; k < pData->param.count; ++k)
{
if (kData->param.data[k].type != PARAMETER_OUTPUT)
if (pData->param.data[k].type != PARAMETER_OUTPUT)
continue;

kData->param.ranges[k].fixValue(fParamBuffers[k]);
pData->param.ranges[k].fixValue(fParamBuffers[k]);

if (kData->param.data[k].midiCC > 0)
if (pData->param.data[k].midiCC > 0)
{
channel = kData->param.data[k].midiChannel;
param = static_cast<uint16_t>(kData->param.data[k].midiCC);
value = kData->param.ranges[k].normalizeValue(fParamBuffers[k]);
kData->event.portOut->writeControlEvent(0, channel, kEngineControlEventTypeParameter, param, value);
channel = pData->param.data[k].midiChannel;
param = static_cast<uint16_t>(pData->param.data[k].midiCC);
value = pData->param.ranges[k].normalizeValue(fParamBuffers[k]);
pData->event.portOut->writeControlEvent(0, channel, kEngineControlEventTypeParameter, param, value);
}
}

@@ -1079,13 +1079,13 @@ public:
if (frames == 0)
return false;

if (kData->audioIn.count > 0)
if (pData->audioIn.count > 0)
{
CARLA_ASSERT(inBuffer != nullptr);
if (inBuffer == nullptr)
return false;
}
if (kData->audioOut.count > 0)
if (pData->audioOut.count > 0)
{
CARLA_ASSERT(outBuffer != nullptr);
if (outBuffer == nullptr)
@@ -1097,13 +1097,13 @@ public:
// --------------------------------------------------------------------------------------------------------
// Try lock, silence otherwise

if (kData->engine->isOffline())
if (pData->engine->isOffline())
{
kData->singleMutex.lock();
pData->singleMutex.lock();
}
else if (! kData->singleMutex.tryLock())
else if (! pData->singleMutex.tryLock())
{
for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
{
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] = 0.0f;
@@ -1115,9 +1115,9 @@ public:
// --------------------------------------------------------------------------------------------------------
// Reset audio buffers

for (i=0; i < kData->audioIn.count; ++i)
for (i=0; i < pData->audioIn.count; ++i)
carla_copyFloat(fAudioInBuffers[i], inBuffer[i]+timeOffset, frames);
for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
carla_zeroFloat(fAudioOutBuffers[i], frames);

// --------------------------------------------------------------------------------------------------------
@@ -1133,13 +1133,13 @@ public:
// Post-processing (dry/wet, volume and balance)

{
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && kData->postProc.dryWet != 1.0f;
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (kData->postProc.balanceLeft != -1.0f || kData->postProc.balanceRight != 1.0f);
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f;
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f);

bool isPair;
float bufValue, oldBufLeft[doBalance ? frames : 1];

for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
{
// Dry/Wet
if (doDryWet)
@@ -1147,13 +1147,13 @@ public:
for (k=0; k < frames; ++k)
{
// TODO
//if (k < kData->latency && kData->latency < frames)
// bufValue = (kData->audioIn.count == 1) ? kData->latencyBuffers[0][k] : kData->latencyBuffers[i][k];
//if (k < pData->latency && pData->latency < frames)
// bufValue = (pData->audioIn.count == 1) ? pData->latencyBuffers[0][k] : pData->latencyBuffers[i][k];
//else
// bufValue = (kData->audioIn.count == 1) ? inBuffer[0][k-m_latency] : inBuffer[i][k-m_latency];
// bufValue = (pData->audioIn.count == 1) ? inBuffer[0][k-m_latency] : inBuffer[i][k-m_latency];

bufValue = fAudioInBuffers[(kData->audioIn.count == 1) ? 0 : i][k];
fAudioOutBuffers[i][k] = (fAudioOutBuffers[i][k] * kData->postProc.dryWet) + (bufValue * (1.0f - kData->postProc.dryWet));
bufValue = fAudioInBuffers[(pData->audioIn.count == 1) ? 0 : i][k];
fAudioOutBuffers[i][k] = (fAudioOutBuffers[i][k] * pData->postProc.dryWet) + (bufValue * (1.0f - pData->postProc.dryWet));
}
}

@@ -1164,12 +1164,12 @@ public:

if (isPair)
{
CARLA_ASSERT(i+1 < kData->audioOut.count);
CARLA_ASSERT(i+1 < pData->audioOut.count);
carla_copyFloat(oldBufLeft, fAudioOutBuffers[i], frames);
}

float balRangeL = (kData->postProc.balanceLeft + 1.0f)/2.0f;
float balRangeR = (kData->postProc.balanceRight + 1.0f)/2.0f;
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f;
float balRangeR = (pData->postProc.balanceRight + 1.0f)/2.0f;

for (k=0; k < frames; ++k)
{
@@ -1191,21 +1191,21 @@ public:
// Volume (and buffer copy)
{
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] = fAudioOutBuffers[i][k] * kData->postProc.volume;
outBuffer[i][k+timeOffset] = fAudioOutBuffers[i][k] * pData->postProc.volume;
}
}

#if 0
// Latency, save values for next callback, TODO
if (kData->latency > 0 && kData->latency < frames)
if (pData->latency > 0 && pData->latency < frames)
{
for (i=0; i < kData->audioIn.count; ++i)
carla_copyFloat(kData->latencyBuffers[i], inBuffer[i] + (frames - kData->latency), kData->latency);
for (i=0; i < pData->audioIn.count; ++i)
carla_copyFloat(pData->latencyBuffers[i], inBuffer[i] + (frames - pData->latency), pData->latency);
}
#endif
} // End of Post-processing
#else
for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
{
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] = fAudioOutBuffers[i][k];
@@ -1214,7 +1214,7 @@ public:

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

kData->singleMutex.unlock();
pData->singleMutex.unlock();
return true;
}

@@ -1223,14 +1223,14 @@ public:
CARLA_ASSERT_INT(newBufferSize > 0, newBufferSize);
carla_debug("LadspaPlugin::bufferSizeChanged(%i) - start", newBufferSize);

for (uint32_t i=0; i < kData->audioIn.count; ++i)
for (uint32_t i=0; i < pData->audioIn.count; ++i)
{
if (fAudioInBuffers[i] != nullptr)
delete[] fAudioInBuffers[i];
fAudioInBuffers[i] = new float[newBufferSize];
}

for (uint32_t i=0; i < kData->audioOut.count; ++i)
for (uint32_t i=0; i < pData->audioOut.count; ++i)
{
if (fAudioOutBuffers[i] != nullptr)
delete[] fAudioOutBuffers[i];
@@ -1239,38 +1239,38 @@ public:

if (fHandle2 == nullptr)
{
for (uint32_t i=0; i < kData->audioIn.count; ++i)
for (uint32_t i=0; i < pData->audioIn.count; ++i)
{
CARLA_ASSERT(fAudioInBuffers[i] != nullptr);
fDescriptor->connect_port(fHandle, kData->audioIn.ports[i].rindex, fAudioInBuffers[i]);
fDescriptor->connect_port(fHandle, pData->audioIn.ports[i].rindex, fAudioInBuffers[i]);
}

for (uint32_t i=0; i < kData->audioOut.count; ++i)
for (uint32_t i=0; i < pData->audioOut.count; ++i)
{
CARLA_ASSERT(fAudioOutBuffers[i] != nullptr);
fDescriptor->connect_port(fHandle, kData->audioOut.ports[i].rindex, fAudioOutBuffers[i]);
fDescriptor->connect_port(fHandle, pData->audioOut.ports[i].rindex, fAudioOutBuffers[i]);
}
}
else
{
if (kData->audioIn.count > 0)
if (pData->audioIn.count > 0)
{
CARLA_ASSERT(kData->audioIn.count == 2);
CARLA_ASSERT(pData->audioIn.count == 2);
CARLA_ASSERT(fAudioInBuffers[0] != nullptr);
CARLA_ASSERT(fAudioInBuffers[1] != nullptr);

fDescriptor->connect_port(fHandle, kData->audioIn.ports[0].rindex, fAudioInBuffers[0]);
fDescriptor->connect_port(fHandle2, kData->audioIn.ports[1].rindex, fAudioInBuffers[1]);
fDescriptor->connect_port(fHandle, pData->audioIn.ports[0].rindex, fAudioInBuffers[0]);
fDescriptor->connect_port(fHandle2, pData->audioIn.ports[1].rindex, fAudioInBuffers[1]);
}

if (kData->audioOut.count > 0)
if (pData->audioOut.count > 0)
{
CARLA_ASSERT(kData->audioOut.count == 2);
CARLA_ASSERT(pData->audioOut.count == 2);
CARLA_ASSERT(fAudioOutBuffers[0] != nullptr);
CARLA_ASSERT(fAudioOutBuffers[1] != nullptr);

fDescriptor->connect_port(fHandle, kData->audioOut.ports[0].rindex, fAudioOutBuffers[0]);
fDescriptor->connect_port(fHandle2, kData->audioOut.ports[1].rindex, fAudioOutBuffers[1]);
fDescriptor->connect_port(fHandle, pData->audioOut.ports[0].rindex, fAudioOutBuffers[0]);
fDescriptor->connect_port(fHandle2, pData->audioOut.ports[1].rindex, fAudioOutBuffers[1]);
}
}

@@ -1297,7 +1297,7 @@ public:

if (fAudioInBuffers != nullptr)
{
for (uint32_t i=0; i < kData->audioIn.count; ++i)
for (uint32_t i=0; i < pData->audioIn.count; ++i)
{
if (fAudioInBuffers[i] != nullptr)
{
@@ -1312,7 +1312,7 @@ public:

if (fAudioOutBuffers != nullptr)
{
for (uint32_t i=0; i < kData->audioOut.count; ++i)
for (uint32_t i=0; i < pData->audioOut.count; ++i)
{
if (fAudioOutBuffers[i] != nullptr)
{
@@ -1345,54 +1345,54 @@ public:

bool init(const char* const filename, const char* const name, const char* const label, const LADSPA_RDF_Descriptor* const rdfDescriptor)
{
CARLA_ASSERT(kData->engine != nullptr);
CARLA_ASSERT(kData->client == nullptr);
CARLA_ASSERT(pData->engine != nullptr);
CARLA_ASSERT(pData->client == nullptr);
CARLA_ASSERT(filename != nullptr);
CARLA_ASSERT(label != nullptr);

// ---------------------------------------------------------------
// first checks

if (kData->engine == nullptr)
if (pData->engine == nullptr)
{
return false;
}

if (kData->client != nullptr)
if (pData->client != nullptr)
{
kData->engine->setLastError("Plugin client is already registered");
pData->engine->setLastError("Plugin client is already registered");
return false;
}

if (filename == nullptr)
{
kData->engine->setLastError("null filename");
pData->engine->setLastError("null filename");
return false;
}

if (label == nullptr)
{
kData->engine->setLastError("null label");
pData->engine->setLastError("null label");
return false;
}

// ---------------------------------------------------------------
// open DLL

if (! kData->libOpen(filename))
if (! pData->libOpen(filename))
{
kData->engine->setLastError(kData->libError(filename));
pData->engine->setLastError(pData->libError(filename));
return false;
}

// ---------------------------------------------------------------
// get DLL main entry

const LADSPA_Descriptor_Function descFn = (LADSPA_Descriptor_Function)kData->libSymbol("ladspa_descriptor");
const LADSPA_Descriptor_Function descFn = (LADSPA_Descriptor_Function)pData->libSymbol("ladspa_descriptor");

if (descFn == nullptr)
{
kData->engine->setLastError("Could not find the LASDPA Descriptor in the plugin library");
pData->engine->setLastError("Could not find the LASDPA Descriptor in the plugin library");
return false;
}

@@ -1408,7 +1408,7 @@ public:

if (fDescriptor == nullptr)
{
kData->engine->setLastError("Could not find the requested plugin label in the plugin library");
pData->engine->setLastError("Could not find the requested plugin label in the plugin library");
return false;
}

@@ -1419,35 +1419,35 @@ public:
fRdfDescriptor = ladspa_rdf_dup(rdfDescriptor);

if (name != nullptr)
fName = kData->engine->getUniquePluginName(name);
fName = pData->engine->getUniquePluginName(name);
else if (fRdfDescriptor != nullptr && fRdfDescriptor->Title != nullptr)
fName = kData->engine->getUniquePluginName(fRdfDescriptor->Title);
fName = pData->engine->getUniquePluginName(fRdfDescriptor->Title);
else if (fDescriptor->Name != nullptr)
fName = kData->engine->getUniquePluginName(fDescriptor->Name);
fName = pData->engine->getUniquePluginName(fDescriptor->Name);
else
fName = kData->engine->getUniquePluginName(fDescriptor->Label);
fName = pData->engine->getUniquePluginName(fDescriptor->Label);

fFilename = filename;

// ---------------------------------------------------------------
// register client

kData->client = kData->engine->addClient(this);
pData->client = pData->engine->addClient(this);

if (kData->client == nullptr || ! kData->client->isOk())
if (pData->client == nullptr || ! pData->client->isOk())
{
kData->engine->setLastError("Failed to register plugin client");
pData->engine->setLastError("Failed to register plugin client");
return false;
}

// ---------------------------------------------------------------
// initialize plugin

fHandle = fDescriptor->instantiate(fDescriptor, (unsigned long)kData->engine->getSampleRate());
fHandle = fDescriptor->instantiate(fDescriptor, (unsigned long)pData->engine->getSampleRate());

if (fHandle == nullptr)
{
kData->engine->setLastError("Plugin failed to initialize");
pData->engine->setLastError("Plugin failed to initialize");
return false;
}

@@ -1467,17 +1467,17 @@ public:
if (isDssiVst)
fOptions |= PLUGIN_OPTION_FIXED_BUFFER;

if (kData->engine->getOptions().forceStereo)
if (pData->engine->getOptions().forceStereo)
fOptions |= PLUGIN_OPTION_FORCE_STEREO;

// load settings
kData->idStr = "LADSPA/";
kData->idStr += std::strrchr(filename, OS_SEP)+1;
kData->idStr += "/";
kData->idStr += CarlaString(uniqueId());
kData->idStr += "/";
kData->idStr += label;
fOptions = kData->loadSettings(fOptions, availableOptions());
pData->idStr = "LADSPA/";
pData->idStr += std::strrchr(filename, OS_SEP)+1;
pData->idStr += "/";
pData->idStr += CarlaString(uniqueId());
pData->idStr += "/";
pData->idStr += label;
fOptions = pData->loadSettings(fOptions, availableOptions());

// ignore settings, we need this anyway
if (isDssiVst)


+ 103
- 103
source/backend/plugin/LinuxSamplerPlugin.cpp View File

@@ -182,16 +182,16 @@ public:
{
carla_debug("LinuxSamplerPlugin::~LinuxSamplerPlugin()");

kData->singleMutex.lock();
kData->masterMutex.lock();
pData->singleMutex.lock();
pData->masterMutex.lock();

if (kData->client != nullptr && kData->client->isActive())
kData->client->deactivate();
if (pData->client != nullptr && pData->client->isActive())
pData->client->deactivate();

if (kData->active)
if (pData->active)
{
deactivate();
kData->active = false;
pData->active = false;
}

if (fEngine != nullptr)
@@ -291,25 +291,25 @@ public:

void setMidiProgram(int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback) override
{
CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(kData->midiprog.count));
CARLA_ASSERT(index >= -1 && index < static_cast<int32_t>(pData->midiprog.count));

if (index < -1)
index = -1;
else if (index > static_cast<int32_t>(kData->midiprog.count))
else if (index > static_cast<int32_t>(pData->midiprog.count))
return;

if (kData->ctrlChannel < 0 || kData->ctrlChannel >= 16)
if (pData->ctrlChannel < 0 || pData->ctrlChannel >= 16)
return;

if (index >= 0)
{
const uint32_t bank = kData->midiprog.data[index].bank;
const uint32_t program = kData->midiprog.data[index].program;
const uint32_t bank = pData->midiprog.data[index].bank;
const uint32_t program = pData->midiprog.data[index].program;
const uint32_t rIndex = bank*128 + program;

const ScopedSingleProcessLocker spl(this, (sendGui || sendOsc || sendCallback));

if (kData->engine->isOffline())
if (pData->engine->isOffline())
{
fEngineChannel->PrepareLoadInstrument((const char*)fFilename, rIndex);
fEngineChannel->LoadInstrument();
@@ -329,20 +329,20 @@ public:
void reload() override
{
carla_debug("LinuxSamplerPlugin::reload() - start");
CARLA_ASSERT(kData->engine != nullptr);
CARLA_ASSERT(pData->engine != nullptr);
CARLA_ASSERT(fInstrument != nullptr);

if (kData->engine == nullptr)
if (pData->engine == nullptr)
return;
if (fInstrument == nullptr)
return;

const ProcessMode processMode(kData->engine->getProccessMode());
const ProcessMode processMode(pData->engine->getProccessMode());

// Safely disable plugin for reload
const ScopedDisabler sd(this);

if (kData->active)
if (pData->active)
deactivate();

clearBuffers();
@@ -350,9 +350,9 @@ public:
uint32_t aOuts;
aOuts = 2;

kData->audioOut.createNew(aOuts);
pData->audioOut.createNew(aOuts);

const int portNameSize = kData->engine->maxPortNameSize();
const int portNameSize = pData->engine->maxPortNameSize();
CarlaString portName;

// ---------------------------------------
@@ -371,8 +371,8 @@ public:
portName += "out-left";
portName.truncate(portNameSize);

kData->audioOut.ports[0].port = (CarlaEngineAudioPort*)kData->client->addPort(kEnginePortTypeAudio, portName, false);
kData->audioOut.ports[0].rindex = 0;
pData->audioOut.ports[0].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false);
pData->audioOut.ports[0].rindex = 0;

// out-right
portName.clear();
@@ -386,8 +386,8 @@ public:
portName += "out-right";
portName.truncate(portNameSize);

kData->audioOut.ports[1].port = (CarlaEngineAudioPort*)kData->client->addPort(kEnginePortTypeAudio, portName, false);
kData->audioOut.ports[1].rindex = 1;
pData->audioOut.ports[1].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false);
pData->audioOut.ports[1].rindex = 1;
}

// ---------------------------------------
@@ -405,7 +405,7 @@ public:
portName += "event-in";
portName.truncate(portNameSize);

kData->event.portIn = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, true);
pData->event.portIn = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, true);
}

// ---------------------------------------
@@ -417,14 +417,14 @@ public:
fHints |= PLUGIN_CAN_BALANCE;

// extra plugin hints
kData->extraHints = 0x0;
kData->extraHints |= PLUGIN_HINT_HAS_MIDI_IN;
kData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK;
pData->extraHints = 0x0;
pData->extraHints |= PLUGIN_HINT_HAS_MIDI_IN;
pData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK;

bufferSizeChanged(kData->engine->getBufferSize());
bufferSizeChanged(pData->engine->getBufferSize());
reloadPrograms(true);

if (kData->active)
if (pData->active)
activate();

carla_debug("LinuxSamplerPlugin::reload() - end");
@@ -435,7 +435,7 @@ public:
carla_debug("LinuxSamplerPlugin::reloadPrograms(%s)", bool2str(init));

// Delete old programs
kData->midiprog.clear();
pData->midiprog.clear();

// Query new programs
uint32_t i, count = fInstrumentIds.size();
@@ -446,14 +446,14 @@ public:
if (count == 0)
return;

kData->midiprog.createNew(count);
pData->midiprog.createNew(count);

LinuxSampler::InstrumentManager::instrument_info_t info;

for (i=0; i < kData->midiprog.count; ++i)
for (i=0; i < pData->midiprog.count; ++i)
{
kData->midiprog.data[i].bank = i / 128;
kData->midiprog.data[i].program = i % 128;
pData->midiprog.data[i].bank = i / 128;
pData->midiprog.data[i].program = i % 128;

try {
info = fInstrument->GetInstrumentInfo(fInstrumentIds[i]);
@@ -463,17 +463,17 @@ public:
continue;
}

kData->midiprog.data[i].name = carla_strdup(info.InstrumentName.c_str());
pData->midiprog.data[i].name = carla_strdup(info.InstrumentName.c_str());
}

#ifndef BUILD_BRIDGE
// Update OSC Names
if (kData->engine->isOscControlRegistered())
if (pData->engine->isOscControlRegistered())
{
kData->engine->osc_send_control_set_midi_program_count(fId, count);
pData->engine->osc_send_control_set_midi_program_count(fId, count);

for (i=0; i < count; ++i)
kData->engine->osc_send_control_set_midi_program_data(fId, i, kData->midiprog.data[i].bank, kData->midiprog.data[i].program, kData->midiprog.data[i].name);
pData->engine->osc_send_control_set_midi_program_data(fId, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name);
}
#endif

@@ -483,7 +483,7 @@ public:
}
else
{
kData->engine->callback(CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0f, nullptr);
pData->engine->callback(CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0f, nullptr);
}
}

@@ -511,10 +511,10 @@ public:
// --------------------------------------------------------------------------------------------------------
// Check if active

if (! kData->active)
if (! pData->active)
{
// disable any output sound
for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
carla_zeroFloat(outBuffer[i], frames);

return;
@@ -523,7 +523,7 @@ public:
// --------------------------------------------------------------------------------------------------------
// Check if needs reset

if (kData->needsReset)
if (pData->needsReset)
{
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF)
{
@@ -533,13 +533,13 @@ public:
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, k);
}
}
else if (kData->ctrlChannel >= 0 && kData->ctrlChannel < MAX_MIDI_CHANNELS)
else if (pData->ctrlChannel >= 0 && pData->ctrlChannel < MAX_MIDI_CHANNELS)
{
for (k=0; k < MAX_MIDI_NOTE; ++k)
fMidiInputPort->DispatchNoteOff(k, 0, kData->ctrlChannel);
fMidiInputPort->DispatchNoteOff(k, 0, pData->ctrlChannel);
}

kData->needsReset = false;
pData->needsReset = false;
}

// --------------------------------------------------------------------------------------------------------
@@ -549,11 +549,11 @@ public:
// ----------------------------------------------------------------------------------------------------
// MIDI Input (External)

if (kData->extNotes.mutex.tryLock())
if (pData->extNotes.mutex.tryLock())
{
while (! kData->extNotes.data.isEmpty())
while (! pData->extNotes.data.isEmpty())
{
const ExternalMidiNote& note(kData->extNotes.data.getFirst(true));
const ExternalMidiNote& note(pData->extNotes.data.getFirst(true));

CARLA_ASSERT(note.channel >= 0 && note.channel < MAX_MIDI_CHANNELS);

@@ -563,7 +563,7 @@ public:
fMidiInputPort->DispatchNoteOff(note.note, note.velo, note.channel, 0);
}

kData->extNotes.mutex.unlock();
pData->extNotes.mutex.unlock();

} // End of MIDI Input (External)

@@ -573,17 +573,17 @@ public:
bool allNotesOffSent = false;
bool sampleAccurate = (fOptions & PLUGIN_OPTION_FIXED_BUFFER) == 0;

uint32_t time, nEvents = kData->event.portIn->getEventCount();
uint32_t time, nEvents = pData->event.portIn->getEventCount();
uint32_t startTime = 0;
uint32_t timeOffset = 0;
uint32_t nextBankId = 0;

if (kData->midiprog.current >= 0 && kData->midiprog.count > 0)
nextBankId = kData->midiprog.data[kData->midiprog.current].bank;
if (pData->midiprog.current >= 0 && pData->midiprog.count > 0)
nextBankId = pData->midiprog.data[pData->midiprog.current].bank;

for (i=0; i < nEvents; ++i)
{
const EngineEvent& event(kData->event.portIn->getEvent(i));
const EngineEvent& event(pData->event.portIn->getEvent(i));

time = event.time;

@@ -599,8 +599,8 @@ public:
startTime = 0;
timeOffset = time;

if (kData->midiprog.current >= 0 && kData->midiprog.count > 0)
nextBankId = kData->midiprog.data[kData->midiprog.current].bank;
if (pData->midiprog.current >= 0 && pData->midiprog.count > 0)
nextBankId = pData->midiprog.data[pData->midiprog.current].bank;
else
nextBankId = 0;
}
@@ -627,7 +627,7 @@ public:
{
#ifndef BUILD_BRIDGE
// Control backend stuff
if (event.channel == kData->ctrlChannel)
if (event.channel == pData->ctrlChannel)
{
float value;

@@ -675,28 +675,28 @@ public:
#endif

// Control plugin parameters
for (k=0; k < kData->param.count; ++k)
for (k=0; k < pData->param.count; ++k)
{
if (kData->param.data[k].midiChannel != event.channel)
if (pData->param.data[k].midiChannel != event.channel)
continue;
if (kData->param.data[k].midiCC != ctrlEvent.param)
if (pData->param.data[k].midiCC != ctrlEvent.param)
continue;
if (kData->param.data[k].type != PARAMETER_INPUT)
if (pData->param.data[k].type != PARAMETER_INPUT)
continue;
if ((kData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0)
if ((pData->param.data[k].hints & PARAMETER_IS_AUTOMABLE) == 0)
continue;

double value;

if (kData->param.data[k].hints & PARAMETER_IS_BOOLEAN)
if (pData->param.data[k].hints & PARAMETER_IS_BOOLEAN)
{
value = (ctrlEvent.value < 0.5f) ? kData->param.ranges[k].min : kData->param.ranges[k].max;
value = (ctrlEvent.value < 0.5f) ? pData->param.ranges[k].min : pData->param.ranges[k].max;
}
else
{
value = kData->param.ranges[k].unnormalizeValue(ctrlEvent.value);
value = pData->param.ranges[k].unnormalizeValue(ctrlEvent.value);

if (kData->param.data[k].hints & PARAMETER_IS_INTEGER)
if (pData->param.data[k].hints & PARAMETER_IS_INTEGER)
value = std::rint(value);
}

@@ -713,18 +713,18 @@ public:
}

case kEngineControlEventTypeMidiBank:
if (event.channel == kData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
nextBankId = ctrlEvent.param;
break;

case kEngineControlEventTypeMidiProgram:
if (event.channel == kData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0)
{
const uint32_t nextProgramId = ctrlEvent.param;

for (k=0; k < kData->midiprog.count; ++k)
for (k=0; k < pData->midiprog.count; ++k)
{
if (kData->midiprog.data[k].bank == nextBankId && kData->midiprog.data[k].program == nextProgramId)
if (pData->midiprog.data[k].bank == nextBankId && pData->midiprog.data[k].program == nextProgramId)
{
setMidiProgram(k, false, false, false);
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0f);
@@ -744,7 +744,7 @@ public:
case kEngineControlEventTypeAllNotesOff:
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF)
{
if (event.channel == kData->ctrlChannel && ! allNotesOffSent)
if (event.channel == pData->ctrlChannel && ! allNotesOffSent)
{
allNotesOffSent = true;
sendMidiAllNotesOffToCallback();
@@ -821,7 +821,7 @@ public:
}
}

kData->postRtEvents.trySplice();
pData->postRtEvents.trySplice();

if (frames > timeOffset)
processSingle(outBuffer, frames - timeOffset, timeOffset);
@@ -844,13 +844,13 @@ public:
// --------------------------------------------------------------------------------------------------------
// Try lock, silence otherwise

if (kData->engine->isOffline())
if (pData->engine->isOffline())
{
kData->singleMutex.lock();
pData->singleMutex.lock();
}
else if (! kData->singleMutex.tryLock())
else if (! pData->singleMutex.tryLock())
{
for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
{
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] = 0.0f;
@@ -872,12 +872,12 @@ public:
// Post-processing (dry/wet, volume and balance)

{
const bool doVolume = (fHints & PLUGIN_CAN_VOLUME) > 0 && kData->postProc.volume != 1.0f;
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) > 0 && (kData->postProc.balanceLeft != -1.0f || kData->postProc.balanceRight != 1.0f);
const bool doVolume = (fHints & PLUGIN_CAN_VOLUME) > 0 && pData->postProc.volume != 1.0f;
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) > 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f);

float oldBufLeft[doBalance ? frames : 1];

for (i=0; i < kData->audioOut.count; ++i)
for (i=0; i < pData->audioOut.count; ++i)
{
// Balance
if (doBalance)
@@ -885,8 +885,8 @@ public:
if (i % 2 == 0)
carla_copyFloat(oldBufLeft, outBuffer[i], frames);

float balRangeL = (kData->postProc.balanceLeft + 1.0f)/2.0f;
float balRangeR = (kData->postProc.balanceRight + 1.0f)/2.0f;
float balRangeL = (pData->postProc.balanceLeft + 1.0f)/2.0f;
float balRangeR = (pData->postProc.balanceRight + 1.0f)/2.0f;

for (k=0; k < frames; ++k)
{
@@ -909,7 +909,7 @@ public:
if (doVolume)
{
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] *= kData->postProc.volume;
outBuffer[i][k+timeOffset] *= pData->postProc.volume;
}
}

@@ -918,7 +918,7 @@ public:

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

kData->singleMutex.unlock();
pData->singleMutex.unlock();
return true;
}

@@ -936,34 +936,34 @@ public:

bool init(const char* filename, const char* const name, const char* label)
{
CARLA_ASSERT(kData->engine != nullptr);
CARLA_ASSERT(kData->client == nullptr);
CARLA_ASSERT(pData->engine != nullptr);
CARLA_ASSERT(pData->client == nullptr);
CARLA_ASSERT(filename != nullptr);
CARLA_ASSERT(label != nullptr);

// ---------------------------------------------------------------
// first checks

if (kData->engine == nullptr)
if (pData->engine == nullptr)
{
return false;
}

if (kData->client != nullptr)
if (pData->client != nullptr)
{
kData->engine->setLastError("Plugin client is already registered");
pData->engine->setLastError("Plugin client is already registered");
return false;
}

if (filename == nullptr)
{
kData->engine->setLastError("null filename");
pData->engine->setLastError("null filename");
return false;
}

if (label == nullptr)
{
kData->engine->setLastError("null label");
pData->engine->setLastError("null label");
return false;
}

@@ -974,7 +974,7 @@ public:

if (! (file.exists() && file.isFile() && file.isReadable()))
{
kData->engine->setLastError("Requested file is not valid or does not exist");
pData->engine->setLastError("Requested file is not valid or does not exist");
return false;
}
}
@@ -989,7 +989,7 @@ public:
}
catch (LinuxSampler::Exception& e)
{
kData->engine->setLastError(e.what());
pData->engine->setLastError(e.what());
return false;
}

@@ -1000,7 +1000,7 @@ public:

if (fInstrument == nullptr)
{
kData->engine->setLastError("Failed to get LinuxSampler instrument manager");
pData->engine->setLastError("Failed to get LinuxSampler instrument manager");
LinuxSampler::EngineFactory::Destroy(fEngine);
fEngine = nullptr;
return false;
@@ -1014,7 +1014,7 @@ public:
}
catch (const LinuxSampler::InstrumentManagerException& e)
{
kData->engine->setLastError(e.what());
pData->engine->setLastError(e.what());
LinuxSampler::EngineFactory::Destroy(fEngine);
fEngine = nullptr;
return false;
@@ -1025,7 +1025,7 @@ public:

if (fInstrumentIds.size() == 0)
{
kData->engine->setLastError("Failed to find any instruments");
pData->engine->setLastError("Failed to find any instruments");
LinuxSampler::EngineFactory::Destroy(fEngine);
fEngine = nullptr;
return false;
@@ -1038,7 +1038,7 @@ public:
}
catch (const LinuxSampler::InstrumentManagerException& e)
{
kData->engine->setLastError(e.what());
pData->engine->setLastError(e.what());
LinuxSampler::EngineFactory::Destroy(fEngine);
fEngine = nullptr;
return false;
@@ -1053,18 +1053,18 @@ public:
fLabel += " (16 outs)";

if (name != nullptr)
fName = kData->engine->getUniquePluginName(name);
fName = pData->engine->getUniquePluginName(name);
else
fName = kData->engine->getUniquePluginName((const char*)fRealName);
fName = pData->engine->getUniquePluginName((const char*)fRealName);

// ---------------------------------------------------------------
// Register client

kData->client = kData->engine->addClient(this);
pData->client = pData->engine->addClient(this);

if (kData->client == nullptr || ! kData->client->isOk())
if (pData->client == nullptr || ! pData->client->isOk())
{
kData->engine->setLastError("Failed to register plugin client");
pData->engine->setLastError("Failed to register plugin client");
LinuxSampler::EngineFactory::Destroy(fEngine);
fEngine = nullptr;
return false;
@@ -1095,10 +1095,10 @@ public:
fOptions |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;

// load settings
kData->idStr = kIsGIG ? "GIG" : "SFZ";
kData->idStr += "/";
kData->idStr += label;
fOptions = kData->loadSettings(fOptions, availableOptions());
pData->idStr = kIsGIG ? "GIG" : "SFZ";
pData->idStr += "/";
pData->idStr += label;
fOptions = pData->loadSettings(fOptions, availableOptions());
}

return true;


+ 374
- 374
source/backend/plugin/Lv2Plugin.cpp
File diff suppressed because it is too large
View File


+ 214
- 211
source/backend/plugin/NativePlugin.cpp
File diff suppressed because it is too large
View File


+ 4
- 4
source/backend/plugin/Vst3Plugin.cpp View File

@@ -36,11 +36,11 @@ public:
{
carla_debug("Vst3Plugin::~Vst3Plugin()");

kData->singleMutex.lock();
kData->masterMutex.lock();
pData->singleMutex.lock();
pData->masterMutex.lock();

if (kData->client != nullptr && kData->client->isActive())
kData->client->deactivate();
if (pData->client != nullptr && pData->client->isActive())
pData->client->deactivate();
}

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


+ 239
- 239
source/backend/plugin/VstPlugin.cpp
File diff suppressed because it is too large
View File


+ 5
- 5
source/backend/standalone/CarlaStandalone.cpp View File

@@ -575,14 +575,14 @@ void carla_set_engine_option(CarlaOptionsType option, int value, const char* val
#endif

case CB::OPTION_MAX_PARAMETERS:
if (value <= 0)
if (value < 1)
return carla_stderr2("carla_set_engine_option(OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr);

gStandalone.options.maxParameters = static_cast<unsigned int>(value);
break;

case CB::OPTION_UI_BRIDGES_TIMEOUT:
if (value <= 0)
if (value < 1)
return carla_stderr2("carla_set_engine_option(OPTION_UI_BRIDGES_TIMEOUT, %i, \"%s\") - invalid value", value, valueStr);

gStandalone.options.uiBridgesTimeout = static_cast<unsigned int>(value);
@@ -590,21 +590,21 @@ void carla_set_engine_option(CarlaOptionsType option, int value, const char* val

#ifdef WANT_RTAUDIO
case CB::OPTION_RTAUDIO_NUMBER_PERIODS:
if (value <= 0 || value > 3)
if (value < 2 || value > 3)
return carla_stderr2("carla_set_engine_option(OPTION_RTAUDIO_NUMBER_PERIODS, %i, \"%s\") - invalid value", value, valueStr);

gStandalone.options.rtaudioNumPeriods = static_cast<unsigned int>(value);
break;

case CB::OPTION_RTAUDIO_BUFFER_SIZE:
if (value <= 0)
if (value < 8)
return carla_stderr2("carla_set_engine_option(OPTION_RTAUDIO_BUFFER_SIZE, %i, \"%s\") - invalid value", value, valueStr);

gStandalone.options.rtaudioBufferSize = static_cast<unsigned int>(value);
break;

case CB::OPTION_RTAUDIO_SAMPLE_RATE:
if (value <= 0)
if (value < 22050)
return carla_stderr2("carla_set_engine_option(OPTION_RTAUDIO_SAMPLE_RATE, %i, \"%s\") - invalid value", value, valueStr);

gStandalone.options.rtaudioSampleRate = static_cast<unsigned int>(value);


+ 25
- 2
source/modules/utils/RtList.hpp View File

@@ -267,9 +267,9 @@ public:
{
data = list_entry(entry, Data, siblings);

CARLA_ASSERT(data != nullptr);
CARLA_SAFE_ASSERT_CONTINUE(data != nullptr)

if (data != nullptr && data->value == value)
if (data->value == value)
{
--fCount;
list_del(entry);
@@ -283,6 +283,29 @@ public:
return (data != nullptr);
}

void removeAll(const T& value)
{
Data* data;
k_list_head* entry;
k_list_head* entry2;

list_for_each_safe(entry, entry2, &fQueue)
{
data = list_entry(entry, Data, siblings);

CARLA_SAFE_ASSERT_CONTINUE(data != nullptr)

if (data->value == value)
{
--fCount;
list_del(entry);

data->~Data();
_deallocate(data);
}
}
}

void spliceAppend(List& list, const bool init = true)
{
if (init)


Loading…
Cancel
Save