summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/dsp_filter.h10
-rw-r--r--libs/ardour/dsp_filter.cc30
-rw-r--r--libs/ardour/luabindings.cc1
3 files changed, 41 insertions, 0 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")