From bc35d8c71b92dfb5f56a6d2f7a870812da994db6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= <cgloeckner@freenet.de>
Date: Tue, 29 Mar 2016 11:09:12 +0200
Subject: Refactored class CHResampler

---
 src/chresampler.cc | 138 ++++++++++++++++++++++++++++++-----------------------
 src/chresampler.h  |  36 +++++++-------
 src/drumgizmo.cc   |  10 ++--
 3 files changed, 100 insertions(+), 84 deletions(-)

(limited to 'src')

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);
 	}
-- 
cgit v1.2.3