summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Glöckner <cgloeckner@freenet.de>2016-03-29 11:09:12 +0200
committerAndré Nusser <andre.nusser@googlemail.com>2016-03-31 17:35:47 +0200
commitbc35d8c71b92dfb5f56a6d2f7a870812da994db6 (patch)
tree56fb21f591032151cab720d5c6407d4ce8028223
parent94d33d51ee136d88a2d81bfce47efd2836e845d0 (diff)
Refactored class CHResampler
-rw-r--r--src/chresampler.cc138
-rw-r--r--src/chresampler.h36
-rw-r--r--src/drumgizmo.cc10
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);
}