diff --git a/src/sfizz/ADSREnvelope.cpp b/src/sfizz/ADSREnvelope.cpp index d2f3daff..bb86115b 100644 --- a/src/sfizz/ADSREnvelope.cpp +++ b/src/sfizz/ADSREnvelope.cpp @@ -40,11 +40,9 @@ void ADSREnvelope::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::getBlock(absl::Span 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, releaseDelay); } diff --git a/src/sfizz/MathHelpers.h b/src/sfizz/MathHelpers.h index 7d7aae6e..9fa734f1 100644 --- a/src/sfizz/MathHelpers.h +++ b/src/sfizz/MathHelpers.h @@ -294,33 +294,35 @@ inline F fp_from_parts(bool sgn, int ex, uint64_t mant) return u.real; } - -template +template inline bool fp_naninf(F x) { typedef FP_traits 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 +template bool hasNanInf(absl::Span span) { - for (const auto& x: span) + for (const auto& x : span) if (fp_naninf(x)) return true; return false; } -template +template bool isValidAudio(absl::Span span) { - for (const auto& x: span) + for (const auto& x : span) if (x < -1.0f || x > 1.0f) return false;