X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Faudio_filter.cc;h=96af75674cc1369d72f781b25078e5761ad2d495;hp=10f3849dffa3aa271b9521b14c4af24d9f1533e0;hb=da44da6f31f97d39ca91c35955e573e76371f2c2;hpb=6495409c098a1a295f344b30a0fb65d090513091 diff --git a/src/lib/audio_filter.cc b/src/lib/audio_filter.cc index 10f3849df..96af75674 100644 --- a/src/lib/audio_filter.cc +++ b/src/lib/audio_filter.cc @@ -1,34 +1,40 @@ /* - Copyright (C) 2014 Carl Hetherington + Copyright (C) 2014-2021 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ + #include "audio_filter.h" #include "audio_buffers.h" +#include "util.h" #include -using std::vector; + +using std::make_shared; using std::min; -using boost::shared_ptr; +using std::shared_ptr; -vector + +std::vector AudioFilter::sinc_blackman (float cutoff, bool invert) const { - vector ir (_M + 1); + auto ir = std::vector(); + ir.reserve(_M + 1); /* Impulse response */ @@ -66,46 +72,55 @@ AudioFilter::sinc_blackman (float cutoff, bool invert) const return ir; } + shared_ptr AudioFilter::run (shared_ptr in) { - shared_ptr out (new AudioBuffers (in->channels(), in->frames())); + auto out = make_shared(in->channels(), in->frames()); if (!_tail) { _tail.reset (new AudioBuffers (in->channels(), _M + 1)); _tail->make_silent (); } - for (int i = 0; i < in->channels(); ++i) { - for (int j = 0; j < in->frames(); ++j) { + int const channels = in->channels (); + int const frames = in->frames (); + + for (int i = 0; i < channels; ++i) { + auto tail_p = _tail->data (i); + auto in_p = in->data (i); + auto out_p = out->data (i); + for (int j = 0; j < frames; ++j) { float s = 0; for (int k = 0; k <= _M; ++k) { if ((j - k) < 0) { - s += _tail->data(i)[j - k + _M + 1] * _ir[k]; + s += tail_p[j - k + _M + 1] * _ir[k]; } else { - s += in->data(i)[j - k] * _ir[k]; + s += in_p[j - k] * _ir[k]; } } - out->data(i)[j] = s; + out_p[j] = s; } } int const amount = min (in->frames(), _tail->frames()); if (amount < _tail->frames ()) { - _tail->move (amount, 0, _tail->frames() - amount); + _tail->move (_tail->frames() - amount, amount, 0); } _tail->copy_from (in.get(), amount, in->frames() - amount, _tail->frames () - amount); return out; } + void AudioFilter::flush () { _tail.reset (); } + LowPassAudioFilter::LowPassAudioFilter (float transition_bandwidth, float cutoff) : AudioFilter (transition_bandwidth) { @@ -119,13 +134,14 @@ HighPassAudioFilter::HighPassAudioFilter (float transition_bandwidth, float cuto _ir = sinc_blackman (cutoff, true); } + BandPassAudioFilter::BandPassAudioFilter (float transition_bandwidth, float lower, float higher) : AudioFilter (transition_bandwidth) { - vector lpf = sinc_blackman (lower, false); - vector hpf = sinc_blackman (higher, true); + auto lpf = sinc_blackman (lower, false); + auto hpf = sinc_blackman (higher, true); - _ir.resize (_M + 1); + _ir.reserve (_M + 1); for (int i = 0; i <= _M; ++i) { _ir[i] = lpf[i] + hpf[i]; }