From 00ff759247de6701dfed24bb011e78179e973970 Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Thu, 26 Feb 2009 22:26:02 +0000 Subject: [PATCH] * Avoid virtual method hiding warnings * Avoid potential deadlock in thread join when processing has been abandoned --- src/ConstantAudioCurve.cpp | 6 ++++++ src/ConstantAudioCurve.h | 1 + src/HighFrequencyAudioCurve.cpp | 14 ++++++++++++++ src/HighFrequencyAudioCurve.h | 1 + src/PercussiveAudioCurve.cpp | 2 +- src/PercussiveAudioCurve.h | 2 +- src/SilentAudioCurve.cpp | 2 +- src/SilentAudioCurve.h | 2 +- src/SpectralDifferenceAudioCurve.cpp | 14 ++++++++++++++ src/SpectralDifferenceAudioCurve.h | 1 + src/StretcherImpl.cpp | 1 + src/StretcherProcess.cpp | 2 +- 12 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/ConstantAudioCurve.cpp b/src/ConstantAudioCurve.cpp index 3263c53..87867f3 100644 --- a/src/ConstantAudioCurve.cpp +++ b/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/src/ConstantAudioCurve.h b/src/ConstantAudioCurve.h index d73cabe..41a2ea0 100644 --- a/src/ConstantAudioCurve.h +++ b/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/src/HighFrequencyAudioCurve.cpp b/src/HighFrequencyAudioCurve.cpp index 987cf76..71108ad 100644 --- a/src/HighFrequencyAudioCurve.cpp +++ b/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/src/HighFrequencyAudioCurve.h b/src/HighFrequencyAudioCurve.h index d42513f..b0a3ec2 100644 --- a/src/HighFrequencyAudioCurve.h +++ b/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/src/PercussiveAudioCurve.cpp b/src/PercussiveAudioCurve.cpp index f892596..cb03afc 100644 --- a/src/PercussiveAudioCurve.cpp +++ b/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/src/PercussiveAudioCurve.h b/src/PercussiveAudioCurve.h index 29c4fb7..9f08705 100644 --- a/src/PercussiveAudioCurve.h +++ b/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/src/SilentAudioCurve.cpp b/src/SilentAudioCurve.cpp index b445646..2bc8bdc 100644 --- a/src/SilentAudioCurve.cpp +++ b/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/src/SilentAudioCurve.h b/src/SilentAudioCurve.h index ec7009a..6309f9d 100644 --- a/src/SilentAudioCurve.h +++ b/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/src/SpectralDifferenceAudioCurve.cpp b/src/SpectralDifferenceAudioCurve.cpp index 0deec53..e391e39 100644 --- a/src/SpectralDifferenceAudioCurve.cpp +++ b/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/src/SpectralDifferenceAudioCurve.h b/src/SpectralDifferenceAudioCurve.h index 6ab0af9..4295653 100644 --- a/src/SpectralDifferenceAudioCurve.h +++ b/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/src/StretcherImpl.cpp b/src/StretcherImpl.cpp index 7ec7c16..2c3c607 100644 --- a/src/StretcherImpl.cpp +++ b/src/StretcherImpl.cpp @@ -587,6 +587,7 @@ RubberBandStretcher::Impl::configure() delete m_phaseResetAudioCurve; m_phaseResetAudioCurve = new PercussiveAudioCurve +// m_phaseResetAudioCurve = new SpectralDifferenceAudioCurve (m_sampleRate, m_windowSize); delete m_silentAudioCurve; diff --git a/src/StretcherProcess.cpp b/src/StretcherProcess.cpp index 2699a27..5df48ac 100644 --- a/src/StretcherProcess.cpp +++ b/src/StretcherProcess.cpp @@ -66,7 +66,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(); }