add a convenient lua forward mapped buffers method
authorRobin Gareus <robin@gareus.org>
Mon, 11 Jul 2016 20:36:00 +0000 (22:36 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 11 Jul 2016 20:36:00 +0000 (22:36 +0200)
libs/ardour/ardour/dsp_filter.h
libs/ardour/dsp_filter.cc
libs/ardour/luabindings.cc
scripts/rawmidi.lua

index 50fe1ff704f440c415ff6548cba8377630f8682c..62998f916dfbd9169f0508767124323eacb05fd8 100644 (file)
 #include <glib.h>
 #include <glibmm.h>
 #include <fftw3.h>
+
+#include "ardour/buffer_set.h"
+#include "ardour/chan_mapping.h"
 #include "ardour/libardour_visibility.h"
+#include "ardour/types.h"
 
 namespace ARDOUR { namespace DSP {
 
@@ -159,6 +163,12 @@ namespace ARDOUR { namespace DSP {
         */
        float log_meter_coeff (float coeff);
 
+       void process_map (BufferSet* bufs,
+                         const ChanMapping& in,
+                         const ChanMapping& out,
+                         pframes_t nframes, framecnt_t offset,
+                         const DataType&);
+
        /** 1st order Low Pass filter */
        class LIBARDOUR_API LowPass {
                public:
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)
index de46eb607b4006a0cb4dcd6603bafa0c9514d694..5174078cc133fcef95566e86f939f2249a07c21d 100644 (file)
@@ -1343,6 +1343,7 @@ LuaBindings::dsp (lua_State* L)
                .addFunction ("mmult", &DSP::mmult)
                .addFunction ("log_meter", &DSP::log_meter)
                .addFunction ("log_meter_coeff", &DSP::log_meter_coeff)
+               .addFunction ("process_map", &DSP::process_map)
                .addRefFunction ("peaks", &DSP::peaks)
 
                .beginClass <DSP::LowPass> ("LowPass")
index 81f67f736d9548075fe84317f7b381cee992fbf1..9791fcbe957e7f87e036b3a7df9643ac2bd38cc6 100644 (file)
@@ -46,8 +46,24 @@ function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
        -- The following code is needed with "dsp_runmap" to work for arbitrary pin connections
        -- this passes though all audio/midi data unprocessed.
 
-       local audio_ins = in_map:count (): n_audio () -- number of audio input buffers
-       local audio_outs = out_map:count (): n_audio () -- number of audio output buffers
+       ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("audio"))
+       ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("midi"))
+
+       -- equivalent lua code.
+       -- NOTE: the lua implementation below is intended for io-config [-1,-1].
+       -- It only works for actually mapped channels due to in_map:count() out_map:count()
+       -- being identical to the i/o pin count in this case.
+       --
+       -- Plugins that have multiple possible configurations will need to implement
+       -- dsp_configure() and remember the actual channel count.
+       --
+       -- ARDOUR.DSP.process_map() does iterate over the mapping itself and works generally.
+       -- Still the lua code below does lend itself as elaborate example.
+       --
+       --[[
+
+       local audio_ins = in_map:count (): n_audio () -- number of mapped audio input buffers
+       local audio_outs = out_map:count (): n_audio () -- number of mapped audio output buffers
        assert (audio_outs, audio_ins) -- ioconfig [-1, -1]: must match
 
        -- copy audio data if any
@@ -94,4 +110,5 @@ function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
                        bufs:get_midi (ob):silence (n_samples, offset)
                end
        end
+       --]]
 end