diff --git a/c++/carla-backend/carla_engine.cpp b/c++/carla-backend/carla_engine.cpp index 3eb08cd..d29e02e 100644 --- a/c++/carla-backend/carla_engine.cpp +++ b/c++/carla-backend/carla_engine.cpp @@ -475,11 +475,11 @@ bool CarlaEngine::removePlugin(const unsigned short id) processLock(); plugin->setEnabled(false); + m_carlaPlugins[id] = nullptr; + m_uniqueNames[id] = nullptr; processUnlock(); delete plugin; - m_carlaPlugins[id] = nullptr; - m_uniqueNames[id] = nullptr; #ifndef BUILD_BRIDGE osc_send_control_remove_plugin(id); diff --git a/c++/carla-backend/carla_engine_jack.cpp b/c++/carla-backend/carla_engine_jack.cpp index a55e36f..52534c7 100644 --- a/c++/carla-backend/carla_engine_jack.cpp +++ b/c++/carla-backend/carla_engine_jack.cpp @@ -271,13 +271,21 @@ protected: { CarlaPlugin* const plugin = getPluginUnchecked(i); - if (plugin && plugin->enabled()) + if (! plugin) + continue; + + plugin->engineProcessLock(); + + if (plugin->enabled()) { - plugin->engineProcessLock(); plugin->initBuffers(); processPlugin(plugin, nframes); - plugin->engineProcessUnlock(); } + else + processPluginNOT(plugin, nframes); + + plugin->engineProcessUnlock(); + } } else if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) @@ -450,13 +458,20 @@ protected: #else CarlaPlugin* const plugin = getPluginUnchecked(0); - if (plugin && plugin->enabled()) + if (! plugin) + return; + + plugin->engineProcessLock(); + + if (plugin->enabled()) { - plugin->engineProcessLock(); plugin->initBuffers(); processPlugin(plugin, nframes); - plugin->engineProcessUnlock(); } + else + processPluginNOT(plugin, nframes); + + plugin->engineProcessUnlock(); #endif } @@ -545,6 +560,15 @@ private: 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) { for (uint32_t i=0; i < p->aIn.count; i++) @@ -593,13 +617,20 @@ private: { CarlaPlugin* const plugin = (CarlaPlugin*)arg; - if (plugin && plugin->enabled()) + if (! plugin) + return 0; + + plugin->engineProcessLock(); + + if (plugin->enabled()) { - plugin->engineProcessLock(); plugin->initBuffers(); processPlugin(plugin, nframes); - plugin->engineProcessUnlock(); } + else + processPluginNOT(plugin, nframes); + + plugin->engineProcessUnlock(); return 0; }