Use ::g_rename instead of ::rename in ARDOUR::FileSource class
[ardour.git] / libs / ardour / dsp_filter.cc
index 3b93c9c6f3e71cba0fd227d20b8f06f8e519e90b..d1aa6cd9aeca1d2cc0b9220e845dc7c45b653945 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
@@ -66,13 +67,42 @@ ARDOUR::DSP::log_meter_coeff (float coeff) {
 }
 
 void
-ARDOUR::DSP::peaks (float *data, float &min, float &max, uint32_t n_samples) {
+ARDOUR::DSP::peaks (const float *data, float &min, float &max, uint32_t n_samples) {
        for (uint32_t i = 0; i < n_samples; ++i) {
                if (data[i] < min) min = data[i];
                if (data[i] > max) max = data[i];
        }
 }
 
+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)
@@ -167,9 +197,9 @@ Biquad::configure (double a1, double a2, double b0, double b1, double b2)
 void
 Biquad::compute (Type type, double freq, double Q, double gain)
 {
-       if (Q <= .001)     { Q = 0.001; }
-       if (freq <= 1.)    { freq = 1.; }
-       if (freq >= _rate) { freq = _rate; }
+       if (Q <= .001)  { Q = 0.001; }
+       if (freq <= 1.) { freq = 1.; }
+       if (freq >= 0.4998 * _rate) { freq = 0.4998 * _rate; }
 
        /* Compute biquad filter settings.
         * Based on 'Cookbook formulae for audio EQ biquad filter coefficents'
@@ -390,7 +420,7 @@ FFTSpectrum::execute ()
 
 float
 FFTSpectrum::power_at_bin (const uint32_t b, const float norm) const {
-       assert (b >= 0 && b < _fft_data_size);
+       assert (b < _fft_data_size);
        const float a = _fft_power[b] * norm;
        return a > 1e-12 ? 10.0 * fast_log10 (a) : -INFINITY;
 }