diff --git a/external/benchmark b/external/benchmark new file mode 160000 index 00000000..090faecb --- /dev/null +++ b/external/benchmark @@ -0,0 +1 @@ +Subproject commit 090faecb454fbd6e6e17a75ef8146acb037118d4 diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 3d1a3bae..b308ef00 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -227,7 +227,7 @@ struct Region { uint32_t offsetRandom { Default::offsetRandom }; // offset_random uint32_t sampleEnd { Default::sampleEndRange.getEnd() }; // end absl::optional sampleCount {}; // count - SfzLoopMode loopMode { Default::loopMode }; // loopmode + absl::optional loopMode {}; // loopmode Range loopRange { Default::loopRange }; //loopstart and loopend // Instrument settings: voice lifecycle diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index e44d28c5..36330b45 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -252,11 +252,17 @@ bool sfz::Synth::loadSfzFile(const fs::path& filename) } region->sampleEnd = std::min(region->sampleEnd, fileInformation->end); - if (region->loopRange.getStart() == Default::loopRange.getStart()) - region->loopRange.setStart(fileInformation->loopBegin); + if (fileInformation->loopBegin != Default::loopRange.getStart() && + fileInformation->loopEnd != Default::loopRange.getEnd()) { + if (region->loopRange.getStart() == Default::loopRange.getStart()) + region->loopRange.setStart(fileInformation->loopBegin); - if (region->loopRange.getEnd() == Default::loopRange.getEnd()) - region->loopRange.setEnd(fileInformation->loopEnd); + if (region->loopRange.getEnd() == Default::loopRange.getEnd()) + region->loopRange.setEnd(fileInformation->loopEnd); + + if (!region->loopMode) + region->loopMode = SfzLoopMode::loop_continuous; + } if (fileInformation->numChannels == 2) region->isStereo = true; diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index 6bae7cd9..0a8ceb69 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -99,7 +99,7 @@ TEST_CASE("[Region] Parsing opcodes") SECTION("loop_mode") { - REQUIRE(region.loopMode == SfzLoopMode::no_loop); + REQUIRE( !region.loopMode ); region.parseOpcode({ "loop_mode", "no_loop" }); REQUIRE(region.loopMode == SfzLoopMode::no_loop); region.parseOpcode({ "loop_mode", "one_shot" }); @@ -112,7 +112,7 @@ TEST_CASE("[Region] Parsing opcodes") SECTION("loopmode") { - REQUIRE(region.loopMode == SfzLoopMode::no_loop); + REQUIRE( !region.loopMode ); region.parseOpcode({ "loopmode", "no_loop" }); REQUIRE(region.loopMode == SfzLoopMode::no_loop); region.parseOpcode({ "loopmode", "one_shot" });