#include "gsl/gsl-lite.hpp" #include "Globals.h" #include "Helpers.h" template void readInterleaved(gsl::span input, gsl::span outputLeft, gsl::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(gsl::span inputLeft, gsl::span inputRight, gsl::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(gsl::span inputLeft, gsl::span inputRight, gsl::span output) noexcept; template<> void readInterleaved(gsl::span input, gsl::span outputLeft, gsl::span outputRight) noexcept; template void fill(gsl::span output, T value) noexcept { std::fill(output.begin(), output.end(), value); } template<> void fill(gsl::span output, float value) noexcept; template void loopingSFZIndex(gsl::span inputLeft, gsl::span inputRight, gsl::span output); template void linearRamp(gsl::span output, T start, T end); template void exponentialRamp(gsl::span output, T start, T end); template void applyGain(T gain, gsl::span output); template void applyGain(gsl::span gain, gsl::span output);