From 965321166cd871d797322e718915de0c2e2aed5f Mon Sep 17 00:00:00 2001 From: paulfd Date: Fri, 13 Sep 2019 19:29:10 +0200 Subject: [PATCH] Gracefully handle non-conforming floating point values for integer opcodes --- sfizz/Parser.h | 2 -- sfizz/Synth.cpp | 6 +++--- tests/CMakeLists.txt | 1 + tests/RegionT.cpp | 10 ++++++++++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/sfizz/Parser.h b/sfizz/Parser.h index 56375c47..3015d9a2 100644 --- a/sfizz/Parser.h +++ b/sfizz/Parser.h @@ -46,11 +46,9 @@ public: const std::vector& getIncludedFiles() const noexcept { return includedFiles; } void disableRecursiveIncludeGuard() { recursiveIncludeGuard = false; } void enableRecursiveIncludeGuard() { recursiveIncludeGuard = true; } - protected: virtual void callback(std::string_view header, const std::vector& members) = 0; std::filesystem::path rootDirectory { std::filesystem::current_path() }; - private: bool recursiveIncludeGuard { false }; std::map defines; diff --git a/sfizz/Synth.cpp b/sfizz/Synth.cpp index 2c2ba845..4ccc0281 100644 --- a/sfizz/Synth.cpp +++ b/sfizz/Synth.cpp @@ -133,17 +133,17 @@ void sfz::Synth::handleControlOpcodes(const std::vector& members) { for (auto& member : members) { switch (hash(member.opcode)) { - case hash("Set_cc"): [[fallthrough]] + case hash("Set_cc"): [[fallthrough]]; case hash("set_cc"): if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter)) setValueFromOpcode(member, ccState[*member.parameter], Default::ccRange); break; - case hash("Label_cc"): [[fallthrough]] + case hash("Label_cc"): [[fallthrough]]; case hash("label_cc"): if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter)) ccNames.emplace_back(*member.parameter, member.value); break; - case hash("Default_path"): [[fallthrough]] + case hash("Default_path"): [[fallthrough]]; case hash("default_path"): if (auto newPath = std::filesystem::path(member.value); std::filesystem::exists(newPath)) rootDirectory = newPath; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index edba18fc..6c901419 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -4,6 +4,7 @@ project(sfizz) set(SFIZZ_TEST_SOURCES + RegionT.cpp RegexT.cpp HelpersT.cpp HelpersT.cpp diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index cbeb69a2..44afceeb 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -1011,4 +1011,14 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.amplitudeEG.ccStart->second == -100.0f); REQUIRE(region.amplitudeEG.ccSustain->second == -100.0f); } +} + +// Specific region bugs +TEST_CASE("[Region] Non-conforming floating point values in integer opcodes") +{ + sfz::Region region; + region.parseOpcode({ "offset", "2014.5" }); + REQUIRE(region.offset == 2014); + region.parseOpcode({ "pitch_keytrack", "-2.1" }); + REQUIRE(region.pitchKeytrack == -2); } \ No newline at end of file