diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-03-26 14:29:14 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-03-26 14:29:14 +0000 |
commit | 0f2ba63ed6cd84c60768290940429aaefb076aba (patch) | |
tree | 36bcddc21fd58353c1baecd6cc226f288de42050 /libs/rubberband | |
parent | 8afd32fd24e41260c65da0cfc35d67e71576b644 (diff) |
merge from thirdparty rubberband 1.3 @ 4901
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@4903 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/rubberband')
20 files changed, 125 insertions, 18 deletions
diff --git a/libs/rubberband/repopulate b/libs/rubberband/repopulate new file mode 100755 index 0000000000..5a5ca263f6 --- /dev/null +++ b/libs/rubberband/repopulate @@ -0,0 +1,28 @@ +#!/bin/sh + +# +# this script copies the relevant files from $1 into this +# working copy of the repository, adds new files and +# prints a list of mods for SConscript +# + +from=$1 +#strip=`dirname $1` +strip=$1 + +echo "Looking for copies in $from ... will strip $strip" + +for file in `find $from \( -name \*.cpp -o -name \*.h -o -name \*.c \)` +do + src=$file + copy=`echo $file | sed "s?$strip/??"` + echo "Look for $copy" + if [ -f $copy ] ; then + cp $src $copy + echo "copy $copy" + else + echo "ADD $copy" + cp $src $copy + svn add $copy + fi +done
\ No newline at end of file diff --git a/libs/rubberband/rubberband/RubberBandStretcher.h b/libs/rubberband/rubberband/RubberBandStretcher.h index ff12bafe8a..1e676f229d 100644 --- a/libs/rubberband/rubberband/RubberBandStretcher.h +++ b/libs/rubberband/rubberband/RubberBandStretcher.h @@ -15,7 +15,7 @@ #ifndef _RUBBERBANDSTRETCHER_H_ #define _RUBBERBANDSTRETCHER_H_ -#define RUBBERBAND_VERSION "1.2.0-gpl" +#define RUBBERBAND_VERSION "1.3.0-gpl" #define RUBBERBAND_API_MAJOR_VERSION 2 #define RUBBERBAND_API_MINOR_VERSION 0 diff --git a/libs/rubberband/rubberband/rubberband-c.h b/libs/rubberband/rubberband/rubberband-c.h index 78fd129684..a2cfe7605d 100644 --- a/libs/rubberband/rubberband/rubberband-c.h +++ b/libs/rubberband/rubberband/rubberband-c.h @@ -19,7 +19,7 @@ extern "C" { #endif -#define RUBBERBAND_VERSION "1.2.0-gpl" +#define RUBBERBAND_VERSION "1.3.0-gpl" #define RUBBERBAND_API_MAJOR_VERSION 2 #define RUBBERBAND_API_MINOR_VERSION 0 diff --git a/libs/rubberband/src/AudioCurve.cpp b/libs/rubberband/src/AudioCurve.cpp index 118caf4bdc..8cf247b1db 100644 --- a/libs/rubberband/src/AudioCurve.cpp +++ b/libs/rubberband/src/AudioCurve.cpp @@ -31,9 +31,9 @@ AudioCurve::~AudioCurve() } float -AudioCurve::process(const double *R__ mag, size_t increment) +AudioCurve::processDouble(const double *R__ mag, size_t increment) { - cerr << "WARNING: Using inefficient AudioCurve::process(double)" << endl; + cerr << "AudioCurve::processDouble: WARNING: Using inefficient and lossy conversion for AudioCurve::process(float)" << endl; float *tmp = new float[m_windowSize]; for (int i = 0; i < int(m_windowSize); ++i) tmp[i] = float(mag[i]); float df = process(tmp, increment); diff --git a/libs/rubberband/src/AudioCurve.h b/libs/rubberband/src/AudioCurve.h index 7896308013..a34a4aab9a 100644 --- a/libs/rubberband/src/AudioCurve.h +++ b/libs/rubberband/src/AudioCurve.h @@ -31,7 +31,7 @@ public: virtual void setWindowSize(size_t newSize) = 0; virtual float process(const float *R__ mag, size_t increment) = 0; - virtual float process(const double *R__ mag, size_t increment); + virtual float processDouble(const double *R__ mag, size_t increment); virtual void reset() = 0; protected: diff --git a/libs/rubberband/src/ConstantAudioCurve.cpp b/libs/rubberband/src/ConstantAudioCurve.cpp index 3263c53c65..87867f3cb2 100644 --- a/libs/rubberband/src/ConstantAudioCurve.cpp +++ b/libs/rubberband/src/ConstantAudioCurve.cpp @@ -43,5 +43,11 @@ ConstantAudioCurve::process(const float *R__, size_t) return 1.f; } +float +ConstantAudioCurve::processDouble(const double *R__, size_t) +{ + return 1.f; +} + } diff --git a/libs/rubberband/src/ConstantAudioCurve.h b/libs/rubberband/src/ConstantAudioCurve.h index d73cabe943..41a2ea0ca5 100644 --- a/libs/rubberband/src/ConstantAudioCurve.h +++ b/libs/rubberband/src/ConstantAudioCurve.h @@ -29,6 +29,7 @@ public: virtual void setWindowSize(size_t newSize); virtual float process(const float *R__ mag, size_t increment); + virtual float processDouble(const double *R__ mag, size_t increment); virtual void reset(); }; diff --git a/libs/rubberband/src/HighFrequencyAudioCurve.cpp b/libs/rubberband/src/HighFrequencyAudioCurve.cpp index 987cf76a66..71108ad1c1 100644 --- a/libs/rubberband/src/HighFrequencyAudioCurve.cpp +++ b/libs/rubberband/src/HighFrequencyAudioCurve.cpp @@ -51,5 +51,19 @@ HighFrequencyAudioCurve::process(const float *R__ mag, size_t increment) return result; } +float +HighFrequencyAudioCurve::processDouble(const double *R__ mag, size_t increment) +{ + float result = 0.0; + + const int sz = m_windowSize / 2; + + for (int n = 0; n <= sz; ++n) { + result = result + (float)mag[n] * n; + } + + return result; +} + } diff --git a/libs/rubberband/src/HighFrequencyAudioCurve.h b/libs/rubberband/src/HighFrequencyAudioCurve.h index d42513f9b7..b0a3ec2db7 100644 --- a/libs/rubberband/src/HighFrequencyAudioCurve.h +++ b/libs/rubberband/src/HighFrequencyAudioCurve.h @@ -31,6 +31,7 @@ public: virtual void setWindowSize(size_t newSize); virtual float process(const float *R__ mag, size_t increment); + virtual float processDouble(const double *R__ mag, size_t increment); virtual void reset(); }; diff --git a/libs/rubberband/src/PercussiveAudioCurve.cpp b/libs/rubberband/src/PercussiveAudioCurve.cpp index f8925961f3..cb03afc141 100644 --- a/libs/rubberband/src/PercussiveAudioCurve.cpp +++ b/libs/rubberband/src/PercussiveAudioCurve.cpp @@ -82,7 +82,7 @@ PercussiveAudioCurve::process(const float *R__ mag, size_t increment) } float -PercussiveAudioCurve::process(const double *R__ mag, size_t increment) +PercussiveAudioCurve::processDouble(const double *R__ mag, size_t increment) { Profiler profiler("PercussiveAudioCurve::process"); diff --git a/libs/rubberband/src/PercussiveAudioCurve.h b/libs/rubberband/src/PercussiveAudioCurve.h index 29c4fb7fd9..9f087053a4 100644 --- a/libs/rubberband/src/PercussiveAudioCurve.h +++ b/libs/rubberband/src/PercussiveAudioCurve.h @@ -30,7 +30,7 @@ public: virtual void setWindowSize(size_t newSize); virtual float process(const float *R__ mag, size_t increment); - virtual float process(const double *R__ mag, size_t increment); + virtual float processDouble(const double *R__ mag, size_t increment); virtual void reset(); protected: diff --git a/libs/rubberband/src/Resampler.cpp b/libs/rubberband/src/Resampler.cpp index 296537f085..1e479363b5 100644 --- a/libs/rubberband/src/Resampler.cpp +++ b/libs/rubberband/src/Resampler.cpp @@ -137,9 +137,11 @@ D_SRC::resample(const float *const R__ *const R__ in, data.data_out = *out; } else { if (incount * m_channels > m_iinsize) { + m_iinsize = incount * m_channels; m_iin = allocFloat(m_iin, m_iinsize); } if (outcount * m_channels > m_ioutsize) { + m_ioutsize = outcount * m_channels; m_iout = allocFloat(m_iout, m_ioutsize); } for (int i = 0; i < incount; ++i) { diff --git a/libs/rubberband/src/SilentAudioCurve.cpp b/libs/rubberband/src/SilentAudioCurve.cpp index b44564671c..2bc8bdcf5f 100644 --- a/libs/rubberband/src/SilentAudioCurve.cpp +++ b/libs/rubberband/src/SilentAudioCurve.cpp @@ -53,7 +53,7 @@ SilentAudioCurve::process(const float *R__ mag, size_t) } float -SilentAudioCurve::process(const double *R__ mag, size_t) +SilentAudioCurve::processDouble(const double *R__ mag, size_t) { const int hs = m_windowSize / 2; static double threshold = pow(10.0, -6); diff --git a/libs/rubberband/src/SilentAudioCurve.h b/libs/rubberband/src/SilentAudioCurve.h index ec7009a871..6309f9dddf 100644 --- a/libs/rubberband/src/SilentAudioCurve.h +++ b/libs/rubberband/src/SilentAudioCurve.h @@ -29,7 +29,7 @@ public: virtual void setWindowSize(size_t newSize); virtual float process(const float *R__ mag, size_t increment); - virtual float process(const double *R__ mag, size_t increment); + virtual float processDouble(const double *R__ mag, size_t increment); virtual void reset(); }; diff --git a/libs/rubberband/src/SpectralDifferenceAudioCurve.cpp b/libs/rubberband/src/SpectralDifferenceAudioCurve.cpp index 0deec53c87..e391e39b78 100644 --- a/libs/rubberband/src/SpectralDifferenceAudioCurve.cpp +++ b/libs/rubberband/src/SpectralDifferenceAudioCurve.cpp @@ -65,5 +65,19 @@ SpectralDifferenceAudioCurve::process(const float *R__ mag, size_t increment) return result; } +float +SpectralDifferenceAudioCurve::processDouble(const double *R__ mag, size_t increment) +{ + float result = 0.0; + + for (size_t n = 0; n <= m_windowSize / 2; ++n) { + result += sqrtf(fabsf((mag[n] * mag[n]) - + (m_prevMag[n] * m_prevMag[n]))); + m_prevMag[n] = (float)mag[n]; + } + + return result; +} + } diff --git a/libs/rubberband/src/SpectralDifferenceAudioCurve.h b/libs/rubberband/src/SpectralDifferenceAudioCurve.h index 6ab0af9c02..4295653cf0 100644 --- a/libs/rubberband/src/SpectralDifferenceAudioCurve.h +++ b/libs/rubberband/src/SpectralDifferenceAudioCurve.h @@ -31,6 +31,7 @@ public: virtual void setWindowSize(size_t newSize); virtual float process(const float *R__ mag, size_t increment); + virtual float processDouble(const double *R__ mag, size_t increment); virtual void reset(); protected: diff --git a/libs/rubberband/src/StretcherChannelData.cpp b/libs/rubberband/src/StretcherChannelData.cpp index 8378975cbd..240df230d1 100644 --- a/libs/rubberband/src/StretcherChannelData.cpp +++ b/libs/rubberband/src/StretcherChannelData.cpp @@ -104,6 +104,14 @@ RubberBandStretcher::Impl::ChannelData::construct(const std::set<size_t> &window for (size_t i = 0; i < initialWindowSize * oversample; ++i) { dblbuf[i] = 0.0; } + + for (size_t i = 0; i < maxSize; ++i) { + accumulator[i] = 0.f; + windowAccumulator[i] = 0.f; + } + + // Avoid dividing opening sample (which will be discarded anyway) by zero + windowAccumulator[0] = 1.f; } void @@ -273,6 +281,16 @@ RubberBandStretcher::Impl::ChannelData::reset() if (resampler) resampler->reset(); + size_t size = inbuf->getSize(); + + for (size_t i = 0; i < size; ++i) { + accumulator[i] = 0.f; + windowAccumulator[i] = 0.f; + } + + // Avoid dividing opening sample (which will be discarded anyway) by zero + windowAccumulator[0] = 1.f; + accumulatorFill = 0; prevIncrement = 0; chunkCount = 0; diff --git a/libs/rubberband/src/StretcherImpl.cpp b/libs/rubberband/src/StretcherImpl.cpp index 126b001b83..7ec7c161f3 100644 --- a/libs/rubberband/src/StretcherImpl.cpp +++ b/libs/rubberband/src/StretcherImpl.cpp @@ -342,6 +342,19 @@ RubberBandStretcher::Impl::calculateSizes() size_t windowSize = m_baseWindowSize; size_t outputIncrement; + if (m_pitchScale <= 0.0) { + // This special case is likelier than one might hope, because + // of naive initialisations in programs that set it from a + // variable + std::cerr << "RubberBandStretcher: WARNING: Pitch scale must be greater than zero!\nResetting it from " << m_pitchScale << " to the default of 1.0: no pitch change will occur" << std::endl; + m_pitchScale = 1.0; + } + if (m_timeRatio <= 0.0) { + // Likewise + std::cerr << "RubberBandStretcher: WARNING: Time ratio must be greater than zero!\nResetting it from " << m_timeRatio << " to the default of 1.0: no time stretch will occur" << std::endl; + m_timeRatio = 1.0; + } + double r = getEffectiveRatio(); if (m_realtime) { @@ -921,9 +934,18 @@ RubberBandStretcher::Impl::calculateStretch() { Profiler profiler("RubberBandStretcher::Impl::calculateStretch"); + size_t inputDuration = m_inputDuration; + + if (!m_realtime && m_expectedInputDuration > 0) { + if (m_expectedInputDuration != inputDuration) { + std::cerr << "RubberBandStretcher: WARNING: Actual study() duration differs from duration set by setExpectedInputDuration (" << m_inputDuration << " vs " << m_expectedInputDuration << ", diff = " << (m_expectedInputDuration - m_inputDuration) << "), using the latter for calculation" << std::endl; + inputDuration = m_expectedInputDuration; + } + } + std::vector<int> increments = m_stretchCalculator->calculate (getEffectiveRatio(), - m_inputDuration, + inputDuration, m_phaseResetDf, m_stretchDf); diff --git a/libs/rubberband/src/StretcherProcess.cpp b/libs/rubberband/src/StretcherProcess.cpp index 59f678bf6e..47bf77e197 100644 --- a/libs/rubberband/src/StretcherProcess.cpp +++ b/libs/rubberband/src/StretcherProcess.cpp @@ -67,7 +67,7 @@ RubberBandStretcher::Impl::ProcessThread::run() m_dataAvailable.lock(); if (!m_s->testInbufReadSpace(m_channel) && !m_abandoning) { - m_dataAvailable.wait(); + m_dataAvailable.wait(50000); // bounded in case of abandonment } else { m_dataAvailable.unlock(); } @@ -448,8 +448,8 @@ RubberBandStretcher::Impl::calculateIncrements(size_t &phaseIncrementRtn, if (m_channels == 1) { - df = m_phaseResetAudioCurve->process(cd.mag, m_increment); - silent = (m_silentAudioCurve->process(cd.mag, m_increment) > 0.f); + df = m_phaseResetAudioCurve->processDouble(cd.mag, m_increment); + silent = (m_silentAudioCurve->processDouble(cd.mag, m_increment) > 0.f); } else { @@ -464,8 +464,8 @@ RubberBandStretcher::Impl::calculateIncrements(size_t &phaseIncrementRtn, } } - df = m_phaseResetAudioCurve->process(tmp, m_increment); - silent = (m_silentAudioCurve->process(tmp, m_increment) > 0.f); + df = m_phaseResetAudioCurve->processDouble(tmp, m_increment); + silent = (m_silentAudioCurve->processDouble(tmp, m_increment) > 0.f); } int incr = m_stretchCalculator->calculateSingle @@ -736,7 +736,7 @@ RubberBandStretcher::Impl::modifyChunk(size_t channel, bool inherit = false; if (laminar) { - if (distance >= mi) { + if (distance >= mi || i == count) { inherit = false; } else if (bandlimited && (i == bandhigh || i == bandlow)) { inherit = false; diff --git a/libs/rubberband/src/sysutils.cpp b/libs/rubberband/src/sysutils.cpp index d52eee9511..902b1267ab 100644 --- a/libs/rubberband/src/sysutils.cpp +++ b/libs/rubberband/src/sysutils.cpp @@ -109,7 +109,7 @@ float *allocFloat(float *ptr, int count) void *allocated; #ifndef _WIN32 #ifndef __APPLE__ - if (!posix_memalign(&allocated, 16, count * sizeof(float))) + if (posix_memalign(&allocated, 16, count * sizeof(float))) #endif #endif allocated = malloc(count * sizeof(float)); @@ -133,7 +133,7 @@ double *allocDouble(double *ptr, int count) void *allocated; #ifndef _WIN32 #ifndef __APPLE__ - if (!posix_memalign(&allocated, 16, count * sizeof(double))) + if (posix_memalign(&allocated, 16, count * sizeof(double))) #endif #endif allocated = malloc(count * sizeof(double)); |