MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
PolynomialProcessor.cpp
Go to the documentation of this file.
3
4namespace MayaFlux::Buffers {
5
7 const std::shared_ptr<Nodes::Generator::Polynomial>& polynomial,
8 ProcessMode mode,
9 size_t window_size)
10 : m_polynomial(polynomial)
11 , m_process_mode(mode)
12 , m_window_size(window_size)
13{
14}
15
16void PolynomialProcessor::process_span(std::span<double> data)
17{
18 if (!m_polynomial) {
19 return;
20 }
21
22 const auto& state = m_polynomial->m_state.load();
23
24 if (state == Utils::NodeState::INACTIVE) {
25 for (double& i : data) {
26 i = m_polynomial->process_sample(i);
27 }
28 } else {
29 m_polynomial->save_state();
30 for (double& i : data) {
31 i = m_polynomial->process_sample(i);
32 }
33 m_polynomial->restore_state();
34 }
35}
36
37void PolynomialProcessor::processing_function(std::shared_ptr<Buffer> buffer)
38{
39 if (!m_polynomial || !buffer || std::dynamic_pointer_cast<AudioBuffer>(buffer)->get_data().empty()) {
40 return;
41 }
45 m_use_internal = true;
46 }
47
48 auto& data = std::dynamic_pointer_cast<AudioBuffer>(buffer)->get_data();
49
50 switch (m_process_mode) {
52 process_span(std::span<double>(data.data(), data.size()));
53 break;
54
56 m_polynomial->reset();
57 process_span(std::span<double>(data.data(), data.size()));
58 break;
59
61 std::span<double> data_span { data };
62 for (size_t window_start = 0; window_start < data_span.size(); window_start += m_window_size) {
63 m_polynomial->reset();
64 size_t window_size = std::min(m_window_size, data_span.size() - window_start);
65 process_span(data_span.subspan(window_start, window_size));
66 }
67 break;
68 }
70 m_polynomial->set_buffer_context(std::span<double>(data.data(), data.size()));
71 process_span(std::span<double>(data.data(), data.size()));
72 m_polynomial->clear_buffer_context();
73 break;
74 }
75 }
76}
77
78void PolynomialProcessor::on_attach(std::shared_ptr<Buffer> /*buffer*/)
79{
80 m_polynomial->reset();
81}
82
83} // namespace MayaFlux::Buffers
void processing_function(std::shared_ptr< Buffer > buffer) override
Processes an audio buffer using the polynomial function.
bool m_use_internal
Whether to use the buffer's internal previous state.
void process_span(std::span< double > data)
Processes a span of data using the polynomial function.
size_t m_window_size
Window size for windowed processing.
ProcessMode
Processing mode for the polynomial processor.
@ BATCH
Process the entire buffer at once.
@ SAMPLE_BY_SAMPLE
Process each sample individually.
@ WINDOWED
Process using a sliding window.
@ BUFFER_CONTEXT
Process each sample with access to buffer history.
std::shared_ptr< Nodes::Generator::Polynomial > m_pending_polynomial
Internal polynomial node.
void on_attach(std::shared_ptr< Buffer > buffer) override
Called when the processor is attached to a buffer.
std::shared_ptr< Nodes::Generator::Polynomial > m_polynomial
Polynomial node for processing.
ProcessMode m_process_mode
Current processing mode.
@ INACTIVE
Engine is not processing this node.
Definition Utils.hpp:29