diff options
-rw-r--r-- | configure.ac | 99 | ||||
-rw-r--r-- | plugin/Makefile.mingw32.in | 6 | ||||
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/chresampler.cc | 220 | ||||
-rw-r--r-- | src/chresampler.h | 107 | ||||
-rw-r--r-- | src/drumgizmo.cc | 14 | ||||
-rw-r--r-- | src/drumgizmo.h | 8 | ||||
-rw-r--r-- | src/drumkitloader.h | 2 | ||||
-rw-r--r-- | src/settings.h | 2 | ||||
-rw-r--r-- | test/Makefile.am | 11 | ||||
-rw-r--r-- | test/resampler.cc | 110 |
11 files changed, 46 insertions, 539 deletions
diff --git a/configure.ac b/configure.ac index d635cf0..0a671e6 100644 --- a/configure.ac +++ b/configure.ac @@ -536,78 +536,33 @@ dnl ====================== PKG_CHECK_MODULES(SNDFILE, sndfile >= 1.0.20) -AC_ARG_ENABLE([resampler], - AS_HELP_STRING([--enable-resampler[=lib]], - [Enable resampling using libzita-resampler, set to 'src' to force use of libsamplerate (slow). [default=yes]]),, - [enable_resampler="yes"]) - -AS_IF([test "x$enable_resampler" = "xyes"], [enable_resampler="zita"]) - -has_src=no -has_zita=no - -AS_IF([test x$enable_resampler != xno], - [AC_MSG_WARN([*** Building resample support!]) - AC_DEFINE(WITH_RESAMPLER, [], [Use resample]) - - AS_CASE([$enable_resampler], - [src], - [dnl ====================== - dnl Check for libsamplerate - dnl ====================== - PKG_CHECK_MODULES(SAMPLERATE, samplerate >= 0.1.7, has_src=yes, has_src=no)], - [zita], - [dnl ====================== - dnl Check for the zitaresampler library - dnl ====================== - AC_LANG_PUSH([C++]) - tmp_CXXFLAGS="$CXXFLAGS" - tmp_CPPFLAGS="$CPPFLAGS" - tmp_CFLAGS="$CFLAGS" - tmp_LDFLAGS="$LDFLAGS" - tmp_LIBS="$LIBS" - CXXFLAGS="" - CPPFLAGS="$ZITA_CPPFLAGS" - CFLAGS="" - LDFLAGS="$ZITA_LDFLAGS" - LIBS="-lzita-resampler -lpthread" - AC_LINK_IFELSE( - [AC_LANG_PROGRAM([#include <zita-resampler/resampler.h>], - [Resampler r] ) ], has_zita=yes, has_zita=no) - ZITA_CPPFLAGS="$CXXFLAGS $CPPFLAGS $CFLAGS" - ZITA_LIBS="$LDFLAGS $LIBS" - CXXFLAGS="$tmp_CXXFLAGS" - CPPFLAGS="$tmp_CPPFLAGS" - CFLAGS="$tmp_CFLAGS" - LDFLAGS="$tmp_LDFLAGS" - LIBS="$tmp_LIBS" - AC_SUBST(ZITA_CPPFLAGS) - AC_SUBST(ZITA_LIBS) - AC_LANG_POP([C++])], - [AC_MSG_ERROR([*** Bad argument '$enable_resampler'.])] - ) - ] -) - -AS_IF([test x$enable_resampler == xzita], - [AS_IF([test x$has_zita == xyes], - [AC_DEFINE(USE_ZITA, [], [zita-resampler is present]) - SAMPLERATE_CFLAGS="" - SAMPLERATE_LIBS="" - ], - [AC_MSG_ERROR([*** zita-resampler library or headers not found. Set ZITA_LDFLAGS or ZITA_CPPFLAGS to add searchpath.])] - )] -) - -AS_IF([test x$enable_resampler == xsrc], - [AS_IF([test x$has_src == xyes], - [AC_DEFINE(USE_SRC, [], [libsamplerate is present]) - ZITA_CPPFLAGS="" - ZITA_LIBS="" - ], - [AC_MSG_ERROR([*** Missing libsamplerate.])] - )] -) +dnl ====================== +dnl Check for the zitaresampler library +dnl ====================== +AC_LANG_PUSH([C++]) +tmp_CXXFLAGS="$CXXFLAGS" +tmp_CPPFLAGS="$CPPFLAGS" +tmp_CFLAGS="$CFLAGS" +tmp_LDFLAGS="$LDFLAGS" +tmp_LIBS="$LIBS" +CXXFLAGS="" +CPPFLAGS="$ZITA_CPPFLAGS" +CFLAGS="" +LDFLAGS="$ZITA_LDFLAGS" +LIBS="-lzita-resampler -lpthread" +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#include <zita-resampler/resampler.h>], + [Resampler r] ) ], has_zita=yes, has_zita=no) +ZITA_CPPFLAGS="$CXXFLAGS $CPPFLAGS $CFLAGS" +ZITA_LIBS="$LDFLAGS $LIBS" +CXXFLAGS="$tmp_CXXFLAGS" +CPPFLAGS="$tmp_CPPFLAGS" +CFLAGS="$tmp_CFLAGS" +LDFLAGS="$tmp_LDFLAGS" +LIBS="$tmp_LIBS" +AC_SUBST(ZITA_CPPFLAGS) +AC_SUBST(ZITA_LIBS) +AC_LANG_POP([C++]) dnl ====================== dnl Check for the rt library diff --git a/plugin/Makefile.mingw32.in b/plugin/Makefile.mingw32.in index 8615bb4..af07e79 100644 --- a/plugin/Makefile.mingw32.in +++ b/plugin/Makefile.mingw32.in @@ -17,7 +17,6 @@ DG_SRC = \ @top_srcdir@/src/audiofile.cc \ @top_srcdir@/src/channel.cc \ @top_srcdir@/src/channelmixer.cc \ - @top_srcdir@/src/chresampler.cc \ @top_srcdir@/src/configfile.cc \ @top_srcdir@/src/configparser.cc \ @top_srcdir@/src/drumgizmo.cc \ @@ -121,9 +120,6 @@ EXPAT_LIBS=@EXPAT_LIBS@ SNDFILE_CFLAGS=@SNDFILE_CFLAGS@ SNDFILE_LIBS=@SNDFILE_LIBS@ -SRC_CFLAGS=@SAMPLERATE_CFLAGS@ -SRC_LIBS=@SAMPLERATE_LIBS@ - ZITA_CXXFLAGS=@ZITA_CPPFLAGS@ ZITA_LIBS=@ZITA_LIBS@ @@ -171,7 +167,7 @@ all: g++ $(CXXFLAGS) @top_srcdir@/plugingui/resource_data.cc -c gcc $(CFLAGS) $(DBG_CFLAGS) @top_srcdir@/hugin/hugin.c -c gcc $(CFLAGS) $(DBG_CFLAGS) @top_srcdir@/hugin/hugin_syslog.c -c - g++ $(CXXFLAGS) -std=c++11 -static -static-libgcc -O2 -g -Wall $(DBG_CFLAGS) $(DG_CFLAGS) $(DG_LIBS) $(VST_CFLAGS) hugin.o hugin_syslog.o resource_data.o $(DG_SRC) $(VST_SRC) ${SRC} ${GUI_SRC} ${GUI_CPPFLAGS} $(GUI_LIBS) $(EXPAT_CFLAGS) $(SRC_CFLAGS) $(ZITA_CXXFLAGS) $(EXPAT_LIBS) $(SNDFILE_CFLAGS) $(SNDFILE_LIBS) $(SRC_LIBS) $(ZITA_LIBS) -latomic -shared -Wl,-retain-symbols-file -Wl,drumgizmo_vst.sym -o drumgizmo_vst.dll -Wl,--out-implib,libdrumgizmo_vst.a + g++ $(CXXFLAGS) -std=c++11 -static -static-libgcc -O2 -g -Wall $(DBG_CFLAGS) $(DG_CFLAGS) $(DG_LIBS) $(VST_CFLAGS) hugin.o hugin_syslog.o resource_data.o $(DG_SRC) $(VST_SRC) ${SRC} ${GUI_SRC} ${GUI_CPPFLAGS} $(GUI_LIBS) $(EXPAT_CFLAGS) $(ZITA_CXXFLAGS) $(EXPAT_LIBS) $(SNDFILE_CFLAGS) $(SNDFILE_LIBS) $(ZITA_LIBS) -latomic -shared -Wl,-retain-symbols-file -Wl,drumgizmo_vst.sym -o drumgizmo_vst.dll -Wl,--out-implib,libdrumgizmo_vst.a clean: del -f drumgizmo_vst.dll libdrumgizmo_vst.a 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. diff --git a/test/Makefile.am b/test/Makefile.am index 50c1b9d..4a5a050 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -3,7 +3,7 @@ SUBDIRS = dgreftest uitests if ENABLE_TESTS -TESTS = resource enginetest paintertest resampler configfile audiocache \ +TESTS = resource enginetest paintertest configfile audiocache \ audiocachefile audiocacheidmanager audiocacheeventhandler \ randomtest atomictest syncedsettingstest imagecachetest \ semaphoretest drumkitcreatortest bytesizeparsertest notifiertest \ @@ -109,15 +109,6 @@ paintertest_SOURCES = \ dgtest.cc \ paintertest.cc -resampler_CXXFLAGS = -DOUTPUT=\"resampler\" \ - $(ZITA_CXXFLAGS) $(SAMPLERATE_CFLAGS) \ - -I$(top_srcdir)/hugin -DDISABLE_HUGIN -resampler_LDFLAGS = $(ZITA_LIBS) $(SAMPLERATE_LIBS) -resampler_SOURCES = \ - $(top_srcdir)/src/chresampler.cc \ - dgtest.cc \ - resampler.cc - lv2_CXXFLAGS = -DOUTPUT=\"lv2\" \ -I$(top_srcdir)/src \ `pkg-config --cflags serd-0` `pkg-config --cflags lilv-0` \ diff --git a/test/resampler.cc b/test/resampler.cc deleted file mode 100644 index 6df8b51..0000000 --- a/test/resampler.cc +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * resampler.cc - * - * Sun Oct 5 20:16:22 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 "dgunit.h" - -#include "../src/chresampler.h" - -#define BUFSZ 500 - -static float roundoff(float a) { return a<0.5?0:1; } - -class test_resampler - : public DGUnit -{ -public: - test_resampler() - { - DGUNIT_TEST(test_resampler::resampling); - DGUNIT_TEST(test_resampler::resampling_buffer_sizes); - } - - void resampling() - { - CHResampler r; - DGUNIT_ASSERT_EQUAL(1.0, r.getRatio()); - - r.setup(44100.0, 48000.0); - DGUNIT_ASSERT_EQUAL(44100.0/48000.0, r.getRatio()); - - float in[BUFSZ]; - for(int i = 0; i < BUFSZ; i++) in[i] = 0;//(float)i/(float)BUFSZ; - in[100] = 1.0; - - float out[BUFSZ]; - r.setInputSamples(in, sizeof(in) / sizeof(float)); - r.setOutputSamples(out, sizeof(out) / sizeof(float)); - r.process(); - DGUNIT_ASSERT_EQUAL((size_t)0, r.getInputSampleCount()); - - // DGUNIT_ASSERT_EQUAL(, r.getOutputSampleCount()); - - int outidx = -1; - int inidx = -1; - for(int i = 0; i < BUFSZ - (int)r.getOutputSampleCount(); i++) { - if(in[i] == 1.0) inidx = i; - if(roundoff(out[i]) == 1.0) outidx = i; - //printf("in[% 4d]\t= %f\t", i, in[i]); - //printf("out[% 4d]\t= %f\n", i, out[i]); - } - - DGUNIT_ASSERT(inidx != -1); - DGUNIT_ASSERT(outidx != -1); - - //printf("inidx: %d - outidx: %d\n", inidx, outidx); - //DGUNIT_ASSERT_EQUAL(71, inidx - outidx); // This does not make sense... - } - - void resampling_buffer_sizes() - { - CHResampler r; - DGUNIT_ASSERT_EQUAL(1.0, r.getRatio()); - - double infs = 24000; - double outfs = 48000; - r.setup(infs, outfs); - DGUNIT_ASSERT_EQUAL(infs / outfs, r.getRatio()); - - float in[BUFSZ]; - float out[(int)(BUFSZ / r.getRatio())]; - - // Preload resampler - r.setOutputSamples(out, 1); - while(r.getOutputSampleCount()) { - r.setInputSamples(in, 1); - r.process(); - } - - r.setInputSamples(in, sizeof(in) / sizeof(float)); - r.setOutputSamples(out, sizeof(out) / sizeof(float)); - r.process(); - DGUNIT_ASSERT_EQUAL((size_t)0, r.getInputSampleCount()); - DGUNIT_ASSERT_EQUAL((size_t)0, r.getOutputSampleCount()); - } -}; - -// Registers the fixture into the 'registry' -static test_resampler test; |