diff options
author | Christian Glöckner <cgloeckner@freenet.de> | 2016-03-29 11:09:12 +0200 |
---|---|---|
committer | André Nusser <andre.nusser@googlemail.com> | 2016-03-31 17:35:47 +0200 |
commit | bc35d8c71b92dfb5f56a6d2f7a870812da994db6 (patch) | |
tree | 56fb21f591032151cab720d5c6407d4ce8028223 | |
parent | 94d33d51ee136d88a2d81bfce47efd2836e845d0 (diff) |
Refactored class CHResampler
-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); } |