Browse Source

Continue rework, almost done

tags/1.9.4
falkTX 11 years ago
parent
commit
5f1d2ec1ce
6 changed files with 274 additions and 280 deletions
  1. +12
    -2
      source/backend/CarlaPlugin.hpp
  2. +31
    -9
      source/backend/plugin/CarlaPlugin.cpp
  3. +15
    -15
      source/backend/plugin/CarlaPluginInternal.hpp
  4. +108
    -150
      source/backend/plugin/DssiPlugin.cpp
  5. +95
    -104
      source/backend/plugin/LadspaPlugin.cpp
  6. +13
    -0
      source/utils/RtList.hpp

+ 12
- 2
source/backend/CarlaPlugin.hpp View File

@@ -463,7 +463,7 @@ public:
* \param sendOsc Send message change over OSC
* \param sendCallback Send message change to registered callback
*/
virtual void setActive(const bool active, const bool sendOsc, const bool sendCallback);
void setActive(const bool active, const bool sendOsc, const bool sendCallback);

/*!
* Set the plugin's dry/wet signal value to \a value.\n
@@ -657,7 +657,17 @@ public:
// Plugin processing

/*!
* Plugin process callback.
* Plugin activate call.
*/
virtual void activate();

/*!
* Plugin activate call.
*/
virtual void deactivate();

/*!
* Plugin process call.
*/
virtual void process(float** const inBuffer, float** const outBuffer, const uint32_t frames);



+ 31
- 9
source/backend/plugin/CarlaPlugin.cpp View File

@@ -53,6 +53,8 @@ public:
if (filename == nullptr)
return nullptr;

const CarlaMutex::ScopedLocker sl(&mutex);

for (auto it = libs.begin(); it.valid(); it.next())
{
Lib& lib(*it);
@@ -82,6 +84,8 @@ public:
if (libPtr == nullptr)
return false;

const CarlaMutex::ScopedLocker sl(&mutex);

for (auto it = libs.begin(); it.valid(); it.next())
{
Lib& lib(*it);
@@ -95,11 +99,14 @@ public:
{
delete[] lib.filename;
lib_close(lib.lib);

libs.remove(it);
}

return true;
}

CARLA_ASSERT(false); // invalid pointer
return false;
}

@@ -110,20 +117,21 @@ private:
int count;
};

CarlaMutex mutex;
NonRtList<Lib> libs;
};

static LibMap gLibMap;
static LibMap sLibMap;

bool CarlaPluginProtectedData::libOpen(const char* const filename)
{
lib = gLibMap.open(filename);
lib = sLibMap.open(filename);
return (lib != nullptr);
}

bool CarlaPluginProtectedData::libClose()
{
const bool ret = gLibMap.close(lib);
const bool ret = sLibMap.close(lib);
lib = nullptr;
return ret;
}
@@ -894,11 +902,14 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename)

void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool sendCallback)
{
CARLA_ASSERT(kData->active != active); // subclasses should prevent this

if (kData->active == active)
return;

if (active)
activate();
else
deactivate();

kData->active = active;

const float value = active ? 1.0f : 0.0f;
@@ -1399,6 +1410,16 @@ void CarlaPlugin::reloadPrograms(const bool)
// -------------------------------------------------------------------
// Plugin processing

void CarlaPlugin::activate()
{
CARLA_ASSERT(! kData->active);
}

void CarlaPlugin::deactivate()
{
CARLA_ASSERT(kData->active);
}

void CarlaPlugin::process(float** const, float** const, const uint32_t)
{
}
@@ -1558,12 +1579,13 @@ void CarlaPlugin::registerToOscClient()

// Internal Parameters
{
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, kData->active ? 1.0 : 0.0);
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_DRYWET, kData->postProc.dryWet);
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_VOLUME, kData->postProc.volume);
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, kData->postProc.balanceLeft);
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, kData->postProc.balanceRight);
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_PANNING, kData->postProc.panning);
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, kData->ctrlChannel);
kData->engine->osc_send_control_set_parameter_value(fId, PARAMETER_ACTIVE, kData->active ? 1.0f : 0.0f);
}
#endif
}
@@ -1791,7 +1813,7 @@ void CarlaPlugin::postRtEventsRun()
#endif

// Update Host
kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, event.value1, 0, 0.0, nullptr);
kData->engine->callback(CALLBACK_PROGRAM_CHANGED, fId, event.value1, 0, 0.0f, nullptr);
break;

case kPluginPostRtEventMidiProgramChange:
@@ -1811,7 +1833,7 @@ void CarlaPlugin::postRtEventsRun()
#endif

// Update Host
kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, event.value1, 0, 0.0, nullptr);
kData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, event.value1, 0, 0.0f, nullptr);
break;

case kPluginPostRtEventNoteOn:
@@ -1839,7 +1861,7 @@ void CarlaPlugin::postRtEventsRun()
#endif

// Update Host
kData->engine->callback(CALLBACK_NOTE_OFF, fId, event.value1, event.value2, 0.0, nullptr);
kData->engine->callback(CALLBACK_NOTE_OFF, fId, event.value1, event.value2, 0.0f, nullptr);
break;
}
}


+ 15
- 15
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -563,21 +563,6 @@ struct CarlaPluginProtectedData {
client = nullptr;
}

if (latencyBuffers != nullptr)
{
for (uint32_t i=0; i < audioIn.count; i++)
{
CARLA_ASSERT(latencyBuffers[i] != nullptr);

if (latencyBuffers[i] != nullptr)
delete[] latencyBuffers[i];
}

delete[] latencyBuffers;
latencyBuffers = nullptr;
latency = 0;
}

clearBuffers();

for (auto it = custom.begin(); it.valid(); it.next())
@@ -612,6 +597,21 @@ struct CarlaPluginProtectedData {

void clearBuffers()
{
if (latencyBuffers != nullptr)
{
for (uint32_t i=0; i < audioIn.count; i++)
{
CARLA_ASSERT(latencyBuffers[i] != nullptr);

if (latencyBuffers[i] != nullptr)
delete[] latencyBuffers[i];
}

delete[] latencyBuffers;
latencyBuffers = nullptr;
latency = 0;
}

audioIn.clear();
audioOut.clear();
param.clear();


+ 108
- 150
source/backend/plugin/DssiPlugin.cpp View File

@@ -25,7 +25,7 @@
CARLA_BACKEND_START_NAMESPACE

#if 0
{
}
#endif

class DssiPlugin : public CarlaPlugin
@@ -43,7 +43,7 @@ public:
{
carla_debug("DssiPlugin::DssiPlugin(%p, %i)", engine, id);

carla_zeroMem(fMidiEvents, sizeof(snd_seq_event_t)*MAX_MIDI_EVENTS);
carla_zeroStruct<snd_seq_event_t>(fMidiEvents, MAX_MIDI_EVENTS);

kData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_DSSI_GUI);
}
@@ -52,9 +52,6 @@ public:
{
carla_debug("DssiPlugin::~DssiPlugin()");

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

// close UI
if (fHints & PLUGIN_HAS_GUI)
{
@@ -68,16 +65,17 @@ public:
}
}

if (fDescriptor != nullptr)
kData->singleMutex.lock();
kData->masterMutex.lock();

if (kData->active)
{
if (fDescriptor->deactivate != nullptr && kData->active/*Before*/)
{
if (fHandle != nullptr)
fDescriptor->deactivate(fHandle);
if (fHandle2 != nullptr)
fDescriptor->deactivate(fHandle2);
}
deactivate();
kData->active = false;
}

if (fDescriptor != nullptr)
{
if (fDescriptor->cleanup != nullptr)
{
if (fHandle != nullptr)
@@ -92,7 +90,7 @@ public:
fDssiDescriptor = nullptr;
}

deleteBuffers();
clearBuffers();
}

// -------------------------------------------------------------------
@@ -132,8 +130,8 @@ public:

unsigned long dataSize = 0;

if (fDssiDescriptor->get_custom_data != nullptr && fDssiDescriptor->get_custom_data(fHandle, dataPtr, &dataSize))
return (int32_t)dataSize;
if (fDssiDescriptor->get_custom_data != nullptr && fDssiDescriptor->get_custom_data(fHandle, dataPtr, &dataSize) != 0)
return static_cast<int32_t>(dataSize);

return 0;
}
@@ -157,17 +155,21 @@ public:

options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;

//if ((kData->audioIns.count() == 1 || kData->audioOuts.count() == 0) || (kData->audioIns.count() == 0 || kData->audioOuts.count() == 1))
// options |= PLUGIN_OPTION_FORCE_STEREO;

if (isDssiVst)
{
if (fDescriptor != nullptr && fDssiDescriptor->get_custom_data != nullptr && fDssiDescriptor->set_custom_data != nullptr)
options |= PLUGIN_OPTION_USE_CHUNKS;
}
else if (! isZASX)
else
{
options |= PLUGIN_OPTION_FIXED_BUFFER;
if (kData->engine->getProccessMode() != PROCESS_MODE_CONTINUOUS_RACK)
{
if (kData->audioIn.count <= 1 && kData->audioOut.count <= 1 && (kData->audioIn.count != 0 || kData->audioOut.count != 0))
options |= PLUGIN_OPTION_FORCE_STEREO;
}

if (! isZASX)
options |= PLUGIN_OPTION_FIXED_BUFFER;
}

if (kData->extraHints & PLUGIN_HINT_HAS_MIDI_IN)
@@ -242,40 +244,6 @@ public:
CarlaPlugin::getParameterName(parameterId, strBuf);
}

// -------------------------------------------------------------------
// Set data (internal stuff)

void setActive(const bool active, const bool sendOsc, const bool sendCallback)
{
CARLA_ASSERT(fDescriptor != nullptr);

if (kData->active == active)
return;

if (active)
{
if (fDescriptor->activate != nullptr)
{
fDescriptor->activate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->activate(fHandle2);
}
}
else
{
if (fDescriptor->deactivate != nullptr)
{
fDescriptor->deactivate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->deactivate(fHandle2);
}
}

CarlaPlugin::setActive(active, sendOsc, sendCallback);
}

// -------------------------------------------------------------------
// Set data (plugin-specific stuff)

@@ -425,7 +393,10 @@ public:
// Safely disable plugin for reload
const ScopedDisabler sd(this);

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

clearBuffers();

const float sampleRate = (float)kData->engine->getSampleRate();
const uint32_t portCount = static_cast<uint32_t>(fDescriptor->PortCount);
@@ -445,7 +416,7 @@ public:
CARLA_ASSERT(fDescriptor->PortRangeHints != nullptr);
CARLA_ASSERT(fDescriptor->PortNames != nullptr);

for (uint32_t i=0; i < portCount; i++)
for (uint32_t i=0; i < portCount; ++i)
{
const LADSPA_PortDescriptor portType = fDescriptor->PortDescriptors[i];

@@ -490,7 +461,7 @@ public:
kData->audioIn.createNew(aIns);
fAudioInBuffers = new float*[aIns];

for (uint32_t i=0; i < aIns; i++)
for (uint32_t i=0; i < aIns; ++i)
fAudioInBuffers[i] = nullptr;
}

@@ -500,7 +471,7 @@ public:
fAudioOutBuffers = new float*[aOuts];
needsCtrlIn = true;

for (uint32_t i=0; i < aOuts; i++)
for (uint32_t i=0; i < aOuts; ++i)
fAudioOutBuffers[i] = nullptr;
}

@@ -509,14 +480,14 @@ public:
kData->param.createNew(params);
fParamBuffers = new float[params];

for (uint32_t i=0; i < params; i++)
for (uint32_t i=0; i < params; ++i)
fParamBuffers[i] = 0.0f;
}

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

for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCtrl=0; i < portCount; i++)
for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCtrl=0; i < portCount; ++i)
{
const LADSPA_PortDescriptor portType = fDescriptor->PortDescriptors[i];
const LADSPA_PortRangeHint portRangeHints = fDescriptor->PortRangeHints[i];
@@ -824,7 +795,7 @@ public:
// check latency
if (fHints & PLUGIN_CAN_DRYWET)
{
for (uint32_t i=0; i < kData->param.count; i++)
for (uint32_t i=0; i < kData->param.count; ++i)
{
if (kData->param.data[i].type != PARAMETER_LATENCY)
continue;
@@ -834,7 +805,7 @@ public:
float tmpIn[aIns][2];
float tmpOut[aOuts][2];

for (j=0; j < aIns; j++)
for (j=0; j < aIns; ++j)
{
tmpIn[j][0] = 0.0f;
tmpIn[j][1] = 0.0f;
@@ -842,7 +813,7 @@ public:
fDescriptor->connect_port(fHandle, kData->audioIn.ports[j].rindex, tmpIn[j]);
}

for (j=0; j < aOuts; j++)
for (j=0; j < aOuts; ++j)
{
tmpOut[j][0] = 0.0f;
tmpOut[j][1] = 0.0f;
@@ -899,7 +870,7 @@ public:
kData->midiprog.createNew(count);

// Update data
for (i=0; i < count; i++)
for (i=0; i < count; ++i)
{
const DSSI_Program_Descriptor* const pdesc = fDssiDescriptor->get_program(fHandle, i);
CARLA_ASSERT(pdesc != nullptr);
@@ -917,7 +888,7 @@ public:
{
kData->engine->osc_send_control_set_midi_program_count(fId, count);

for (i=0; i < count; i++)
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);
}
#endif
@@ -972,6 +943,32 @@ public:
// -------------------------------------------------------------------
// Plugin processing

void activate()
{
CARLA_ASSERT(fDescriptor != nullptr);

if (fDescriptor->activate != nullptr)
{
fDescriptor->activate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->activate(fHandle2);
}
}

void deactivate()
{
CARLA_ASSERT(fDescriptor != nullptr);

if (fDescriptor->deactivate != nullptr)
{
fDescriptor->deactivate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->deactivate(fHandle2);
}
}

void process(float** const inBuffer, float** const outBuffer, const uint32_t frames)
{
uint32_t i, k;
@@ -982,23 +979,9 @@ public:
if (! kData->active)
{
// disable any output sound
for (i=0; i < kData->audioOut.count; i++)
for (i=0; i < kData->audioOut.count; ++i)
carla_zeroFloat(outBuffer[i], frames);

#if 0
if (kData->activeBefore)
{
if (fDescriptor->deactivate != nullptr)
{
fDescriptor->deactivate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->deactivate(fHandle2);
}
}

kData->activeBefore = kData->active;
#endif
return;
}

@@ -1007,11 +990,12 @@ public:
// --------------------------------------------------------------------------------------------------------
// Check if not active before

if (kData->needsReset /*|| ! kData->activeBefore*/)
if (kData->needsReset)
{
// TODO!
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF)
{
for (unsigned char j=0, l=MAX_MIDI_CHANNELS; j < MAX_MIDI_CHANNELS; j++)
for (unsigned char j=0, l=MAX_MIDI_CHANNELS; j < MAX_MIDI_CHANNELS; ++j)
{
carla_zeroStruct<snd_seq_event_t>(fMidiEvents[j]);
carla_zeroStruct<snd_seq_event_t>(fMidiEvents[j+l]);
@@ -1027,33 +1011,15 @@ public:

midiEventCount = MAX_MIDI_CHANNELS*2;
}

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

#if 0
if (kData->activeBefore)
else
{
if (fDescriptor->deactivate != nullptr)
{
fDescriptor->deactivate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->deactivate(fHandle2);
}
}

if (fDescriptor->activate != nullptr)
if (kData->latency > 0)
{
fDescriptor->activate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->activate(fHandle2);
for (i=0; i < kData->audioIn.count; ++i)
carla_zeroFloat(kData->latencyBuffers[i], kData->latency);
}
#endif

kData->needsReset = false;
}
@@ -1061,7 +1027,7 @@ public:
// --------------------------------------------------------------------------------------------------------
// Event Input and Processing

if (kData->event.portIn != nullptr /*&& kData->activeBefore*/)
if (kData->event.portIn != nullptr)
{
// ----------------------------------------------------------------------------------------------------
// MIDI Input (External)
@@ -1102,7 +1068,7 @@ public:
if (kData->midiprog.current >= 0 && kData->midiprog.count > 0)
nextBankId = kData->midiprog.data[kData->midiprog.current].bank;

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

@@ -1198,7 +1164,7 @@ public:
}

// Control plugin parameters
for (k=0; k < kData->param.count; k++)
for (k=0; k < kData->param.count; ++k)
{
if (kData->param.data[k].midiChannel != event.channel)
continue;
@@ -1240,7 +1206,7 @@ public:
{
const uint32_t nextProgramId = ctrlEvent.param;

for (k=0; k < kData->midiprog.count; k++)
for (k=0; k < kData->midiprog.count; ++k)
{
if (kData->midiprog.data[k].bank == nextBankId && kData->midiprog.data[k].program == nextProgramId)
{
@@ -1434,23 +1400,6 @@ public:

} // End of Plugin processing (no events)

// --------------------------------------------------------------------------------------------------------
// Special Parameters

#if 0
CARLA_PROCESS_CONTINUE_CHECK;

for (k=0; k < param.count; k++)
{
if (param.data[k].type == PARAMETER_LATENCY)
{
// TODO
}
}

CARLA_PROCESS_CONTINUE_CHECK;
#endif

CARLA_PROCESS_CONTINUE_CHECK;

// --------------------------------------------------------------------------------------------------------
@@ -1462,7 +1411,7 @@ public:
uint16_t param;
float value;

for (k=0; k < kData->param.count; k++)
for (k=0; k < kData->param.count; ++k)
{
if (kData->param.data[k].type != PARAMETER_OUTPUT)
continue;
@@ -1516,9 +1465,9 @@ public:
}
else if (! kData->singleMutex.tryLock())
{
for (i=0; i < kData->audioOut.count; i++)
for (i=0; i < kData->audioOut.count; ++i)
{
for (k=0; k < frames; k++)
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] = 0.0f;
}

@@ -1526,11 +1475,11 @@ public:
}

// --------------------------------------------------------------------------------------------------------
// Fill plugin buffers
// Reset audio buffers

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

// --------------------------------------------------------------------------------------------------------
@@ -1563,17 +1512,18 @@ 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 && kData->postProc.dryWet != 1.0f;
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (kData->postProc.balanceLeft != -1.0f || kData->postProc.balanceRight != 1.0f);

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

for (i=0; i < kData->audioOut.count; i++)
for (i=0; i < kData->audioOut.count; ++i)
{
// Dry/Wet
if (doDryWet)
{
for (k=0; k < frames; k++)
for (k=0; k < frames; ++k)
{
// TODO
//if (k < kData->latency && kData->latency < frames)
@@ -1589,15 +1539,20 @@ public:
// Balance
if (doBalance)
{
if (i % 2 == 0)
isPair = (i % 2 == 0);

if (isPair)
{
CARLA_ASSERT(i+1 < kData->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;

for (k=0; k < frames; k++)
for (k=0; k < frames; ++k)
{
if (i % 2 == 0)
if (isPair)
{
// left
fAudioOutBuffers[i][k] = oldBufLeft[k] * (1.0f - balRangeL);
@@ -1614,7 +1569,7 @@ public:

// Volume (and buffer copy)
{
for (k=0; k < frames; k++)
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] = fAudioOutBuffers[i][k] * kData->postProc.volume;
}
}
@@ -1623,7 +1578,7 @@ public:
// Latency, save values for next callback, TODO
if (kData->latency > 0 && kData->latency < frames)
{
for (i=0; i < kData->audioIn.count; i++)
for (i=0; i < kData->audioIn.count; ++i)
carla_copyFloat(kData->latencyBuffers[i], inBuffer[i] + (frames - kData->latency), kData->latency);
}
#endif
@@ -1639,14 +1594,14 @@ public:
{
carla_debug("DssiPlugin::bufferSizeChanged(%i) - start", newBufferSize);

for (uint32_t i=0; i < kData->audioIn.count; i++)
for (uint32_t i=0; i < kData->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 < kData->audioOut.count; ++i)
{
if (fAudioOutBuffers[i] != nullptr)
delete[] fAudioOutBuffers[i];
@@ -1655,13 +1610,13 @@ public:

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

for (uint32_t i=0; i < kData->audioOut.count; i++)
for (uint32_t i=0; i < kData->audioOut.count; ++i)
{
CARLA_ASSERT(fAudioOutBuffers[i] != nullptr);
fDescriptor->connect_port(fHandle, kData->audioOut.ports[i].rindex, fAudioOutBuffers[i]);
@@ -1765,13 +1720,13 @@ public:
// -------------------------------------------------------------------
// Cleanup

void deleteBuffers()
void clearBuffers()
{
carla_debug("DssiPlugin::deleteBuffers() - start");
carla_debug("DssiPlugin::clearBuffers() - start");

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

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

kData->clearBuffers();

carla_debug("DssiPlugin::deleteBuffers() - end");
carla_debug("DssiPlugin::clearBuffers() - end");
}

// -------------------------------------------------------------------
@@ -1925,6 +1880,9 @@ public:
fHints |= PLUGIN_HAS_GUI;
}

// TODO - load settings for options:
//fOptions & PLUGIN_OPTION_FORCE_STEREO

return true;
}



+ 95
- 104
source/backend/plugin/LadspaPlugin.cpp View File

@@ -50,16 +50,14 @@ public:
kData->singleMutex.lock();
kData->masterMutex.lock();

if (fDescriptor != nullptr)
if (kData->active)
{
if (fDescriptor->deactivate != nullptr && kData->active)
{
if (fHandle != nullptr)
fDescriptor->deactivate(fHandle);
if (fHandle2 != nullptr)
fDescriptor->deactivate(fHandle2);
}
deactivate();
kData->active = false;
}

if (fDescriptor != nullptr)
{
if (fDescriptor->cleanup != nullptr)
{
if (fHandle != nullptr)
@@ -79,7 +77,7 @@ public:
fRdfDescriptor = nullptr;
}

deleteBuffers();
clearBuffers();
}

// -------------------------------------------------------------------
@@ -170,8 +168,11 @@ public:
if (! isDssiVst)
options |= PLUGIN_OPTION_FIXED_BUFFER;

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

return options;
}
@@ -349,40 +350,6 @@ public:
CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf);
}

// -------------------------------------------------------------------
// Set data (internal stuff)

void setActive(const bool active, const bool sendOsc, const bool sendCallback)
{
CARLA_ASSERT(fDescriptor != nullptr);

if (kData->active == active)
return;

if (active)
{
if (fDescriptor->activate != nullptr)
{
fDescriptor->activate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->activate(fHandle2);
}
}
else
{
if (fDescriptor->deactivate != nullptr)
{
fDescriptor->deactivate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->deactivate(fHandle2);
}
}

CarlaPlugin::setActive(active, sendOsc, sendCallback);
}

// -------------------------------------------------------------------
// Set data (plugin-specific stuff)

@@ -418,7 +385,10 @@ public:
// Safely disable plugin for reload
const ScopedDisabler sd(this);

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

clearBuffers();

const float sampleRate = (float)kData->engine->getSampleRate();
const uint32_t portCount = static_cast<uint32_t>(fDescriptor->PortCount);
@@ -438,7 +408,7 @@ public:
CARLA_ASSERT(fDescriptor->PortRangeHints != nullptr);
CARLA_ASSERT(fDescriptor->PortNames != nullptr);

for (uint32_t i=0; i < portCount; i++)
for (uint32_t i=0; i < portCount; ++i)
{
const LADSPA_PortDescriptor portType = fDescriptor->PortDescriptors[i];

@@ -477,7 +447,7 @@ public:
kData->audioIn.createNew(aIns);
fAudioInBuffers = new float*[aIns];

for (uint32_t i=0; i < aIns; i++)
for (uint32_t i=0; i < aIns; ++i)
fAudioInBuffers[i] = nullptr;
}

@@ -487,7 +457,7 @@ public:
fAudioOutBuffers = new float*[aOuts];
needsCtrlIn = true;

for (uint32_t i=0; i < aOuts; i++)
for (uint32_t i=0; i < aOuts; ++i)
fAudioOutBuffers[i] = nullptr;
}

@@ -496,14 +466,14 @@ public:
kData->param.createNew(params);
fParamBuffers = new float[params];

for (uint32_t i=0; i < params; i++)
for (uint32_t i=0; i < params; ++i)
fParamBuffers[i] = 0.0f;
}

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

for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCtrl=0; i < portCount; i++)
for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCtrl=0; i < portCount; ++i)
{
const LADSPA_PortDescriptor portType = fDescriptor->PortDescriptors[i];
const LADSPA_PortRangeHint portRangeHints = fDescriptor->PortRangeHints[i];
@@ -718,7 +688,7 @@ public:
portName += ":";
}

portName += "event-in";
portName += "events-in";
portName.truncate(portNameSize);

kData->event.portIn = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, true);
@@ -734,7 +704,7 @@ public:
portName += ":";
}

portName += "event-out";
portName += "events-out";
portName.truncate(portNameSize);

kData->event.portOut = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, false);
@@ -767,7 +737,7 @@ public:
// check latency
if (fHints & PLUGIN_CAN_DRYWET)
{
for (uint32_t i=0; i < kData->param.count; i++)
for (uint32_t i=0; i < kData->param.count; ++i)
{
if (kData->param.data[i].type != PARAMETER_LATENCY)
continue;
@@ -777,7 +747,7 @@ public:
float tmpIn[aIns][2];
float tmpOut[aOuts][2];

for (j=0; j < aIns; j++)
for (j=0; j < aIns; ++j)
{
tmpIn[j][0] = 0.0f;
tmpIn[j][1] = 0.0f;
@@ -785,7 +755,7 @@ public:
fDescriptor->connect_port(fHandle, kData->audioIn.ports[j].rindex, tmpIn[j]);
}

for (j=0; j < aOuts; j++)
for (j=0; j < aOuts; ++j)
{
tmpOut[j][0] = 0.0f;
tmpOut[j][1] = 0.0f;
@@ -816,12 +786,41 @@ public:

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

if (kData->active)
activate();

carla_debug("LadspaPlugin::reload() - end");
}

// -------------------------------------------------------------------
// Plugin processing

void activate()
{
CARLA_ASSERT(fDescriptor != nullptr);

if (fDescriptor->activate != nullptr)
{
fDescriptor->activate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->activate(fHandle2);
}
}

void deactivate()
{
CARLA_ASSERT(fDescriptor != nullptr);

if (fDescriptor->deactivate != nullptr)
{
fDescriptor->deactivate(fHandle);

if (fHandle2 != nullptr)
fDescriptor->deactivate(fHandle2);
}
}

void process(float** const inBuffer, float** const outBuffer, const uint32_t frames)
{
uint32_t i, k;
@@ -832,20 +831,20 @@ public:
if (! kData->active)
{
// disable any output sound
for (i=0; i < kData->audioOut.count; i++)
for (i=0; i < kData->audioOut.count; ++i)
carla_zeroFloat(outBuffer[i], frames);

return;
}

// --------------------------------------------------------------------------------------------------------
// Check if not active before
// Check if needs reset

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

@@ -855,7 +854,7 @@ public:
// --------------------------------------------------------------------------------------------------------
// Event Input and Processing

if (kData->event.portIn != nullptr /*&& kData->activeBefore*/)
if (kData->event.portIn != nullptr)
{
// ----------------------------------------------------------------------------------------------------
// Event Input (System)
@@ -865,7 +864,7 @@ public:
uint32_t time, nEvents = kData->event.portIn->getEventCount();
uint32_t timeOffset = 0;

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

@@ -950,7 +949,7 @@ public:
}

// Control plugin parameters
for (k=0; k < kData->param.count; k++)
for (k=0; k < kData->param.count; ++k)
{
if (kData->param.data[k].midiChannel != event.channel)
continue;
@@ -1039,23 +1038,6 @@ public:

} // End of Plugin processing (no events)

// --------------------------------------------------------------------------------------------------------
// Special Parameters

#if 0
CARLA_PROCESS_CONTINUE_CHECK;

for (k=0; k < param.count; k++)
{
if (param.data[k].type == PARAMETER_LATENCY)
{
// TODO
}
}

CARLA_PROCESS_CONTINUE_CHECK;
#endif

CARLA_PROCESS_CONTINUE_CHECK;

// --------------------------------------------------------------------------------------------------------
@@ -1067,7 +1049,7 @@ public:
uint16_t param;
float value;

for (k=0; k < kData->param.count; k++)
for (k=0; k < kData->param.count; ++k)
{
if (kData->param.data[k].type != PARAMETER_OUTPUT)
continue;
@@ -1121,9 +1103,9 @@ public:
}
else if (! kData->singleMutex.tryLock())
{
for (i=0; i < kData->audioOut.count; i++)
for (i=0; i < kData->audioOut.count; ++i)
{
for (k=0; k < frames; k++)
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] = 0.0f;
}

@@ -1131,11 +1113,11 @@ public:
}

// --------------------------------------------------------------------------------------------------------
// Fill plugin buffers
// Reset audio buffers

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

// --------------------------------------------------------------------------------------------------------
@@ -1150,17 +1132,18 @@ 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 && kData->postProc.dryWet != 1.0f;
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (kData->postProc.balanceLeft != -1.0f || kData->postProc.balanceRight != 1.0f);

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

for (i=0; i < kData->audioOut.count; i++)
for (i=0; i < kData->audioOut.count; ++i)
{
// Dry/Wet
if (doDryWet)
{
for (k=0; k < frames; k++)
for (k=0; k < frames; ++k)
{
// TODO
//if (k < kData->latency && kData->latency < frames)
@@ -1176,15 +1159,20 @@ public:
// Balance
if (doBalance)
{
if (i % 2 == 0)
isPair = (i % 2 == 0);

if (isPair)
{
CARLA_ASSERT(i+1 < kData->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;

for (k=0; k < frames; k++)
for (k=0; k < frames; ++k)
{
if (i % 2 == 0)
if (isPair)
{
// left
fAudioOutBuffers[i][k] = oldBufLeft[k] * (1.0f - balRangeL);
@@ -1201,7 +1189,7 @@ public:

// Volume (and buffer copy)
{
for (k=0; k < frames; k++)
for (k=0; k < frames; ++k)
outBuffer[i][k+timeOffset] = fAudioOutBuffers[i][k] * kData->postProc.volume;
}
}
@@ -1210,7 +1198,7 @@ public:
// Latency, save values for next callback, TODO
if (kData->latency > 0 && kData->latency < frames)
{
for (i=0; i < kData->audioIn.count; i++)
for (i=0; i < kData->audioIn.count; ++i)
carla_copyFloat(kData->latencyBuffers[i], inBuffer[i] + (frames - kData->latency), kData->latency);
}
#endif
@@ -1226,14 +1214,14 @@ public:
{
carla_debug("LadspaPlugin::bufferSizeChanged(%i) - start", newBufferSize);

for (uint32_t i=0; i < kData->audioIn.count; i++)
for (uint32_t i=0; i < kData->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 < kData->audioOut.count; ++i)
{
if (fAudioOutBuffers[i] != nullptr)
delete[] fAudioOutBuffers[i];
@@ -1242,13 +1230,13 @@ public:

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

for (uint32_t i=0; i < kData->audioOut.count; i++)
for (uint32_t i=0; i < kData->audioOut.count; ++i)
{
CARLA_ASSERT(fAudioOutBuffers[i] != nullptr);
fDescriptor->connect_port(fHandle, kData->audioOut.ports[i].rindex, fAudioOutBuffers[i]);
@@ -1283,13 +1271,13 @@ public:
// -------------------------------------------------------------------
// Cleanup

void deleteBuffers()
void clearBuffers()
{
carla_debug("LadspaPlugin::deleteBuffers() - start");
carla_debug("LadspaPlugin::clearBuffers() - start");

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

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

kData->clearBuffers();

carla_debug("LadspaPlugin::deleteBuffers() - end");
carla_debug("LadspaPlugin::clearBuffers() - end");
}

// -------------------------------------------------------------------
@@ -1438,6 +1426,9 @@ public:
return false;
}

// TODO - load settings for options:
//fOptions & PLUGIN_OPTION_FORCE_STEREO

return true;
}



+ 13
- 0
source/utils/RtList.hpp View File

@@ -223,6 +223,19 @@ public:
return _getFirstOrLast(false, remove);
}

void remove(Itenerator& it)
{
CARLA_ASSERT(it.fEntry != nullptr);
CARLA_ASSERT(it.fData != nullptr);

if (it.fEntry != nullptr && it.fData != nullptr)
{
fCount--;
list_del(it.fEntry);
_deallocate(it.fData);
}
}

bool removeOne(const T& value)
{
Data* data = nullptr;


Loading…
Cancel
Save