diff options
| -rw-r--r-- | src/chresampler.cc | 138 | ||||
| -rw-r--r-- | src/chresampler.h | 36 | ||||
| -rw-r--r-- | src/drumgizmo.cc | 10 | 
3 files changed, 100 insertions, 84 deletions
| diff --git a/src/chresampler.cc b/src/chresampler.cc index 414efc3..79118ae 100644 --- a/src/chresampler.cc +++ b/src/chresampler.cc @@ -30,60 +30,64 @@  #include <hugin.hpp>  #include <stdio.h> +#include <cpp11fix.h> +  #ifdef WITH_RESAMPLER  #if defined(USE_ZITA) -  #include <zita-resampler/resampler.h> +#include <zita-resampler/resampler.h>  #elif defined(USE_SRC) -  #include <samplerate.h> +#include <samplerate.h>  #else -  #error "No resampler selected" +#error "No resampler selected"  #endif -class CHResampler::Prv { +class CHResampler::Prv +{  public:  #if defined(USE_ZITA) -  Resampler zita; +	Resampler zita;  #elif defined(USE_SRC) -  SRC_STATE *state; -  SRC_DATA data; +	SRC_STATE* state; +	SRC_DATA data;  #endif  };  CHResampler::CHResampler() +    : prv{std::make_unique<Prv>()} +    , input_fs{44100} +    , output_fs{44100}  { -  input_fs = 44100; -  output_fs = 44100; - -  prv = new Prv();  #if defined(SRC) -  prv->state = NULL; +	prv->state = nullptr;  #endif  }  void CHResampler::setup(double input_fs, double output_fs)  { -  int nchan = 1; // always mono +	int nchan = 1; // always mono -  this->input_fs = input_fs; -  this->output_fs = output_fs; +	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); +	DEBUG(resampler, "Using zita-resampler (%d -> %d)", (int)input_fs, +	    (int)output_fs); -  int hlen = 72; // 16 ≤ hlen ≤ 96 -  // delay is 2 * hlen, 72 corresponds to delay introduced by SRC. -  prv->zita.setup(input_fs, output_fs, nchan, hlen); +	int hlen = 72; // 16 ≤ hlen ≤ 96 +	// delay is 2 * hlen, 72 corresponds to delay introduced by SRC. +	prv->zita.setup(input_fs, output_fs, nchan, hlen);  #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; +	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  } @@ -91,67 +95,69 @@ CHResampler::~CHResampler()  {  #if defined(USE_ZITA)  #elif defined(USE_SRC) -  if(prv->state) src_delete(prv->state); +	if(prv->state) +	{ +		src_delete(prv->state); +	}  #endif -  delete prv;  } -void CHResampler::setInputSamples(float *samples, size_t count) +void CHResampler::setInputSamples(float* samples, size_t count)  {  #if defined(USE_ZITA) -  prv->zita.inp_data = samples; -  prv->zita.inp_count = count; +	prv->zita.inp_data = samples; +	prv->zita.inp_count = count;  #elif defined(USE_SRC) -  prv->data.data_in = samples; -  prv->data.input_frames = count; +	prv->data.data_in = samples; +	prv->data.input_frames = count;  #endif  } -void CHResampler::setOutputSamples(float *samples, size_t count) +void CHResampler::setOutputSamples(float* samples, size_t count)  {  #if defined(USE_ZITA) -  prv->zita.out_data = samples; -  prv->zita.out_count = count; +	prv->zita.out_data = samples; +	prv->zita.out_count = count;  #elif defined(USE_SRC) -  prv->data.data_out = samples; -  prv->data.output_frames = count; +	prv->data.data_out = samples; +	prv->data.output_frames = count;  #endif  }  void CHResampler::process()  {  #if defined(USE_ZITA) -  prv->zita.process(); +	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; +	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  } -size_t CHResampler::getInputSampleCount() +size_t CHResampler::getInputSampleCount() const  {  #if defined(USE_ZITA) -  return prv->zita.inp_count; +	return prv->zita.inp_count;  #elif defined(USE_SRC) -  return prv->data.input_frames; +	return prv->data.input_frames;  #endif  } -size_t CHResampler::getOutputSampleCount() +size_t CHResampler::getOutputSampleCount() const  {  #if defined(USE_ZITA) -  return prv->zita.out_count; +	return prv->zita.out_count;  #elif defined(USE_SRC) -  return prv->data.output_frames; +	return prv->data.output_frames;  #endif  } -double CHResampler::ratio() +double CHResampler::getRatio() const  { -  return input_fs / output_fs; +	return input_fs / output_fs;  }  #else @@ -160,11 +166,23 @@ double CHResampler::ratio()  CHResampler::CHResampler() {}  CHResampler::~CHResampler() {}  void CHResampler::setup(double, double) {} -void CHResampler::setInputSamples(float *, size_t) {} -void CHResampler::setOutputSamples(float *, size_t) {} +void CHResampler::setInputSamples(float*, size_t) {} +void CHResampler::setOutputSamples(float*, size_t) {}  void CHResampler::process() {} -size_t CHResampler::getInputSampleCount() { return 0; } -size_t CHResampler::getOutputSampleCount() { return 0; } -double CHResampler::ratio() { return 1; } -#endif/*WITH_RESAMPLER*/ +size_t CHResampler::getInputSampleCount() +{ +	return 0; +} + +size_t CHResampler::getOutputSampleCount() +{ +	return 0; +} + +double CHResampler::getRatio() const +{ +	return 1; +} + +#endif /*WITH_RESAMPLER*/ diff --git a/src/chresampler.h b/src/chresampler.h index ae6cb3b..cd5d571 100644 --- a/src/chresampler.h +++ b/src/chresampler.h @@ -24,9 +24,9 @@   *  along with DrumGizmo; if not, write to the Free Software   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.   */ -#ifndef __DRUMGIZMO_CHRESAMPLER_H__ -#define __DRUMGIZMO_CHRESAMPLER_H__ +#pragma once +#include <memory>  #include <stdlib.h>  /** @@ -36,30 +36,28 @@   * If WITH_RESAMPLER=="zita" zita-resampler will be used.   * If WITH_RESAMPLER=="src" Secret Rabbit Code will be used.   */ -class CHResampler { +class CHResampler +{  public: -  CHResampler(); -  ~CHResampler(); +	CHResampler(); +	~CHResampler(); -  void setup(double input_fs, double output_fs); +	void setup(double input_fs, double output_fs); -  void setInputSamples(float *samples, size_t count); -  void setOutputSamples(float *samples, size_t count); +	void setInputSamples(float* samples, size_t count); +	void setOutputSamples(float* samples, size_t count); -  void process(); +	void process(); -  size_t getInputSampleCount(); -  size_t getOutputSampleCount(); +	size_t getInputSampleCount() const; +	size_t getOutputSampleCount() const; -  double ratio(); +	double getRatio() const;  private: -  class Prv; -  Prv *prv; +	class Prv; +	std::unique_ptr<Prv> prv; -  double input_fs; -  double output_fs; +	double input_fs; +	double output_fs;  }; - - -#endif/*__DRUMGIZMO_CHRESAMPLER_H__*/ diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index a3e5540..4ce45ba 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -201,7 +201,7 @@ void DrumGizmo::handleMessage(Message *msg)  void DrumGizmo::setFrameSize(size_t framesize)  {  	// If we are resampling override the frame size. -	if(resampler[0].ratio() != 1) +	if(resampler[0].getRatio() != 1)  	{  		framesize = RESAMPLER_INPUT_BUFFER;  	} @@ -359,7 +359,7 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)  				{  					//DEBUG(drumgizmo, "Adding event %d.\n", event.offset);  					Event *evt = new EventSample(ch.num, 1.0, af, i->group(), i); -					evt->offset = (event.offset + pos) * resampler[0].ratio(); +					evt->offset = (event.offset + pos) * resampler[0].getRatio();  					activeevents[ch.num].push_back(evt);  				}  				++j; @@ -399,7 +399,7 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)  	//  #ifdef WITH_RESAMPLER  	if((Conf::enable_resampling == false) || -	   (resampler[0].ratio() == 1.0)) // No resampling needed +	   (resampler[0].getRatio() == 1.0)) // No resampling needed  	{  #endif  		for(size_t c = 0; c < kit.channels.size(); ++c) @@ -444,7 +444,7 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)  		}  		// Process channel data -		size_t kitpos = pos * resampler[0].ratio(); +		size_t kitpos = pos * resampler[0].getRatio();  		size_t insize = sizeof(resampler_input_buffer[0]) / sizeof(sample_t);  		while(resampler[0].getOutputSampleCount() > 0) @@ -648,7 +648,7 @@ void DrumGizmo::setSamplerate(int samplerate)  	{  		resampler[i].setup(kit.samplerate(), Conf::samplerate);  	} -	if(resampler[0].ratio() != 1) +	if(resampler[0].getRatio() != 1)  	{  		setFrameSize(RESAMPLER_INPUT_BUFFER);  	} | 
