#include "absl/types/span.h" #include "Globals.h" #include "Helpers.h" #include template void readInterleaved(absl::Span input, absl::Span outputLeft, absl::Span outputRight) noexcept { // The size of the output is not big enough for the input... ASSERT(outputLeft.size() >= input.size() / 2); ASSERT(outputRight.size() >= input.size() / 2); auto* in = input.begin(); auto* lOut = outputLeft.begin(); auto* rOut = outputRight.begin(); while (in < (input.end() - 1) && lOut < outputLeft.end() && rOut < outputRight.end()) { *lOut++ = *in++; *rOut++ = *in++; } } template void writeInterleaved(absl::Span inputLeft, absl::Span inputRight, absl::Span output) noexcept { ASSERT(inputLeft.size() <= output.size() / 2); ASSERT(inputRight.size() <= output.size() / 2); auto* lIn = inputLeft.begin(); auto* rIn = inputRight.begin(); auto* out = output.begin(); while (lIn < inputLeft.end() && rIn < inputRight.end() && out < (output.end() - 1)) { *out++ = *lIn++; *out++ = *rIn++; } } // Specializations template<> void writeInterleaved(absl::Span inputLeft, absl::Span inputRight, absl::Span output) noexcept; template<> void readInterleaved(absl::Span input, absl::Span outputLeft, absl::Span outputRight) noexcept; template void fill(absl::Span output, T value) noexcept { std::fill(output.begin(), output.end(), value); } template<> void fill(absl::Span output, float value) noexcept; template void exp(absl::Span input, absl::Span output) noexcept { ASSERT(output.size() >= input.size()); auto sentinel = std::min(input.size(), output.size()); for (decltype(sentinel) i = 0; i < sentinel; ++i) output[i] = std::exp(input[i]); } template<> void exp(absl::Span input, absl::Span output) noexcept; template void log(absl::Span input, absl::Span output) noexcept { ASSERT(output.size() >= input.size()); auto sentinel = std::min(input.size(), output.size()); for (decltype(sentinel) i = 0; i < sentinel; ++i) output[i] = std::log(input[i]); } template<> void log(absl::Span input, absl::Span output) noexcept; template void sin(absl::Span input, absl::Span output) noexcept { ASSERT(output.size() >= input.size()); auto sentinel = std::min(input.size(), output.size()); for (decltype(sentinel) i = 0; i < sentinel; ++i) output[i] = std::sin(input[i]); } template<> void sin(absl::Span input, absl::Span output) noexcept; template void cos(absl::Span input, absl::Span output) noexcept { ASSERT(output.size() >= input.size()); auto sentinel = std::min(input.size(), output.size()); for (decltype(sentinel) i = 0; i < sentinel; ++i) output[i] = std::cos(input[i]); } template<> void cos(absl::Span input, absl::Span output) noexcept; template void loopingSFZIndex(absl::Span inputLeft, absl::Span inputRight, absl::Span output); template void linearRamp(absl::Span output, T start, T end); template void exponentialRamp(absl::Span output, T start, T end); template void applyGain(T gain, absl::Span output); template void applyGain(absl::Span gain, absl::Span output);