From: Robin Gareus Date: Mon, 11 Jul 2016 20:36:00 +0000 (+0200) Subject: add a convenient lua forward mapped buffers method X-Git-Tag: 5.0-pre1~181 X-Git-Url: https://main.carlh.net/gitweb/?p=ardour.git;a=commitdiff_plain;h=57df370e2abf175c3141a2e904758bfd3f95e114 add a convenient lua forward mapped buffers method --- 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 #include #include + +#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 #include #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 ("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