56template <FloatType T,
int MaxRoutes = 16>
73 int addRoute(std::function<T()> source, std::function<
void(T)> target,
74 T depth = T(1), T base = T(0), T smoothMs = T(20))
78 if (numRoutes_ >= MaxRoutes || !source || !target)
return -1;
79 auto& r = routes_[
static_cast<size_t>(numRoutes_)];
80 r.source = std::move(source);
81 r.target = std::move(target);
82 r.depth.store(depth, std::memory_order_relaxed);
84 r.smoothMs = std::max(smoothMs, T(0));
93 if (route >= 0 && route < numRoutes_)
94 routes_[
static_cast<size_t>(route)].depth.store(depth, std::memory_order_relaxed);
100 for (
int i = 0; i < numRoutes_; ++i)
102 routes_[
static_cast<size_t>(i)].source =
nullptr;
103 routes_[
static_cast<size_t>(i)].target =
nullptr;
116 void update(
int numSamples,
double sampleRate)
noexcept
118 const double dt =
static_cast<double>(numSamples) / std::max(sampleRate, 1.0);
119 for (
int i = 0; i < numRoutes_; ++i)
121 auto& r = routes_[
static_cast<size_t>(i)];
122 const T depth = r.depth.load(std::memory_order_relaxed);
123 const T value = r.base + r.source() * depth;
127 if (!std::isfinite(value))
132 if (!r.primed || r.smoothMs <= T(0))
139 const double a = std::exp(-dt * 1000.0 /
static_cast<double>(r.smoothMs));
140 r.state =
static_cast<T
>(a *
static_cast<double>(r.state)
141 + (1.0 - a) *
static_cast<double>(value));
150 std::function<T()> source;
151 std::function<void(T)> target;
152 std::atomic<T> depth { T(1) };
159 std::array<Route, static_cast<size_t>(MaxRoutes)> routes_ {};
Core mathematical utilities for digital signal processing.
Fixed-capacity source-to-target router with per-route depth/smoothing.
void setDepth(int route, T depth) noexcept
Changes a route's depth. Thread-safe (atomic, relaxed).
void update(int numSamples, double sampleRate) noexcept
Evaluates every route once. Call per audio block.
int addRoute(std::function< T()> source, std::function< void(T)> target, T depth=T(1), T base=T(0), T smoothMs=T(20))
Adds a route (call from setup/UI threads, not the audio callback).
void clear() noexcept
Removes all routes and releases their captures (setup threads only).
int getNumRoutes() const noexcept
Number of configured routes.
Main namespace for the DSPark framework.