summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am6
-rw-r--r--src/chresampler.cc220
-rw-r--r--src/chresampler.h107
-rw-r--r--src/drumgizmo.cc14
-rw-r--r--src/drumgizmo.h8
-rw-r--r--src/drumkitloader.h2
-rw-r--r--src/settings.h2
7 files changed, 17 insertions, 342 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 4d9441a..3c58382 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,11 +3,11 @@ noinst_LTLIBRARIES = libdg.la
libdg_la_CPPFLAGS = \
-I$(top_srcdir)/include -I$(top_srcdir)/hugin \
$(SSEFLAGS) \
- $(ZITA_CPPFLAGS) $(SNDFILE_CFLAGS) $(EXPAT_CFLAGS) $(SAMPLERATE_CFLAGS) \
+ $(ZITA_CPPFLAGS) $(SNDFILE_CFLAGS) $(EXPAT_CFLAGS) \
$(PTHREAD_CFLAGS)
libdg_la_LIBADD = \
- $(ZITA_LIBS) $(SNDFILE_LIBS) $(EXPAT_LIBS) $(SAMPLERATE_LIBS) \
+ $(ZITA_LIBS) $(SNDFILE_LIBS) $(EXPAT_LIBS) \
$(PTHREAD_LIBS)
# If you add a file here, remember to add it to plugin/Makefile.mingw32.in
@@ -21,7 +21,6 @@ nodist_libdg_la_SOURCES = \
bytesizeparser.cc \
channel.cc \
channelmixer.cc \
- chresampler.cc \
configfile.cc \
configparser.cc \
drumgizmo.cc \
@@ -61,7 +60,6 @@ EXTRA_DIST = \
bytesizeparser.h \
channel.h \
channelmixer.h \
- chresampler.h \
configfile.h \
configparser.h \
cpp11fix.h \
diff --git a/src/chresampler.cc b/src/chresampler.cc
deleted file mode 100644
index 94737c6..0000000
--- a/src/chresampler.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- * chresampler.cc
- *
- * Tue Sep 23 20:42:14 CEST 2014
- * Copyright 2014 Bent Bisballe Nyeng
- * deva@aasimon.org
- ****************************************************************************/
-
-/*
- * This file is part of DrumGizmo.
- *
- * DrumGizmo is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * DrumGizmo is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with DrumGizmo; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-#include "chresampler.h"
-#include "cpp11fix.h"
-
-#include <config.h>
-#include <hugin.hpp>
-#include <stdio.h>
-
-#ifdef WITH_RESAMPLER
-
-#if defined(USE_ZITA)
-#include <zita-resampler/resampler.h>
-#elif defined(USE_SRC)
-#include <samplerate.h>
-#else
-#error "No resampler selected"
-#endif
-
-class CHResampler::Prv
-{
-public:
-#if defined(USE_ZITA)
- Resampler zita;
-#elif defined(USE_SRC)
- SRC_STATE* state;
- SRC_DATA data;
-#endif
-};
-
-CHResampler::CHResampler()
- : prv{std::make_unique<Prv>()}
-{
-#if defined(SRC)
- prv->state = nullptr;
-#endif
-}
-
-void CHResampler::setup(double input_fs, double output_fs)
-{
- if((input_fs == 0.0) || (output_fs == 0.0))
- {
- return;
- }
-
- int nchan = 1; // always mono
-
- 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);
-
- // delay is 2 * hlen, 72 corresponds to delay introduced by SRC.
- int hlen = 72; // 16 ≤ hlen ≤ 96
-
- prv->zita.reset();
- prv->zita.setup(input_fs, output_fs, nchan, hlen);
-
- std::size_t null_size = prv->zita.inpsize() / 2 - 1;
- prv->zita.inp_data = nullptr;
- prv->zita.inp_count = null_size;
-
- prv->zita.out_data = nullptr;
- prv->zita.out_count = 1024 * 1024;
-
- prv->zita.process();
-#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;
-#endif
-}
-
-CHResampler::~CHResampler()
-{
-#if defined(USE_ZITA)
-#elif defined(USE_SRC)
- if(prv->state)
- {
- src_delete(prv->state);
- }
-#endif
-}
-
-void CHResampler::setInputSamples(float* samples, std::size_t count)
-{
-#if defined(USE_ZITA)
- prv->zita.inp_data = samples;
- prv->zita.inp_count = count;
-#elif defined(USE_SRC)
- prv->data.data_in = samples;
- prv->data.input_frames = count;
-#endif
-}
-
-void CHResampler::setOutputSamples(float* samples, std::size_t count)
-{
-#if defined(USE_ZITA)
- prv->zita.out_data = samples;
- prv->zita.out_count = count;
-#elif defined(USE_SRC)
- prv->data.data_out = samples;
- prv->data.output_frames = count;
-#endif
-}
-
-void CHResampler::process()
-{
-#if defined(USE_ZITA)
- 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;
-#endif
-}
-
-std::size_t CHResampler::getLatency() const
-{
- if (input_fs == output_fs)
- {
- return 0;
- }
-
-#if defined(USE_ZITA)
- return 0;
-#elif defined(USE_SRC)
- return 0; // TODO?
-#endif
-}
-
-std::size_t CHResampler::getInputSampleCount() const
-{
-#if defined(USE_ZITA)
- return prv->zita.inp_count;
-#elif defined(USE_SRC)
- return prv->data.input_frames;
-#endif
-}
-
-std::size_t CHResampler::getOutputSampleCount() const
-{
-#if defined(USE_ZITA)
- return prv->zita.out_count;
-#elif defined(USE_SRC)
- return prv->data.output_frames;
-#endif
-}
-
-double CHResampler::getRatio() const
-{
- return input_fs / output_fs;
-}
-
-#else
-
-// Dummy implementation
-CHResampler::CHResampler() {}
-CHResampler::~CHResampler() {}
-void CHResampler::setup(double, double) {}
-void CHResampler::setInputSamples(float*, std::size_t) {}
-void CHResampler::setOutputSamples(float*, std::size_t) {}
-void CHResampler::process() {}
-
-std::size_t CHResampler::getLatency() const
-{
- return 0;
-}
-
-std::size_t CHResampler::getInputSampleCount() const
-{
- return 0;
-}
-
-std::size_t CHResampler::getOutputSampleCount() const
-{
- return 0;
-}
-
-double CHResampler::getRatio() const
-{
- return 1;
-}
-
-#endif /*WITH_RESAMPLER*/
diff --git a/src/chresampler.h b/src/chresampler.h
deleted file mode 100644
index d21d1cb..0000000
--- a/src/chresampler.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- * chresampler.h
- *
- * Tue Sep 23 20:42:14 CEST 2014
- * Copyright 2014 Bent Bisballe Nyeng
- * deva@aasimon.org
- ****************************************************************************/
-
-/*
- * This file is part of DrumGizmo.
- *
- * DrumGizmo is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * DrumGizmo is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with DrumGizmo; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-#pragma once
-
-#include <memory>
-#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.
-class CHResampler
-{
-public:
- CHResampler();
- ~CHResampler();
-
- void setup(double input_fs, double output_fs);
-
- void setInputSamples(float* samples, std::size_t count);
- void setOutputSamples(float* samples, std::size_t count);
-
- void process();
-
- std::size_t getLatency() const;
-
- std::size_t getInputSampleCount() const;
- std::size_t getOutputSampleCount() const;
-
- double getRatio() const;
-
-#ifdef WITH_RESAMPLER
-private:
- class Prv;
- std::unique_ptr<Prv> prv;
-
- 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::size_t getLatency() const
- {
- return resamplers[0].getLatency();
- }
-
- std::array<CHResampler, 64> resamplers;
-};
diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc
index e7ebe5a..5048e35 100644
--- a/src/drumgizmo.cc
+++ b/src/drumgizmo.cc
@@ -201,10 +201,9 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)
zita[c].process();
}
- std::memset(_resampler_input_buffer[c], 0,
- sizeof(_resampler_input_buffer[c]));
+ std::memset(resampler_input_buffer[c].get(), 0, MAX_RESAMPLER_BUFFER_SIZE);
- zita[c].inp_data = _resampler_input_buffer[c];
+ zita[c].inp_data = resampler_input_buffer[c].get();
std::size_t sample_count =
std::ceil((nsamples - (nsamples - zita[c].out_count)) * ratio);
getSamples(c, kitpos, zita[c].inp_data, sample_count);
@@ -409,11 +408,18 @@ void DrumGizmo::setSamplerate(float samplerate)
// Notify input engine of the samplerate change.
ie.setSampleRate(samplerate);
- auto input_fs = kit.getSamplerate();
+ auto input_fs = settings.drumkit_samplerate.load();
auto output_fs = samplerate;
ratio = input_fs / output_fs;
settings.resamplig_recommended.store(ratio != 1.0);
+ // TODO: Only reallocate the actual amount of samples needed based on the
+ // ratio and the framesize.
+ for(auto& buf : resampler_input_buffer)
+ {
+ buf.reset(new sample_t[MAX_RESAMPLER_BUFFER_SIZE]);
+ }
+
for(int c = 0; c < MAX_NUM_CHANNELS; ++c)
{
zita[c].reset();
diff --git a/src/drumgizmo.h b/src/drumgizmo.h
index 2f74062..4592143 100644
--- a/src/drumgizmo.h
+++ b/src/drumgizmo.h
@@ -29,6 +29,7 @@
#include <string>
#include <list>
#include <array>
+#include <memory>
#include <zita-resampler/resampler.h>
@@ -74,8 +75,7 @@ public:
private:
static constexpr int MAX_NUM_CHANNELS = 64;
- static constexpr int RESAMPLER_OUTPUT_BUFFER = 4096;
- static constexpr int RESAMPLER_INPUT_BUFFER = 2048;//64;
+ static constexpr int MAX_RESAMPLER_BUFFER_SIZE = 4096 * 8;
protected:
DrumKitLoader loader;
@@ -101,8 +101,8 @@ protected:
SettingsGetter settings_getter;
Random rand;
- Resampler zita[MAX_NUM_CHANNELS];
- sample_t _resampler_input_buffer[MAX_NUM_CHANNELS][4096 * 8];
+ std::array<Resampler, MAX_NUM_CHANNELS> zita;
+ std::array<std::unique_ptr<sample_t>, MAX_NUM_CHANNELS> resampler_input_buffer;
double ratio = 1.0;
};
diff --git a/src/drumkitloader.h b/src/drumkitloader.h
index 2758a98..d14a321 100644
--- a/src/drumkitloader.h
+++ b/src/drumkitloader.h
@@ -36,8 +36,6 @@
#include "drumkit.h"
#include "settings.h"
#include "audioinputengine.h"
-#include "chresampler.h"
-//#include "memchecker.h"
#include "audiocache.h"
//! This class is responsible for loading the drumkits in its own thread.
diff --git a/src/settings.h b/src/settings.h
index e698d20..5137809 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -51,7 +51,7 @@ struct Settings
Atomic<std::string> drumkit_name{""};
Atomic<std::string> drumkit_description{""};
Atomic<std::string> drumkit_version{""};
- Atomic<std::size_t> drumkit_samplerate{0};
+ Atomic<std::size_t> drumkit_samplerate{44100};
//! The maximum amount of memory in bytes that the AudioCache
//! is allowed to use for preloading. Default is 1GB.