Added a check that a region is a generator for free-running the envelope

This commit is contained in:
Paul Fd 2020-04-12 10:30:36 +02:00
parent 9a1582892f
commit 09bad92cff
2 changed files with 12 additions and 13 deletions

View file

@ -40,11 +40,9 @@ void ADSREnvelope<Type>::reset(const EGDescription& desc, const Region& region,
releaseDelay = 0;
shouldRelease = false;
freeRunning = (
(region.trigger == SfzTrigger::release)
freeRunning = ((region.trigger == SfzTrigger::release)
|| (region.trigger == SfzTrigger::release_key)
|| region.loopMode == SfzLoopMode::one_shot
);
|| (region.loopMode == SfzLoopMode::one_shot && (region.isGenerator() || region.oscillator)));
currentValue = this->start;
currentState = State::Delay;
}
@ -117,8 +115,7 @@ void ADSREnvelope<Type>::getBlock(absl::Span<Type> output) noexcept
// release takes effect this frame
currentState = State::Release;
releaseDelay = -1;
}
else if (shouldRelease && releaseDelay > 0) {
} else if (shouldRelease && releaseDelay > 0) {
// prevent computing the segment further than release point
size = std::min<size_t>(size, releaseDelay);
}

View file

@ -294,33 +294,35 @@ inline F fp_from_parts(bool sgn, int ex, uint64_t mant)
return u.real;
}
template<class F>
template <class F>
inline bool fp_naninf(F x)
{
typedef FP_traits<F> T;
typedef typename T::same_size_int I;
union { F real; I integer; } u;
union {
F real;
I integer;
} u;
u.real = x;
const auto all_ones = ((1u << T::e_bits) - 1);
const auto ex = (u.integer >> T::m_bits) & all_ones;
return ex == all_ones;
}
template<class Type>
template <class Type>
bool hasNanInf(absl::Span<Type> span)
{
for (const auto& x: span)
for (const auto& x : span)
if (fp_naninf(x))
return true;
return false;
}
template<class Type>
template <class Type>
bool isValidAudio(absl::Span<Type> span)
{
for (const auto& x: span)
for (const auto& x : span)
if (x < -1.0f || x > 1.0f)
return false;