Gracefully handle non-conforming floating point values for integer opcodes

This commit is contained in:
paulfd 2019-09-13 19:29:10 +02:00
parent 3da8109170
commit 965321166c
4 changed files with 14 additions and 5 deletions

View file

@ -46,11 +46,9 @@ public:
const std::vector<std::filesystem::path>& getIncludedFiles() const noexcept { return includedFiles; } const std::vector<std::filesystem::path>& getIncludedFiles() const noexcept { return includedFiles; }
void disableRecursiveIncludeGuard() { recursiveIncludeGuard = false; } void disableRecursiveIncludeGuard() { recursiveIncludeGuard = false; }
void enableRecursiveIncludeGuard() { recursiveIncludeGuard = true; } void enableRecursiveIncludeGuard() { recursiveIncludeGuard = true; }
protected: protected:
virtual void callback(std::string_view header, const std::vector<Opcode>& members) = 0; virtual void callback(std::string_view header, const std::vector<Opcode>& members) = 0;
std::filesystem::path rootDirectory { std::filesystem::current_path() }; std::filesystem::path rootDirectory { std::filesystem::current_path() };
private: private:
bool recursiveIncludeGuard { false }; bool recursiveIncludeGuard { false };
std::map<std::string, std::string> defines; std::map<std::string, std::string> defines;

View file

@ -133,17 +133,17 @@ void sfz::Synth::handleControlOpcodes(const std::vector<Opcode>& members)
{ {
for (auto& member : members) { for (auto& member : members) {
switch (hash(member.opcode)) { switch (hash(member.opcode)) {
case hash("Set_cc"): [[fallthrough]] case hash("Set_cc"): [[fallthrough]];
case hash("set_cc"): case hash("set_cc"):
if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter)) if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter))
setValueFromOpcode(member, ccState[*member.parameter], Default::ccRange); setValueFromOpcode(member, ccState[*member.parameter], Default::ccRange);
break; break;
case hash("Label_cc"): [[fallthrough]] case hash("Label_cc"): [[fallthrough]];
case hash("label_cc"): case hash("label_cc"):
if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter)) if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter))
ccNames.emplace_back(*member.parameter, member.value); ccNames.emplace_back(*member.parameter, member.value);
break; break;
case hash("Default_path"): [[fallthrough]] case hash("Default_path"): [[fallthrough]];
case hash("default_path"): case hash("default_path"):
if (auto newPath = std::filesystem::path(member.value); std::filesystem::exists(newPath)) if (auto newPath = std::filesystem::path(member.value); std::filesystem::exists(newPath))
rootDirectory = newPath; rootDirectory = newPath;

View file

@ -4,6 +4,7 @@
project(sfizz) project(sfizz)
set(SFIZZ_TEST_SOURCES set(SFIZZ_TEST_SOURCES
RegionT.cpp
RegexT.cpp RegexT.cpp
HelpersT.cpp HelpersT.cpp
HelpersT.cpp HelpersT.cpp

View file

@ -1011,4 +1011,14 @@ TEST_CASE("[Region] Parsing opcodes")
REQUIRE(region.amplitudeEG.ccStart->second == -100.0f); REQUIRE(region.amplitudeEG.ccStart->second == -100.0f);
REQUIRE(region.amplitudeEG.ccSustain->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);
} }