summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-07-11 22:36:00 +0200
committerRobin Gareus <robin@gareus.org>2016-07-11 22:36:00 +0200
commit57df370e2abf175c3141a2e904758bfd3f95e114 (patch)
tree9da57212aa569b7dc7f3de74c4c6d3af7acf3dcb
parent4537f5fb20b2f43394ef1b47aecfd320fce0c2bb (diff)
add a convenient lua forward mapped buffers method
-rw-r--r--libs/ardour/ardour/dsp_filter.h10
-rw-r--r--libs/ardour/dsp_filter.cc30
-rw-r--r--libs/ardour/luabindings.cc1
-rw-r--r--scripts/rawmidi.lua21
4 files changed, 60 insertions, 2 deletions
diff --git a/libs/ardour/ardour/dsp_filter.h b/libs/ardour/ardour/dsp_filter.h
index 50fe1ff704..62998f916d 100644
--- a/libs/ardour/ardour/dsp_filter.h
+++ b/libs/ardour/ardour/dsp_filter.h
@@ -25,7 +25,11 @@
#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:
diff --git a/libs/ardour/dsp_filter.cc b/libs/ardour/dsp_filter.cc
index d39d03b9b9..7470a583d3 100644
--- a/libs/ardour/dsp_filter.cc
+++ b/libs/ardour/dsp_filter.cc
@@ -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)
diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc
index de46eb607b..5174078cc1 100644
--- a/libs/ardour/luabindings.cc
+++ b/libs/ardour/luabindings.cc
@@ -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")
diff --git a/scripts/rawmidi.lua b/scripts/rawmidi.lua
index 81f67f736d..9791fcbe95 100644
--- a/scripts/rawmidi.lua
+++ b/scripts/rawmidi.lua
@@ -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