diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2018-08-08 17:52:46 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2018-08-08 17:52:46 +0200 |
commit | 8fac5fb3ac631f430e8181f7fb471faf7ebbb76a (patch) | |
tree | 1527a3883d7fb996cabcde1708ad0c312240645a /src | |
parent | 400959b536180cf8912f06dd80b4de077d8f8c74 (diff) |
Remove old CHReampler class.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/chresampler.cc | 220 | ||||
-rw-r--r-- | src/chresampler.h | 107 | ||||
-rw-r--r-- | src/drumgizmo.cc | 14 | ||||
-rw-r--r-- | src/drumgizmo.h | 8 | ||||
-rw-r--r-- | src/drumkitloader.h | 2 | ||||
-rw-r--r-- | src/settings.h | 2 |
7 files changed, 17 insertions, 342 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 4d9441a..3c58382 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,11 +3,11 @@ noinst_LTLIBRARIES = libdg.la libdg_la_CPPFLAGS = \ -I$(top_srcdir)/include -I$(top_srcdir)/hugin \ $(SSEFLAGS) \ - $(ZITA_CPPFLAGS) $(SNDFILE_CFLAGS) $(EXPAT_CFLAGS) $(SAMPLERATE_CFLAGS) \ + $(ZITA_CPPFLAGS) $(SNDFILE_CFLAGS) $(EXPAT_CFLAGS) \ $(PTHREAD_CFLAGS) libdg_la_LIBADD = \ - $(ZITA_LIBS) $(SNDFILE_LIBS) $(EXPAT_LIBS) $(SAMPLERATE_LIBS) \ + $(ZITA_LIBS) $(SNDFILE_LIBS) $(EXPAT_LIBS) \ $(PTHREAD_LIBS) # If you add a file here, remember to add it to plugin/Makefile.mingw32.in @@ -21,7 +21,6 @@ nodist_libdg_la_SOURCES = \ bytesizeparser.cc \ channel.cc \ channelmixer.cc \ - chresampler.cc \ configfile.cc \ configparser.cc \ drumgizmo.cc \ @@ -61,7 +60,6 @@ EXTRA_DIST = \ bytesizeparser.h \ channel.h \ channelmixer.h \ - chresampler.h \ configfile.h \ configparser.h \ cpp11fix.h \ diff --git a/src/chresampler.cc b/src/chresampler.cc deleted file mode 100644 index 94737c6..0000000 --- a/src/chresampler.cc +++ /dev/null @@ -1,220 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * chresampler.cc - * - * Tue Sep 23 20:42:14 CEST 2014 - * Copyright 2014 Bent Bisballe Nyeng - * deva@aasimon.org - ****************************************************************************/ - -/* - * This file is part of DrumGizmo. - * - * DrumGizmo is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * DrumGizmo 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with DrumGizmo; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ -#include "chresampler.h" -#include "cpp11fix.h" - -#include <config.h> -#include <hugin.hpp> -#include <stdio.h> - -#ifdef WITH_RESAMPLER - -#if defined(USE_ZITA) -#include <zita-resampler/resampler.h> -#elif defined(USE_SRC) -#include <samplerate.h> -#else -#error "No resampler selected" -#endif - -class CHResampler::Prv -{ -public: -#if defined(USE_ZITA) - Resampler zita; -#elif defined(USE_SRC) - SRC_STATE* state; - SRC_DATA data; -#endif -}; - -CHResampler::CHResampler() - : prv{std::make_unique<Prv>()} -{ -#if defined(SRC) - prv->state = nullptr; -#endif -} - -void CHResampler::setup(double input_fs, double output_fs) -{ - if((input_fs == 0.0) || (output_fs == 0.0)) - { - return; - } - - int nchan = 1; // always mono - - this->input_fs = input_fs; - this->output_fs = output_fs; - -#if defined(USE_ZITA) - DEBUG(resampler, "Using zita-resampler (%d -> %d)", (int)input_fs, - (int)output_fs); - - // delay is 2 * hlen, 72 corresponds to delay introduced by SRC. - int hlen = 72; // 16 ≤ hlen ≤ 96 - - prv->zita.reset(); - prv->zita.setup(input_fs, output_fs, nchan, hlen); - - std::size_t null_size = prv->zita.inpsize() / 2 - 1; - prv->zita.inp_data = nullptr; - prv->zita.inp_count = null_size; - - prv->zita.out_data = nullptr; - prv->zita.out_count = 1024 * 1024; - - prv->zita.process(); -#elif defined(USE_SRC) - DEBUG(resampler, "Using libsamplerate (%d -> %d)", (int)input_fs, - (int)output_fs); - - int err; - prv->state = src_new(SRC_SINC_BEST_QUALITY, nchan, &err); - (void)err; - // printf("err: %d\n", err); - src_set_ratio(prv->state, output_fs / input_fs); - prv->data.src_ratio = output_fs / input_fs; - prv->data.end_of_input = 0; -#endif -} - -CHResampler::~CHResampler() -{ -#if defined(USE_ZITA) -#elif defined(USE_SRC) - if(prv->state) - { - src_delete(prv->state); - } -#endif -} - -void CHResampler::setInputSamples(float* samples, std::size_t count) -{ -#if defined(USE_ZITA) - prv->zita.inp_data = samples; - prv->zita.inp_count = count; -#elif defined(USE_SRC) - prv->data.data_in = samples; - prv->data.input_frames = count; -#endif -} - -void CHResampler::setOutputSamples(float* samples, std::size_t count) -{ -#if defined(USE_ZITA) - prv->zita.out_data = samples; - prv->zita.out_count = count; -#elif defined(USE_SRC) - prv->data.data_out = samples; - prv->data.output_frames = count; -#endif -} - -void CHResampler::process() -{ -#if defined(USE_ZITA) - prv->zita.process(); -#elif defined(USE_SRC) - src_process(prv->state, &prv->data); - prv->data.output_frames -= prv->data.output_frames_gen; - prv->data.data_out += prv->data.output_frames_gen; - prv->data.input_frames -= prv->data.input_frames_used; - prv->data.data_in += prv->data.input_frames_used; -#endif -} - -std::size_t CHResampler::getLatency() const -{ - if (input_fs == output_fs) - { - return 0; - } - -#if defined(USE_ZITA) - return 0; -#elif defined(USE_SRC) - return 0; // TODO? -#endif -} - -std::size_t CHResampler::getInputSampleCount() const -{ -#if defined(USE_ZITA) - return prv->zita.inp_count; -#elif defined(USE_SRC) - return prv->data.input_frames; -#endif -} - -std::size_t CHResampler::getOutputSampleCount() const -{ -#if defined(USE_ZITA) - return prv->zita.out_count; -#elif defined(USE_SRC) - return prv->data.output_frames; -#endif -} - -double CHResampler::getRatio() const -{ - return input_fs / output_fs; -} - -#else - -// Dummy implementation -CHResampler::CHResampler() {} -CHResampler::~CHResampler() {} -void CHResampler::setup(double, double) {} -void CHResampler::setInputSamples(float*, std::size_t) {} -void CHResampler::setOutputSamples(float*, std::size_t) {} -void CHResampler::process() {} - -std::size_t CHResampler::getLatency() const -{ - return 0; -} - -std::size_t CHResampler::getInputSampleCount() const -{ - return 0; -} - -std::size_t CHResampler::getOutputSampleCount() const -{ - return 0; -} - -double CHResampler::getRatio() const -{ - return 1; -} - -#endif /*WITH_RESAMPLER*/ diff --git a/src/chresampler.h b/src/chresampler.h deleted file mode 100644 index d21d1cb..0000000 --- a/src/chresampler.h +++ /dev/null @@ -1,107 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * chresampler.h - * - * Tue Sep 23 20:42:14 CEST 2014 - * Copyright 2014 Bent Bisballe Nyeng - * deva@aasimon.org - ****************************************************************************/ - -/* - * This file is part of DrumGizmo. - * - * DrumGizmo is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * DrumGizmo 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with DrumGizmo; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ -#pragma once - -#include <memory> -#include <config.h> -#include <array> - -//! Channel resampler class using either zita-resampler or secret rabbit code -//! (really!!) depending on the value of the WITH_RESAMPLER macro. -//! If WITH_RESAMPLER is unset the resampler is disabled entirely. -//! If WITH_RESAMPLER=="zita" zita-resampler will be used. -//! If WITH_RESAMPLER=="src" Secret Rabbit Code will be used. -class CHResampler -{ -public: - CHResampler(); - ~CHResampler(); - - void setup(double input_fs, double output_fs); - - void setInputSamples(float* samples, std::size_t count); - void setOutputSamples(float* samples, std::size_t count); - - void process(); - - std::size_t getLatency() const; - - std::size_t getInputSampleCount() const; - std::size_t getOutputSampleCount() const; - - double getRatio() const; - -#ifdef WITH_RESAMPLER -private: - class Prv; - std::unique_ptr<Prv> prv; - - double input_fs{44100.0}; - double output_fs{44100.0}; -#endif /*WITH_RESAMPLER*/ -}; - -//! Container class for the resampler array. -class Resamplers -{ -public: - void setup(double input_fs, double output_fs) - { - for(auto& resampler : resamplers) - { - resampler.setup(input_fs, output_fs); - } - } - - bool isActive() const - { - return getRatio() != 1.0; - } - - double getRatio() const - { - return resamplers[0].getRatio(); - } - - - CHResampler& operator[](std::size_t idx) - { - return resamplers[idx]; - } - - std::size_t getOutputSampleCount() const - { - return resamplers[0].getOutputSampleCount(); - } - - std::size_t getLatency() const - { - return resamplers[0].getLatency(); - } - - std::array<CHResampler, 64> resamplers; -}; diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index e7ebe5a..5048e35 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -201,10 +201,9 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples) zita[c].process(); } - std::memset(_resampler_input_buffer[c], 0, - sizeof(_resampler_input_buffer[c])); + std::memset(resampler_input_buffer[c].get(), 0, MAX_RESAMPLER_BUFFER_SIZE); - zita[c].inp_data = _resampler_input_buffer[c]; + zita[c].inp_data = resampler_input_buffer[c].get(); std::size_t sample_count = std::ceil((nsamples - (nsamples - zita[c].out_count)) * ratio); getSamples(c, kitpos, zita[c].inp_data, sample_count); @@ -409,11 +408,18 @@ void DrumGizmo::setSamplerate(float samplerate) // Notify input engine of the samplerate change. ie.setSampleRate(samplerate); - auto input_fs = kit.getSamplerate(); + auto input_fs = settings.drumkit_samplerate.load(); auto output_fs = samplerate; ratio = input_fs / output_fs; settings.resamplig_recommended.store(ratio != 1.0); + // TODO: Only reallocate the actual amount of samples needed based on the + // ratio and the framesize. + for(auto& buf : resampler_input_buffer) + { + buf.reset(new sample_t[MAX_RESAMPLER_BUFFER_SIZE]); + } + for(int c = 0; c < MAX_NUM_CHANNELS; ++c) { zita[c].reset(); diff --git a/src/drumgizmo.h b/src/drumgizmo.h index 2f74062..4592143 100644 --- a/src/drumgizmo.h +++ b/src/drumgizmo.h @@ -29,6 +29,7 @@ #include <string> #include <list> #include <array> +#include <memory> #include <zita-resampler/resampler.h> @@ -74,8 +75,7 @@ public: private: static constexpr int MAX_NUM_CHANNELS = 64; - static constexpr int RESAMPLER_OUTPUT_BUFFER = 4096; - static constexpr int RESAMPLER_INPUT_BUFFER = 2048;//64; + static constexpr int MAX_RESAMPLER_BUFFER_SIZE = 4096 * 8; protected: DrumKitLoader loader; @@ -101,8 +101,8 @@ protected: SettingsGetter settings_getter; Random rand; - Resampler zita[MAX_NUM_CHANNELS]; - sample_t _resampler_input_buffer[MAX_NUM_CHANNELS][4096 * 8]; + std::array<Resampler, MAX_NUM_CHANNELS> zita; + std::array<std::unique_ptr<sample_t>, MAX_NUM_CHANNELS> resampler_input_buffer; double ratio = 1.0; }; diff --git a/src/drumkitloader.h b/src/drumkitloader.h index 2758a98..d14a321 100644 --- a/src/drumkitloader.h +++ b/src/drumkitloader.h @@ -36,8 +36,6 @@ #include "drumkit.h" #include "settings.h" #include "audioinputengine.h" -#include "chresampler.h" -//#include "memchecker.h" #include "audiocache.h" //! This class is responsible for loading the drumkits in its own thread. diff --git a/src/settings.h b/src/settings.h index e698d20..5137809 100644 --- a/src/settings.h +++ b/src/settings.h @@ -51,7 +51,7 @@ struct Settings Atomic<std::string> drumkit_name{""}; Atomic<std::string> drumkit_description{""}; Atomic<std::string> drumkit_version{""}; - Atomic<std::size_t> drumkit_samplerate{0}; + Atomic<std::size_t> drumkit_samplerate{44100}; //! The maximum amount of memory in bytes that the AudioCache //! is allowed to use for preloading. Default is 1GB. |