Browse Source

Carla: Empty audio buffers when plugin is not enabled, fix crackles on close

tags/v0.9.0
falkTX 13 years ago
parent
commit
065a69c1aa
2 changed files with 42 additions and 11 deletions
  1. +2
    -2
      c++/carla-backend/carla_engine.cpp
  2. +40
    -9
      c++/carla-backend/carla_engine_jack.cpp

+ 2
- 2
c++/carla-backend/carla_engine.cpp View File

@@ -475,11 +475,11 @@ bool CarlaEngine::removePlugin(const unsigned short id)


processLock(); processLock();
plugin->setEnabled(false); plugin->setEnabled(false);
m_carlaPlugins[id] = nullptr;
m_uniqueNames[id] = nullptr;
processUnlock(); processUnlock();


delete plugin; delete plugin;
m_carlaPlugins[id] = nullptr;
m_uniqueNames[id] = nullptr;


#ifndef BUILD_BRIDGE #ifndef BUILD_BRIDGE
osc_send_control_remove_plugin(id); osc_send_control_remove_plugin(id);


+ 40
- 9
c++/carla-backend/carla_engine_jack.cpp View File

@@ -271,13 +271,21 @@ protected:
{ {
CarlaPlugin* const plugin = getPluginUnchecked(i); CarlaPlugin* const plugin = getPluginUnchecked(i);


if (plugin && plugin->enabled())
if (! plugin)
continue;

plugin->engineProcessLock();

if (plugin->enabled())
{ {
plugin->engineProcessLock();
plugin->initBuffers(); plugin->initBuffers();
processPlugin(plugin, nframes); processPlugin(plugin, nframes);
plugin->engineProcessUnlock();
} }
else
processPluginNOT(plugin, nframes);

plugin->engineProcessUnlock();

} }
} }
else if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) else if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK)
@@ -450,13 +458,20 @@ protected:
#else #else
CarlaPlugin* const plugin = getPluginUnchecked(0); CarlaPlugin* const plugin = getPluginUnchecked(0);


if (plugin && plugin->enabled())
if (! plugin)
return;

plugin->engineProcessLock();

if (plugin->enabled())
{ {
plugin->engineProcessLock();
plugin->initBuffers(); plugin->initBuffers();
processPlugin(plugin, nframes); processPlugin(plugin, nframes);
plugin->engineProcessUnlock();
} }
else
processPluginNOT(plugin, nframes);

plugin->engineProcessUnlock();
#endif #endif
} }


@@ -545,6 +560,15 @@ private:
p->process(inBuffer, outBuffer, nframes); p->process(inBuffer, outBuffer, nframes);
} }


static void processPluginNOT(CarlaPlugin* const p, const uint32_t nframes)
{
for (uint32_t i=0; i < p->aIn.count; i++)
zeroF(p->aIn.ports[i]->getJackAudioBuffer(nframes), nframes);

for (uint32_t i=0; i < p->aOut.count; i++)
zeroF(p->aOut.ports[i]->getJackAudioBuffer(nframes), nframes);
}

static void latencyPlugin(CarlaPlugin* const p) static void latencyPlugin(CarlaPlugin* const p)
{ {
for (uint32_t i=0; i < p->aIn.count; i++) for (uint32_t i=0; i < p->aIn.count; i++)
@@ -593,13 +617,20 @@ private:
{ {
CarlaPlugin* const plugin = (CarlaPlugin*)arg; CarlaPlugin* const plugin = (CarlaPlugin*)arg;


if (plugin && plugin->enabled())
if (! plugin)
return 0;

plugin->engineProcessLock();

if (plugin->enabled())
{ {
plugin->engineProcessLock();
plugin->initBuffers(); plugin->initBuffers();
processPlugin(plugin, nframes); processPlugin(plugin, nframes);
plugin->engineProcessUnlock();
} }
else
processPluginNOT(plugin, nframes);

plugin->engineProcessUnlock();


return 0; return 0;
} }


Loading…
Cancel
Save