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.  | 
