8 : m_transform(
std::move(transform))
9 , m_lag_blocks(
std::
max<size_t>(lag_blocks, 1))
10 , m_coefficients(
std::move(coefficients))
29 return std::dynamic_pointer_cast<AudioBuffer>(
buffer) !=
nullptr;
35 return found ==
m_states.end() ? 0.0 : found->second.feature;
44 return found->second.coefs;
57 auto audio = std::dynamic_pointer_cast<AudioBuffer>(
buffer);
62 auto& data = audio->get_data();
63 const size_t samples = data.size();
69 State& state = found->second;
76 state.
kept.assign(samples, 0.0);
80 const std::vector<double>& previous = state.
blocks.at(state.
next);
83 std::ranges::copy(data, state.
kept.begin());
86 state.
feature =
m_transform(std::span<double>(data), std::span<const double>(previous), std::span<double>(state.
coefs));
std::shared_ptr< NetworkGeometryBuffer > buffer
std::unordered_map< const Buffer *, State > m_states
bool is_compatible_with(const std::shared_ptr< Buffer > &buffer) const override
Checks if this processor can handle the specified buffer type.
void processing_function(const std::shared_ptr< Buffer > &buffer) override
The core processing function that must be implemented by derived classes.
BlockFeedbackProcessor(Transform transform, size_t lag_blocks=1, std::vector< double > coefficients={})
std::span< double > coefficients(const std::shared_ptr< Buffer > &buffer)
The coefficient array of one attached buffer, empty if it is not attached.
std::function< double(std::span< double >, std::span< const double >, std::span< double >)> Transform
The per-block function.
std::vector< double > m_coefficients
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
std::function< void(double)> m_observer
std::shared_ptr< BlockFeedbackProcessor > clone() const
Same configuration, no attached state.
double feature(const std::shared_ptr< Buffer > &buffer) const
The feature of the last block of one attached buffer, zero if none.
std::vector< double > kept
std::vector< double > coefs
std::vector< std::vector< double > > blocks