From 8e4e6460d8fd505feec47cf57b7cdbb27b46b345 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Sun, 28 May 2023 16:37:23 +0200 Subject: [PATCH] Add a test --- tests/AudioFilesT.cpp | 31 +++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 1 + tests/TestFiles/kick.wv | Bin 0 -> 25154 bytes 3 files changed, 32 insertions(+) create mode 100644 tests/AudioFilesT.cpp create mode 100644 tests/TestFiles/kick.wv diff --git a/tests/AudioFilesT.cpp b/tests/AudioFilesT.cpp new file mode 100644 index 00000000..8046ca71 --- /dev/null +++ b/tests/AudioFilesT.cpp @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#include "AudioSpan.h" +#include "sfizz/Synth.h" +#include "TestHelpers.h" +#include "catch2/catch.hpp" +#include +using namespace Catch::literals; + +TEST_CASE("[AudioFiles] WavPack 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.wv 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/CMakeLists.txt b/tests/CMakeLists.txt index 8553aca9..db17ba1d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -57,6 +57,7 @@ set(SFIZZ_TEST_SOURCES MessagingT.cpp OversamplerT.cpp MemoryT.cpp + AudioFilesT.cpp DataHelpers.h DataHelpers.cpp ) diff --git a/tests/TestFiles/kick.wv b/tests/TestFiles/kick.wv new file mode 100644 index 0000000000000000000000000000000000000000..a00e5d9fa65e2ed39bfc9ea61bb96b6aefb14c1f GIT binary patch literal 25154 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
-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 literal 0 HcmV?d00001