diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 2d96835a..cad035b8 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -92,7 +92,11 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) offsetCC[opcode.parameters.back()] = *value; break; case hash("end"): - setValueFromOpcode(opcode, sampleEnd, Default::sampleEndRange); + if (opcode.value == "-1") { + disabled = true; + } else { + setValueFromOpcode(opcode, sampleEnd, Default::sampleEndRange); + } break; case hash("count"): setValueFromOpcode(opcode, sampleCount, Default::sampleCountRange); diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 4935a85e..4dc5cdef 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -272,6 +272,7 @@ struct Region { int64_t offsetRandom { Default::offsetRandom }; // offset_random CCMap offsetCC { Default::offset }; uint32_t sampleEnd { Default::sampleEndRange.getEnd() }; // end + bool disabled { false }; // end=-1 and other disabling events absl::optional sampleCount {}; // count absl::optional loopMode {}; // loopmode Range loopRange { Default::loopRange }; //loopstart and loopend diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index 9ea9b924..d4e68982 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -95,7 +95,7 @@ TEST_CASE("[Region] Parsing opcodes") region.parseOpcode({ "end", "184" }); REQUIRE(region.sampleEnd == 184); region.parseOpcode({ "end", "-1" }); - REQUIRE(region.sampleEnd == 0); + REQUIRE(region.disabled); } SECTION("count")