X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Faudio_filter.cc;h=96af75674cc1369d72f781b25078e5761ad2d495;hp=4203d074c148be49a25ee610e19c1b3574ebf9bd;hb=ac34066d5e448d1984d11a180be74e31b6e13b5c;hpb=5a5324ed3a381a86dfe0a6e3932c1d58fdcd596f diff --git a/src/lib/audio_filter.cc b/src/lib/audio_filter.cc index 4203d074c..96af75674 100644 --- a/src/lib/audio_filter.cc +++ b/src/lib/audio_filter.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014 Carl Hetherington + Copyright (C) 2014-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,20 +18,23 @@ */ + #include "audio_filter.h" #include "audio_buffers.h" -#include +#include "util.h" #include + +using std::make_shared; using std::min; -using boost::shared_ptr; -using boost::make_shared; +using std::shared_ptr; + -/** @return array of floats which the caller must destroy with delete[] */ -float * +std::vector AudioFilter::sinc_blackman (float cutoff, bool invert) const { - float* ir = new float[_M + 1]; + auto ir = std::vector(); + ir.reserve(_M + 1); /* Impulse response */ @@ -69,15 +72,11 @@ AudioFilter::sinc_blackman (float cutoff, bool invert) const return ir; } -AudioFilter::~AudioFilter () -{ - delete[] _ir; -} shared_ptr AudioFilter::run (shared_ptr in) { - shared_ptr out = make_shared (in->channels(), in->frames()); + auto out = make_shared(in->channels(), in->frames()); if (!_tail) { _tail.reset (new AudioBuffers (in->channels(), _M + 1)); @@ -88,9 +87,9 @@ AudioFilter::run (shared_ptr in) int const frames = in->frames (); for (int i = 0; i < channels; ++i) { - float* tail_p = _tail->data (i); - float* in_p = in->data (i); - float* out_p = out->data (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) { @@ -107,19 +106,21 @@ AudioFilter::run (shared_ptr in) 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) { @@ -133,21 +134,18 @@ HighPassAudioFilter::HighPassAudioFilter (float transition_bandwidth, float cuto _ir = sinc_blackman (cutoff, true); } + BandPassAudioFilter::BandPassAudioFilter (float transition_bandwidth, float lower, float higher) : AudioFilter (transition_bandwidth) { - float* lpf = sinc_blackman (lower, false); - float* hpf = sinc_blackman (higher, true); + auto lpf = sinc_blackman (lower, false); + auto hpf = sinc_blackman (higher, true); - delete[] _ir; - _ir = new float[_M + 1]; + _ir.reserve (_M + 1); for (int i = 0; i <= _M; ++i) { _ir[i] = lpf[i] + hpf[i]; } - delete[] lpf; - delete[] hpf; - /* We now have a band-stop, so invert for band-pass */ for (int i = 0; i <= _M; ++i) { _ir[i] = -_ir[i];