add a convenient lua forward mapped buffers method
[ardour.git] / libs / ardour / dsp_filter.cc
index d39d03b9b9946648d6d7054537cfa77dbf046a45..7470a583d385cab4162d86bb0d9821e243985020 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <cmath>
 #include "ardour/dB.h"
+#include "ardour/buffer.h"
 #include "ardour/dsp_filter.h"
 
 #ifdef COMPILER_MSVC
@@ -73,6 +74,35 @@ ARDOUR::DSP::peaks (float *data, float &min, float &max, uint32_t n_samples) {
        }
 }
 
+void
+ARDOUR::DSP::process_map (BufferSet* bufs, const ChanMapping& in, const ChanMapping& out, pframes_t nframes, framecnt_t offset, const DataType& dt)
+{
+       const ChanMapping::Mappings& im (in.mappings());
+       const ChanMapping::Mappings& om (out.mappings());
+
+       for (ChanMapping::Mappings::const_iterator tm = im.begin(); tm != im.end(); ++tm) {
+               if (tm->first != dt) { continue; }
+               for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+                       bool valid;
+                       const uint32_t idx = out.get (dt, i->second, &valid);
+                       if (valid && idx != i->first) {
+                               bufs->get (dt, idx).read_from (bufs->get (dt, i->first), nframes, offset, offset);
+                       }
+               }
+       }
+       for (ChanMapping::Mappings::const_iterator tm = im.begin(); tm != im.end(); ++tm) {
+               if (tm->first != dt) { continue; }
+               for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+                       bool valid;
+                       in.get_src (dt, i->first, &valid);
+                       if (!valid) {
+                               bufs->get (dt, i->second).silence (nframes, offset);
+                       }
+               }
+       }
+
+}
+
 LowPass::LowPass (double samplerate, float freq)
        : _rate (samplerate)
        , _z (0)