19 static_assert(std::is_floating_point_v<SampleType>);
20 static_assert(std::numeric_limits<SampleType>::max_exponent >
21 std::numeric_limits<std::size_t>::digits);
24 std::fill(gains.begin(), gains.end(), SampleType{0});
25 if (!std::isfinite(position))
26 position = SampleType{0};
27 if (position <= SampleType{0}) {
28 gains.front() = SampleType{1};
31 const auto size_exclusive = std::ldexp(SampleType{1}, std::numeric_limits<std::size_t>::digits);
32 if (position >= size_exclusive) {
33 gains.back() = SampleType{1};
36 const auto lower =
static_cast<std::size_t
>(position);
37 if (lower >= gains.size() - 1) {
38 gains.back() = SampleType{1};
41 const auto fraction = position -
static_cast<SampleType
>(lower);
bool nway_constant_power_gains(SampleType position, std::span< SampleType > gains) noexcept
Compute adjacent-path constant-power weights for a position in [0, N-1].
Definition nway_crossfade.hpp:18
void crossfade_gains(T u, CrossfadeGainLaw law, T &old_gain, T &new_gain) noexcept
Old/new blend gains for an ALREADY-SHAPED progress u (the caller applies any smoothstep/clamp first).
Definition crossfade.hpp:61