add a convenient lua forward mapped buffers method
This commit is contained in:
parent
4537f5fb20
commit
57df370e2a
@ -25,7 +25,11 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <glibmm.h>
|
#include <glibmm.h>
|
||||||
#include <fftw3.h>
|
#include <fftw3.h>
|
||||||
|
|
||||||
|
#include "ardour/buffer_set.h"
|
||||||
|
#include "ardour/chan_mapping.h"
|
||||||
#include "ardour/libardour_visibility.h"
|
#include "ardour/libardour_visibility.h"
|
||||||
|
#include "ardour/types.h"
|
||||||
|
|
||||||
namespace ARDOUR { namespace DSP {
|
namespace ARDOUR { namespace DSP {
|
||||||
|
|
||||||
@ -159,6 +163,12 @@ namespace ARDOUR { namespace DSP {
|
|||||||
*/
|
*/
|
||||||
float log_meter_coeff (float coeff);
|
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 */
|
/** 1st order Low Pass filter */
|
||||||
class LIBARDOUR_API LowPass {
|
class LIBARDOUR_API LowPass {
|
||||||
public:
|
public:
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "ardour/dB.h"
|
#include "ardour/dB.h"
|
||||||
|
#include "ardour/buffer.h"
|
||||||
#include "ardour/dsp_filter.h"
|
#include "ardour/dsp_filter.h"
|
||||||
|
|
||||||
#ifdef COMPILER_MSVC
|
#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)
|
LowPass::LowPass (double samplerate, float freq)
|
||||||
: _rate (samplerate)
|
: _rate (samplerate)
|
||||||
, _z (0)
|
, _z (0)
|
||||||
|
@ -1343,6 +1343,7 @@ LuaBindings::dsp (lua_State* L)
|
|||||||
.addFunction ("mmult", &DSP::mmult)
|
.addFunction ("mmult", &DSP::mmult)
|
||||||
.addFunction ("log_meter", &DSP::log_meter)
|
.addFunction ("log_meter", &DSP::log_meter)
|
||||||
.addFunction ("log_meter_coeff", &DSP::log_meter_coeff)
|
.addFunction ("log_meter_coeff", &DSP::log_meter_coeff)
|
||||||
|
.addFunction ("process_map", &DSP::process_map)
|
||||||
.addRefFunction ("peaks", &DSP::peaks)
|
.addRefFunction ("peaks", &DSP::peaks)
|
||||||
|
|
||||||
.beginClass <DSP::LowPass> ("LowPass")
|
.beginClass <DSP::LowPass> ("LowPass")
|
||||||
|
@ -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
|
-- The following code is needed with "dsp_runmap" to work for arbitrary pin connections
|
||||||
-- this passes though all audio/midi data unprocessed.
|
-- this passes though all audio/midi data unprocessed.
|
||||||
|
|
||||||
local audio_ins = in_map:count (): n_audio () -- number of audio input buffers
|
ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("audio"))
|
||||||
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 ("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
|
assert (audio_outs, audio_ins) -- ioconfig [-1, -1]: must match
|
||||||
|
|
||||||
-- copy audio data if any
|
-- 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)
|
bufs:get_midi (ob):silence (n_samples, offset)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
--]]
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user