fix crash when copy'ing latent plugins
[ardour.git] / libs / ardour / capturing_processor.cc
index 258363be734800db8c26bee0f9df99e7504812a1..b94288325068575eb346d8c9e17f0656de8ca2e2 100644 (file)
 #include "ardour/session.h"
 #include "ardour/audioengine.h"
 
+#include "pbd/i18n.h"
+
 namespace ARDOUR {
 
-CapturingProcessor::CapturingProcessor (Session & session)
+CapturingProcessor::CapturingProcessor (Session & session, framecnt_t latency)
        : Processor (session, X_("capture point"))
-       , block_size (session.engine().frames_per_cycle())
+       , block_size (AudioEngine::instance()->samples_per_cycle())
+       , _latency (latency)
 {
        realloc_buffers ();
 }
@@ -44,10 +47,16 @@ CapturingProcessor::set_block_size (pframes_t nframes)
 }
 
 void
-CapturingProcessor::run (BufferSet& bufs, framepos_t, framepos_t, pframes_t nframes, bool)
+CapturingProcessor::run (BufferSet& bufs, framepos_t, framepos_t, double, pframes_t nframes, bool)
 {
-       if (active()) {
-               capture_buffers.read_from (bufs, nframes);
+       if (!active()) {
+               _delaybuffers.flush ();
+               return;
+       }
+       for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+               for (uint32_t b = 0; b < bufs.count().get (*t); ++b) {
+                       _delaybuffers.delay (*t, b, capture_buffers.get (*t, b), bufs.get (*t, b), nframes, 0, 0);
+               }
        }
 }
 
@@ -55,12 +64,13 @@ bool
 CapturingProcessor::configure_io (ChanCount in, ChanCount out)
 {
        Processor::configure_io (in, out);
+       _delaybuffers.set (out, _latency);
        realloc_buffers();
        return true;
 }
 
 bool
-CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out) const
+CapturingProcessor::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
        out = in;
        return true;
@@ -70,6 +80,7 @@ void
 CapturingProcessor::realloc_buffers()
 {
        capture_buffers.ensure_buffers (_configured_input, block_size);
+       _delaybuffers.flush ();
 }
 
 XMLNode &
@@ -80,5 +91,5 @@ CapturingProcessor::state (bool full)
        node.add_property (X_("type"), X_("capture"));
        return node;
 }
-       
+
 } // namespace ARDOUR