From 2dcb27d3ddfd77a5300ca989e37610134c8d0c75 Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Mon, 20 Mar 2023 10:08:01 +0000 Subject: [PATCH] Toward properly testing reset --- src/finer/R3Stretcher.cpp | 11 ++++-- src/test/TestStretcher.cpp | 72 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/finer/R3Stretcher.cpp b/src/finer/R3Stretcher.cpp index 6cb6ae9..3e1b9c8 100644 --- a/src/finer/R3Stretcher.cpp +++ b/src/finer/R3Stretcher.cpp @@ -545,9 +545,6 @@ R3Stretcher::reset() cd->reset(); } - m_prevInhop = m_inhop; - m_prevOuthop = int(round(m_inhop * getEffectiveRatio())); - m_studyInputDuration = 0; m_suppliedInputDuration = 0; m_totalTargetDuration = 0; @@ -557,6 +554,14 @@ R3Stretcher::reset() m_keyFrameMap.clear(); m_mode = ProcessMode::JustCreated; + + m_prevInhop = 1; + m_prevOuthop = 1; + + calculateHop(); + + m_prevInhop = m_inhop; + m_prevOuthop = int(round(m_inhop * getEffectiveRatio())); } void diff --git a/src/test/TestStretcher.cpp b/src/test/TestStretcher.cpp index 9e63d2a..6954cb0 100644 --- a/src/test/TestStretcher.cpp +++ b/src/test/TestStretcher.cpp @@ -1251,5 +1251,77 @@ BOOST_AUTO_TEST_CASE(final_fast_lower_realtime_finer_after) false); } +BOOST_AUTO_TEST_CASE(impulses_2x_5up_offline_reset_finer) +{ + int n = 10000; + int rate = 44100; + RubberBandStretcher stretcher + (rate, 1, RubberBandStretcher::OptionEngineFiner); + + stretcher.setTimeRatio(2.0); + stretcher.setPitchScale(1.5); + + vector in(n, 0.f), out1(n * 2, 0.f), out2(n * 2, 0.f); + + in[100] = 1.f; + in[101] = -1.f; + + in[5000] = 1.f; + in[5001] = -1.f; + + in[9900] = 1.f; + in[9901] = -1.f; + + float *inp = in.data(), *outp1 = out1.data(), *outp2 = out2.data(); + + stretcher.setMaxProcessSize(n); + stretcher.setExpectedInputDuration(n); + BOOST_TEST(stretcher.available() == 0); + + stretcher.study(&inp, n, true); + BOOST_TEST(stretcher.available() == 0); + + stretcher.process(&inp, n, true); + BOOST_TEST(stretcher.available() == n * 2); + + BOOST_TEST(stretcher.getStartDelay() == 0); // offline mode + + size_t got = stretcher.retrieve(&outp1, n * 2); + BOOST_TEST(got == n * 2); + BOOST_TEST(stretcher.available() == -1); + + stretcher.reset(); + + stretcher.setMaxProcessSize(n); + stretcher.setExpectedInputDuration(n); + BOOST_TEST(stretcher.available() == 0); + + stretcher.study(&inp, n, true); + BOOST_TEST(stretcher.available() == 0); + + stretcher.process(&inp, n, true); + BOOST_TEST(stretcher.available() == n * 2); + + BOOST_TEST(stretcher.getStartDelay() == 0); // offline mode + + got = stretcher.retrieve(&outp2, n * 2); + BOOST_TEST(got == n * 2); + BOOST_TEST(stretcher.available() == -1); + + for (int i = 0; i < n * 2; ++i) { + BOOST_TEST(outp1[i] == outp2[i]); + if (outp1[i] != outp2[i]) { + std::cerr << "Failure at index " << i << std::endl; + break; + } + } + +/* + std::cout << "ms\tV" << std::endl; + for (int i = 0; i < n*2; ++i) { + std::cout << i << "\t" << out[i] << std::endl; + } +*/ +} BOOST_AUTO_TEST_SUITE_END()