Disable with sampleEnd == 0
This commit is contained in:
parent
cef44cbdb6
commit
17568510ac
4 changed files with 22 additions and 9 deletions
|
|
@ -92,11 +92,7 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode)
|
|||
offsetCC[opcode.parameters.back()] = *value;
|
||||
break;
|
||||
case hash("end"):
|
||||
if (opcode.value == "-1") {
|
||||
disabled = true;
|
||||
} else {
|
||||
setValueFromOpcode(opcode, sampleEnd, Default::sampleEndRange);
|
||||
}
|
||||
setValueFromOpcode(opcode, sampleEnd, Default::sampleEndRange);
|
||||
break;
|
||||
case hash("count"):
|
||||
setValueFromOpcode(opcode, sampleCount, Default::sampleCountRange);
|
||||
|
|
@ -1462,7 +1458,10 @@ float sfz::Region::getDelay() const noexcept
|
|||
|
||||
uint32_t sfz::Region::trueSampleEnd(Oversampling factor) const noexcept
|
||||
{
|
||||
return min(sampleEnd, loopRange.getEnd()) * static_cast<uint32_t>(factor);
|
||||
if (sampleEnd <= 0)
|
||||
return 0;
|
||||
|
||||
return min(static_cast<uint32_t>(sampleEnd), loopRange.getEnd()) * static_cast<uint32_t>(factor);
|
||||
}
|
||||
|
||||
uint32_t sfz::Region::loopStart(Oversampling factor) const noexcept
|
||||
|
|
@ -1619,3 +1618,8 @@ sfz::Region::Connection& sfz::Region::getOrCreateConnection(const ModKey& source
|
|||
connections.push_back(c);
|
||||
return connections.back();
|
||||
}
|
||||
|
||||
bool sfz::Region::disabled() const noexcept
|
||||
{
|
||||
return (sampleEnd == 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -261,6 +261,11 @@ struct Region {
|
|||
*/
|
||||
float getGainToEffectBus(unsigned number) const noexcept;
|
||||
|
||||
/**
|
||||
* @brief Check if a region is disabled, if its sample end is weakly negative for example.
|
||||
*/
|
||||
bool disabled() const noexcept;
|
||||
|
||||
const NumericId<Region> id;
|
||||
|
||||
// Sound source: sample playback
|
||||
|
|
@ -272,7 +277,6 @@ struct Region {
|
|||
int64_t offsetRandom { Default::offsetRandom }; // offset_random
|
||||
CCMap<int64_t> offsetCC { Default::offset };
|
||||
uint32_t sampleEnd { Default::sampleEndRange.getEnd() }; // end
|
||||
bool disabled { false }; // end=-1 and other disabling events
|
||||
absl::optional<uint32_t> sampleCount {}; // count
|
||||
absl::optional<SfzLoopMode> loopMode {}; // loopmode
|
||||
Range<uint32_t> loopRange { Default::loopRange }; //loopstart and loopend
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, float value,
|
|||
|
||||
this->region = region;
|
||||
|
||||
if (region->disabled)
|
||||
if (region->disabled())
|
||||
return;
|
||||
|
||||
switchState(State::playing);
|
||||
|
|
|
|||
|
|
@ -95,7 +95,12 @@ TEST_CASE("[Region] Parsing opcodes")
|
|||
region.parseOpcode({ "end", "184" });
|
||||
REQUIRE(region.sampleEnd == 184);
|
||||
region.parseOpcode({ "end", "-1" });
|
||||
REQUIRE(region.disabled);
|
||||
REQUIRE(region.disabled());
|
||||
region.parseOpcode({ "end", "2" });
|
||||
REQUIRE(!region.disabled());
|
||||
REQUIRE(region.sampleEnd == 2);
|
||||
region.parseOpcode({ "end", "0" });
|
||||
REQUIRE(region.disabled());
|
||||
}
|
||||
|
||||
SECTION("count")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue