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; releaseDelay = 0;
shouldRelease = false; shouldRelease = false;
freeRunning = ( freeRunning = ((region.trigger == SfzTrigger::release)
(region.trigger == SfzTrigger::release)
|| (region.trigger == SfzTrigger::release_key) || (region.trigger == SfzTrigger::release_key)
|| region.loopMode == SfzLoopMode::one_shot || (region.loopMode == SfzLoopMode::one_shot && (region.isGenerator() || region.oscillator)));
);
currentValue = this->start; currentValue = this->start;
currentState = State::Delay; currentState = State::Delay;
} }
@ -117,8 +115,7 @@ void ADSREnvelope<Type>::getBlock(absl::Span<Type> output) noexcept
// release takes effect this frame // release takes effect this frame
currentState = State::Release; currentState = State::Release;
releaseDelay = -1; releaseDelay = -1;
} } else if (shouldRelease && releaseDelay > 0) {
else if (shouldRelease && releaseDelay > 0) {
// prevent computing the segment further than release point // prevent computing the segment further than release point
size = std::min<size_t>(size, releaseDelay); 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; return u.real;
} }
template <class F>
template<class F>
inline bool fp_naninf(F x) inline bool fp_naninf(F x)
{ {
typedef FP_traits<F> T; typedef FP_traits<F> T;
typedef typename T::same_size_int I; typedef typename T::same_size_int I;
union { F real; I integer; } u; union {
F real;
I integer;
} u;
u.real = x; u.real = x;
const auto all_ones = ((1u << T::e_bits) - 1); const auto all_ones = ((1u << T::e_bits) - 1);
const auto ex = (u.integer >> T::m_bits) & all_ones; const auto ex = (u.integer >> T::m_bits) & all_ones;
return ex == all_ones; return ex == all_ones;
} }
template<class Type> template <class Type>
bool hasNanInf(absl::Span<Type> span) bool hasNanInf(absl::Span<Type> span)
{ {
for (const auto& x: span) for (const auto& x : span)
if (fp_naninf(x)) if (fp_naninf(x))
return true; return true;
return false; return false;
} }
template<class Type> template <class Type>
bool isValidAudio(absl::Span<Type> span) bool isValidAudio(absl::Span<Type> span)
{ {
for (const auto& x: span) for (const auto& x : span)
if (x < -1.0f || x > 1.0f) if (x < -1.0f || x > 1.0f)
return false; return false;