From 1d7f0e15c5d80aee4f387db2c64f8d9427fa7d04 Mon Sep 17 00:00:00 2001 From: "v.audacity" Date: Mon, 17 Dec 2012 06:48:11 +0000 Subject: [PATCH] upgrade to var-rate resampling for libsoxr --- src/Resample.cpp | 38 ++++++++++++++++++++++++++++++++++++-- src/Resample.h | 2 +- win/configwin.h | 13 +++++++------ 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/Resample.cpp b/src/Resample.cpp index 8d705bc00..5021f3b7c 100644 --- a/src/Resample.cpp +++ b/src/Resample.cpp @@ -125,7 +125,42 @@ // variable-rate resampler(s) -#if USE_LIBRESAMPLE +#if USE_LIBSOXR + + #include + + VarRateResample::VarRateResample(const bool useBestMethod, const double dMinFactor, const double dMaxFactor) + : Resample(useBestMethod) + { + soxr_quality_spec_t q_spec = soxr_quality_spec(SOXR_HQ, SOXR_VR); + mHandle = (void *)soxr_create(1, dMinFactor, 1, 0, 0, &q_spec, 0); + } + + VarRateResample::~VarRateResample() + { + soxr_delete((soxr_t)mHandle); + } + + int VarRateResample::Process(double factor, + float *inBuffer, + int inBufferLen, + bool lastFlag, + int *inBufferUsed, + float *outBuffer, + int outBufferLen) + { + //vvvvv Not defined: soxr_set_io_ratio((soxr_t)mHandle, 1/factor, 0); + + size_t idone , odone; + inBufferLen = lastFlag? ~inBufferLen : inBufferLen; + soxr_process((soxr_t)mHandle, + inBuffer , (size_t)inBufferLen , &idone, + outBuffer, (size_t)outBufferLen, &odone); + *inBufferUsed = (int)idone; + return (int)odone; + } + +#elif USE_LIBRESAMPLE #include "libresample.h" @@ -283,7 +318,6 @@ *inBufferUsed = (int)data.input_frames_used; return (int)data.output_frames_gen; } - #else // no var-rate resampler VarRateResample::VarRateResample(const bool useBestMethod, const double dMinFactor, const double dMaxFactor) : Resample(useBestMethod) diff --git a/src/Resample.h b/src/Resample.h index c5bc0ea0e..d0b560ba3 100644 --- a/src/Resample.h +++ b/src/Resample.h @@ -150,7 +150,7 @@ class VarRateResample : public Resample virtual ~VarRateResample(); // Override base class methods only if we actually have a var-rate library. - #if USE_LIBRESAMPLE || USE_LIBSAMPLERATE + #if USE_LIBRESAMPLE || USE_LIBSAMPLERATE || USE_LIBSOXR static int GetNumMethods(); static wxString GetMethodName(int index); diff --git a/win/configwin.h b/win/configwin.h index 99597f5ac..ee9a52f33 100644 --- a/win/configwin.h +++ b/win/configwin.h @@ -24,13 +24,14 @@ // Resamplers. // Only one of each type of resampler (constant or variable rate) should be defined. -// libsoxr is used for constant-rate resampling. -// It's currently our only const-rate resampler, so should always be #defined. +// libsoxr is used for constant-rate and var-rat resampling. +// libsoxr currently our only const-rate resampler, so should always be #defined. #define USE_LIBSOXR 1 -// Should build only one of libresample or libsamplerate for variable-rate resampling, -// but if both are defined, USE_LIBRESAMPLE is used and USE_LIBSAMPLERATE is not. -// Should always have one or the other #defined. -#define USE_LIBRESAMPLE 1 +// Should build only one of libsoxr, libresample, or libsamplerate for variable-rate resampling, +// but if more than one are defined, priority is libsoxr over libresample over libsamplerate. +// We cannot release builds with libsamplerate, due to licensing. +// Standard configuration is to have only USE_LIBSOXR #defined. +#undef USE_LIBRESAMPLE #undef USE_LIBSAMPLERATE #define USE_LIBTWOLAME 1