From 121d7955599fcb1404a8bf963afde3163d5a2271 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Mon, 29 May 2023 14:02:16 +0200 Subject: [PATCH] Cover flac since we're at it --- tests/AudioFilesT.cpp | 40 +++++++++++++++++++++++++++++++++ tests/EventEnvelopesT.cpp | 15 +------------ tests/SIMDHelpersT.cpp | 41 +++++---------------------------- tests/SmoothersT.cpp | 24 +++++--------------- tests/TestFiles/kick.flac | Bin 0 -> 28122 bytes tests/TestHelpers.h | 46 +++++++++++++++++++++++++++++++++----- 6 files changed, 93 insertions(+), 73 deletions(-) create mode 100755 tests/TestFiles/kick.flac diff --git a/tests/AudioFilesT.cpp b/tests/AudioFilesT.cpp index 8046ca715..f888c650f 100644 --- a/tests/AudioFilesT.cpp +++ b/tests/AudioFilesT.cpp @@ -5,12 +5,33 @@ // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz #include "AudioSpan.h" +#include "absl/types/span.h" #include "sfizz/Synth.h" #include "TestHelpers.h" #include "catch2/catch.hpp" #include +#include using namespace Catch::literals; +TEST_CASE("[AudioFiles] No leakage on right") +{ + sfz::Synth synth; + sfz::AudioBuffer buffer { 2, static_cast(synth.getSamplesPerBlock()) }; + std::vector zeros(synth.getSamplesPerBlock(), 0); + sfz::AudioSpan span { buffer }; + synth.loadSfzString(fs::current_path() / "tests/TestFiles/wavpack.sfz", R"( + sample=kick.wav key=60 pan=-100 + )"); + synth.noteOn(0, 60, 127); + synth.renderBlock(buffer); + REQUIRE( numPlayingVoices(synth) == 1 ); + REQUIRE( approxEqual(span.getConstSpan(1), absl::MakeConstSpan(zeros), 1e-2f) ); + while (numPlayingVoices(synth) > 0) { + synth.renderBlock(buffer); + REQUIRE( approxEqual(span.getConstSpan(1), absl::MakeConstSpan(zeros), 1e-2f) ); + } +} + TEST_CASE("[AudioFiles] WavPack file") { sfz::Synth synth; @@ -29,3 +50,22 @@ TEST_CASE("[AudioFiles] WavPack file") REQUIRE( approxEqual(span.getConstSpan(0), span.getConstSpan(1)) ); } } + +TEST_CASE("[AudioFiles] Flac file") +{ + sfz::Synth synth; + sfz::AudioBuffer buffer { 2, static_cast(synth.getSamplesPerBlock()) }; + sfz::AudioSpan span { buffer }; + synth.loadSfzString(fs::current_path() / "tests/TestFiles/wavpack.sfz", R"( + sample=kick.wav key=60 pan=-100 + sample=kick.flac key=60 pan=100 + )"); + synth.noteOn(0, 60, 127); + synth.renderBlock(buffer); + REQUIRE( numPlayingVoices(synth) == 2 ); + REQUIRE( approxEqual(span.getConstSpan(0), span.getConstSpan(1)) ); + while (numPlayingVoices(synth) > 0) { + synth.renderBlock(buffer); + REQUIRE( approxEqual(span.getConstSpan(0), span.getConstSpan(1)) ); + } +} diff --git a/tests/EventEnvelopesT.cpp b/tests/EventEnvelopesT.cpp index 01287d3e0..60bd98306 100644 --- a/tests/EventEnvelopesT.cpp +++ b/tests/EventEnvelopesT.cpp @@ -7,6 +7,7 @@ #include "sfizz/ModifierHelpers.h" #include "sfizz/Buffer.h" #include "catch2/catch.hpp" +#include "TestHelpers.h" #include #include #include @@ -14,20 +15,6 @@ #include using namespace Catch::literals; -template -inline bool approxEqual(absl::Span lhs, absl::Span rhs, Type eps = 1e-3) -{ - if (lhs.size() != rhs.size()) - return false; - - for (size_t i = 0; i < rhs.size(); ++i) - if (rhs[i] != Approx(lhs[i]).epsilon(eps)) { - std::cerr << lhs[i] << " != " << rhs[i] << " at index " << i << '\n'; - return false; - } - - return true; -} const auto idModifier = [](float x) { return x; }; const auto twiceModifier = [](float x) { return 2 * x; }; diff --git a/tests/SIMDHelpersT.cpp b/tests/SIMDHelpersT.cpp index 6bdf8cf66..4bac07b10 100644 --- a/tests/SIMDHelpersT.cpp +++ b/tests/SIMDHelpersT.cpp @@ -7,6 +7,7 @@ #include "sfizz/simd/Common.h" #include "sfizz/SIMDHelpers.h" #include "sfizz/Panning.h" +#include "TestHelpers.h" #include "catch2/catch.hpp" #include #include @@ -20,39 +21,9 @@ template using aligned_vector = std::vector>; constexpr int bigBufferSize { 4095 }; -constexpr int medBufferSize { 127 }; +constexpr int medBufferSize { 1023 }; constexpr float fillValue { 1.3f }; -template -inline bool approxEqualMargin(absl::Span lhs, absl::Span rhs, Type eps = 1e-3) -{ - if (lhs.size() != rhs.size()) - return false; - - for (size_t i = 0; i < rhs.size(); ++i) - if (rhs[i] != Approx(lhs[i]).margin(eps)) { - std::cerr << lhs[i] << " != " << rhs[i] << " at index " << i << '\n'; - return false; - } - - return true; -} - -template -inline bool approxEqual(absl::Span lhs, absl::Span rhs, Type eps = 1e-3) -{ - if (lhs.size() != rhs.size()) - return false; - - for (size_t i = 0; i < rhs.size(); ++i) - if (rhs[i] != Approx(lhs[i]).epsilon(eps)) { - std::cerr << lhs[i] << " != " << rhs[i] << " at index " << i << '\n'; - return false; - } - - return true; -} - TEST_CASE("[Helpers] willAlign, prevAligned and unaligned tests") { aligned_vector array(16); @@ -430,8 +401,8 @@ TEST_CASE("[Helpers] Linear Ramp (SIMD)") TEST_CASE("[Helpers] Linear Ramp (SIMD vs scalar)") { const float start { 0.0f }; - std::vector outputScalar(bigBufferSize); - std::vector outputSIMD(bigBufferSize); + std::vector outputScalar(medBufferSize); + std::vector outputSIMD(medBufferSize); sfz::setSIMDOpStatus(sfz::SIMDOps::linearRamp, false); sfz::linearRamp(absl::MakeSpan(outputScalar), start, fillValue); sfz::setSIMDOpStatus(sfz::SIMDOps::linearRamp, true); @@ -442,8 +413,8 @@ TEST_CASE("[Helpers] Linear Ramp (SIMD vs scalar)") TEST_CASE("[Helpers] Linear Ramp unaligned (SIMD vs scalar)") { const float start { 0.0f }; - std::vector outputScalar(bigBufferSize); - std::vector outputSIMD(bigBufferSize); + std::vector outputScalar(medBufferSize); + std::vector outputSIMD(medBufferSize); sfz::setSIMDOpStatus(sfz::SIMDOps::linearRamp, false); sfz::linearRamp(absl::MakeSpan(outputScalar).subspan(1), start, fillValue); sfz::setSIMDOpStatus(sfz::SIMDOps::linearRamp, true); diff --git a/tests/SmoothersT.cpp b/tests/SmoothersT.cpp index 63c05141b..342da8e3b 100644 --- a/tests/SmoothersT.cpp +++ b/tests/SmoothersT.cpp @@ -7,6 +7,7 @@ #include "sfizz/OnePoleFilter.h" #include "sfizz/Smoothers.h" #include "catch2/catch.hpp" +#include "TestHelpers.h" // #include "cnpy.h" // #include "ghc/fs_std.hpp" #include @@ -16,21 +17,6 @@ #include using namespace Catch::literals; -template -inline bool approxEqual(const std::array& lhs, const std::array& rhs, Type epsilon = 1e-3) -{ - if (lhs.size() != rhs.size()) - return false; - - for (size_t i = 0; i < rhs.size(); ++i) - if (lhs[i] != Approx(rhs[i]).epsilon(epsilon)) { - std::cerr << lhs[i] << " != " << rhs[i] << " at index " << i << '\n'; - return false; - } - - return true; -} - template void testFilter(const std::array& input, const std::array& expectedLow, const std::array& expectedHigh, Type gain) { @@ -43,19 +29,19 @@ void testFilter(const std::array& input, const std::array& exp sfz::OnePoleFilter filter; filter.setGain(gain); filter.processLowpass(input, outputSpan); - REQUIRE(approxEqual(output, expectedLow)); + REQUIRE(approxEqual(absl::MakeConstSpan(output), absl::MakeConstSpan(expectedLow))); filter.reset(); filter.processLowpass(input, outputSpan, gains); - REQUIRE(approxEqual(output, expectedLow)); + REQUIRE(approxEqual(absl::MakeConstSpan(output), absl::MakeConstSpan(expectedLow))); filter.reset(); filter.processHighpass(input, outputSpan); - REQUIRE(approxEqual(output, expectedHigh)); + REQUIRE(approxEqual(absl::MakeConstSpan(output), absl::MakeConstSpan(expectedHigh))); filter.reset(); filter.processHighpass(input, outputSpan, gains); - REQUIRE(approxEqual(output, expectedHigh)); + REQUIRE(approxEqual(absl::MakeConstSpan(output), absl::MakeConstSpan(expectedHigh))); } constexpr std::array floatInput01 = { diff --git a/tests/TestFiles/kick.flac b/tests/TestFiles/kick.flac new file mode 100755 index 0000000000000000000000000000000000000000..79a2f4e6cd8b9d429dad9f833db4b26cb6f2809d GIT binary patch literal 28122 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 F{{m5EtQi0R literal 0 HcmV?d00001 diff --git a/tests/TestHelpers.h b/tests/TestHelpers.h index 8faa28b55..37d10de1a 100644 --- a/tests/TestHelpers.h +++ b/tests/TestHelpers.h @@ -12,6 +12,8 @@ #include "sfizz/Messaging.h" #include "catch2/catch.hpp" #include "sfizz/modulations/ModKey.h" +#include +#include class RegionCCView { public: @@ -148,18 +150,52 @@ std::string createDefaultGraph(std::vector lines, int numRegions = std::string createModulationDotGraph(std::vector lines); template -inline bool approxEqual(absl::Span lhs, absl::Span rhs, Type eps = 1e-3) +bool approxEqual(absl::Span lhs, absl::Span rhs, Type eps = 1e-3) { if (lhs.size() != rhs.size()) return false; + bool different = false; for (size_t i = 0; i < rhs.size(); ++i) - if (rhs[i] != Approx(lhs[i]).epsilon(eps)) { - std::cerr << lhs[i] << " != " << rhs[i] << " at index " << i << '\n'; - return false; + if (rhs[i] != Approx(lhs[i]).margin(eps)) { + std::cerr << lhs[i] << " != " << rhs[i] << " (delta " << std::abs(rhs[i] - lhs[i]) << ") at index " << i << '\n'; + different = true; + break; } - return true; + auto print_span = [](absl::Span span) { + if (span.empty()) { + std::cerr << "{ }" << '\n'; + return; + } + + std::cerr << "{ "; + if (span.size() < 16) { + for (unsigned i = 0; i < span.size() - 1; ++i) { + std::cerr << span[i] << ", "; + } + } else { + for (unsigned i = 0; i < 8; ++i) { + std::cerr << span[i] << ", "; + } + std::cerr << "..., "; + for (unsigned i = span.size() - 8; i < span.size() - 1; ++i) { + std::cerr << span[i] << ", "; + } + } + std::cerr << span.back() << " }" << '\n'; + }; + + if (different) { + std::cerr << std::setprecision(3) << std::fixed; + std::cerr << "Differences between spans" << '\n'; + std::cerr << "lhs: "; + print_span(lhs); + std::cerr << "rhs: "; + print_span(rhs); + } + + return !different; } /**