align stem-export (raw track outputs (with and w/p processing)
authorRobin Gareus <robin@gareus.org>
Sun, 10 Jul 2016 00:40:24 +0000 (02:40 +0200)
committerRobin Gareus <robin@gareus.org>
Sun, 10 Jul 2016 01:21:29 +0000 (03:21 +0200)
libs/ardour/ardour/capturing_processor.h
libs/ardour/capturing_processor.cc
libs/ardour/route.cc

index b5cdc8739cbbdc62288256089dd39d4f734bb6e4..dccb7eb99e0ba1a93186099ab6a6b4c7fd7508f4 100644 (file)
 #ifndef __ardour_capturing_processor_h__
 #define __ardour_capturing_processor_h__
 
+#include "ardour/fixed_delay.h"
 #include "ardour/processor.h"
+#include "ardour/types.h"
 
 namespace ARDOUR {
 
 class LIBARDOUR_API CapturingProcessor : public Processor
 {
   public:
-       CapturingProcessor (Session & session);
+       CapturingProcessor (Session & session, framecnt_t latency);
        ~CapturingProcessor();
 
   public: // main interface
@@ -47,6 +49,8 @@ class LIBARDOUR_API CapturingProcessor : public Processor
 
        framecnt_t block_size;
        BufferSet capture_buffers;
+       FixedDelay _delaybuffers;
+       framecnt_t _latency;
 };
 
 } // namespace ARDOUR
index 755a00c4c4565c69da82929c8c7e928fc12baf35..8951bee4875b211d78e7714a47f2baa8124ab287 100644 (file)
 
 namespace ARDOUR {
 
-CapturingProcessor::CapturingProcessor (Session & session)
+CapturingProcessor::CapturingProcessor (Session & session, framecnt_t latency)
        : Processor (session, X_("capture point"))
        , block_size (AudioEngine::instance()->samples_per_cycle())
+       , _latency (latency)
 {
        realloc_buffers ();
 }
@@ -48,8 +49,14 @@ CapturingProcessor::set_block_size (pframes_t nframes)
 void
 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);
+               }
        }
 }
 
@@ -57,6 +64,7 @@ bool
 CapturingProcessor::configure_io (ChanCount in, ChanCount out)
 {
        Processor::configure_io (in, out);
+       _delaybuffers.set (out, _latency);
        realloc_buffers();
        return true;
 }
@@ -72,6 +80,7 @@ void
 CapturingProcessor::realloc_buffers()
 {
        capture_buffers.ensure_buffers (_configured_input, block_size);
+       _delaybuffers.flush ();
 }
 
 XMLNode &
index 56cd04d84a5166618aa1eb19ad9d86557107c3cb..fa564968edc3df5dc93c52ef146152cacea2aba2 100644 (file)
@@ -3716,7 +3716,9 @@ Route::add_export_point()
                Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
                Glib::Threads::RWLock::WriterLock lw (_processor_lock);
 
-               _capturing_processor.reset (new CapturingProcessor (_session));
+               // this aligns all tracks; but not tracks + busses
+               assert (_session.worst_track_latency () >= _initial_delay);
+               _capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
                _capturing_processor->activate ();
 
                configure_processors_unlocked (0, &lw);