summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2016-05-08 12:15:10 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2016-05-08 12:17:16 +0200
commit8ec32c94e0d8161120018170724d64d262bc133d (patch)
tree62b4a6d97519fdd936ec0c782407ba09a06d52cd /src
parent32332a63ac9a80750b89452490830e042518797a (diff)
Make Resamplers container class.
Diffstat (limited to 'src')
-rw-r--r--src/chresampler.cc18
-rw-r--r--src/chresampler.h62
-rw-r--r--src/drumgizmo.cc28
-rw-r--r--src/drumgizmo.h2
-rw-r--r--src/drumkitloader.cc11
-rw-r--r--src/drumkitloader.h4
6 files changed, 77 insertions, 48 deletions
diff --git a/src/chresampler.cc b/src/chresampler.cc
index d759d78..c8323de 100644
--- a/src/chresampler.cc
+++ b/src/chresampler.cc
@@ -104,7 +104,7 @@ CHResampler::~CHResampler()
#endif
}
-void CHResampler::setInputSamples(float* samples, size_t count)
+void CHResampler::setInputSamples(float* samples, std::size_t count)
{
#if defined(USE_ZITA)
prv->zita.inp_data = samples;
@@ -115,7 +115,7 @@ void CHResampler::setInputSamples(float* samples, size_t count)
#endif
}
-void CHResampler::setOutputSamples(float* samples, size_t count)
+void CHResampler::setOutputSamples(float* samples, std::size_t count)
{
#if defined(USE_ZITA)
prv->zita.out_data = samples;
@@ -139,7 +139,7 @@ void CHResampler::process()
#endif
}
-size_t CHResampler::getInputSampleCount() const
+std::size_t CHResampler::getInputSampleCount() const
{
#if defined(USE_ZITA)
return prv->zita.inp_count;
@@ -148,7 +148,7 @@ size_t CHResampler::getInputSampleCount() const
#endif
}
-size_t CHResampler::getOutputSampleCount() const
+std::size_t CHResampler::getOutputSampleCount() const
{
#if defined(USE_ZITA)
return prv->zita.out_count;
@@ -165,19 +165,19 @@ double CHResampler::getRatio() const
#else
// Dummy implementation
-CHResampler::CHResampler() {}
+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*, std::size_t) {}
+void CHResampler::setOutputSamples(float*, std::size_t) {}
void CHResampler::process() {}
-size_t CHResampler::getInputSampleCount() const
+std::size_t CHResampler::getInputSampleCount() const
{
return 0;
}
-size_t CHResampler::getOutputSampleCount() const
+std::size_t CHResampler::getOutputSampleCount() const
{
return 0;
}
diff --git a/src/chresampler.h b/src/chresampler.h
index bbe2521..4148aee 100644
--- a/src/chresampler.h
+++ b/src/chresampler.h
@@ -27,16 +27,14 @@
#pragma once
#include <memory>
-#include <stdlib.h>
#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.
- */
+//! 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:
@@ -45,13 +43,13 @@ public:
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, std::size_t count);
+ void setOutputSamples(float* samples, std::size_t count);
void process();
- size_t getInputSampleCount() const;
- size_t getOutputSampleCount() const;
+ std::size_t getInputSampleCount() const;
+ std::size_t getOutputSampleCount() const;
double getRatio() const;
@@ -60,7 +58,43 @@ private:
class Prv;
std::unique_ptr<Prv> prv;
- double input_fs{44100};
- double output_fs{44100};
+ 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::array<CHResampler, 64> resamplers;
+};
diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc
index 893b536..1ccefc5 100644
--- a/src/drumgizmo.cc
+++ b/src/drumgizmo.cc
@@ -50,7 +50,7 @@
DrumGizmo::DrumGizmo(Settings& settings,
AudioOutputEngine *o, AudioInputEngine *i)
- : loader(settings, kit, *i, resampler)
+ : loader(settings, kit, *i, resamplers)
, oe(o)
, ie(i)
, kit()
@@ -87,7 +87,7 @@ bool DrumGizmo::init()
void DrumGizmo::setFrameSize(size_t framesize)
{
// If we are resampling override the frame size.
- if(resampler[0].getRatio() != 1)
+ if(resamplers.isActive())
{
framesize = RESAMPLER_INPUT_BUFFER;
}
@@ -154,7 +154,7 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)
ie->run(pos, nsamples, events);
- double resample_ratio = resampler[0].getRatio();
+ double resample_ratio = resamplers.getRatio();
bool active_events_left = input_processor.process(events, pos, resample_ratio);
if(!active_events_left)
@@ -168,7 +168,7 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)
//
#ifdef WITH_RESAMPLER
if((settings.enable_resampling.load() == false) ||
- (resampler[0].getRatio() == 1.0)) // No resampling needed
+ (!resamplers.isActive())) // No resampling needed
{
#endif
for(size_t c = 0; c < kit.channels.size(); ++c)
@@ -209,27 +209,27 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)
// Prepare output buffer
for(size_t c = 0; c < kit.channels.size(); ++c)
{
- resampler[c].setOutputSamples(resampler_output_buffer[c], nsamples);
+ resamplers[c].setOutputSamples(resampler_output_buffer[c], nsamples);
}
// Process channel data
- size_t kitpos = pos * resampler[0].getRatio();
+ size_t kitpos = pos * resamplers.getRatio();
size_t insize = sizeof(resampler_input_buffer[0]) / sizeof(sample_t);
- while(resampler[0].getOutputSampleCount() > 0)
+ while(resamplers.getOutputSampleCount() > 0)
{
for(size_t c = 0; c < kit.channels.size(); ++c)
{
- if(resampler[c].getInputSampleCount() == 0)
+ if(resamplers[c].getInputSampleCount() == 0)
{
sample_t *sin = resampler_input_buffer[c];
memset(resampler_input_buffer[c], 0,
sizeof(resampler_input_buffer[c]));
getSamples(c, kitpos, sin, insize);
- resampler[c].setInputSamples(sin, insize);
+ resamplers[c].setInputSamples(sin, insize);
}
- resampler[c].process();
+ resamplers[c].process();
}
kitpos += insize;
}
@@ -413,11 +413,9 @@ void DrumGizmo::setSamplerate(int samplerate)
DEBUG(dgeditor, "%s samplerate: %d\n", __PRETTY_FUNCTION__, samplerate);
settings.samplerate.store(samplerate);
#ifdef WITH_RESAMPLER
- for(auto& chresampler: resampler)
- {
- chresampler.setup(kit.getSamplerate(), settings.samplerate.load());
- }
- if(resampler[0].getRatio() != 1)
+ resamplers.setup(kit.getSamplerate(), settings.samplerate.load());
+
+ if(resamplers.isActive())
{
setFrameSize(RESAMPLER_INPUT_BUFFER);
}
diff --git a/src/drumgizmo.h b/src/drumgizmo.h
index eb89050..e25db2f 100644
--- a/src/drumgizmo.h
+++ b/src/drumgizmo.h
@@ -85,7 +85,7 @@ protected:
std::list< Event* > activeevents[MAX_NUM_CHANNELS];
- std::array<CHResampler, MAX_NUM_CHANNELS> resampler;
+ Resamplers resamplers;
sample_t resampler_output_buffer[MAX_NUM_CHANNELS][RESAMPLER_OUTPUT_BUFFER];
sample_t resampler_input_buffer[MAX_NUM_CHANNELS][RESAMPLER_INPUT_BUFFER];
diff --git a/src/drumkitloader.cc b/src/drumkitloader.cc
index ec86e77..a08fc0a 100644
--- a/src/drumkitloader.cc
+++ b/src/drumkitloader.cc
@@ -36,12 +36,12 @@
DrumKitLoader::DrumKitLoader(Settings& settings, DrumKit& kit,
AudioInputEngine& ie,
- std::array<CHResampler, 64>& resampler)
+ Resamplers& resamplers)
: settings(settings)
, getter(settings)
, kit(kit)
, ie(ie)
- , resampler(resampler)
+ , resamplers(resamplers)
{
run();
run_semaphore.wait(); // Wait for the thread to actually start.
@@ -99,10 +99,7 @@ bool DrumKitLoader::loadkit(const std::string& file)
loadKit(&kit);
#ifdef WITH_RESAMPLER
- for(auto& chresampler: resampler)
- {
- chresampler.setup(kit.getSamplerate(), settings.samplerate.load());
- }
+ resamplers.setup(kit.getSamplerate(), settings.samplerate.load());
#endif/*WITH_RESAMPLER*/
@@ -234,7 +231,7 @@ void DrumKitLoader::thread_main()
}
// Note: Remove this line to enable diskstreaming
- preload_size = ALL_SAMPLES;
+ //preload_size = ALL_SAMPLES;
audiofile->load(preload_size);
}
diff --git a/src/drumkitloader.h b/src/drumkitloader.h
index 01b4f06..f99f439 100644
--- a/src/drumkitloader.h
+++ b/src/drumkitloader.h
@@ -51,7 +51,7 @@ class DrumKitLoader
public:
//! The constrcutor starts the loader thread.
DrumKitLoader(Settings& settings, DrumKit& kit, AudioInputEngine& ie,
- std::array<CHResampler, 64>& resampler);
+ Resamplers& resamplers);
//! The destructor signals the thread to stop and waits to merge before
//! returning (ie. deleting the object will garantuee that the thread has
@@ -89,6 +89,6 @@ protected:
SettingsGetter getter;
DrumKit& kit;
AudioInputEngine& ie;
- std::array<CHResampler, 64>& resampler;
+ Resamplers& resamplers;
MemChecker memchecker;
};