MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
FilterProcessor.cpp
Go to the documentation of this file.
1#include "FilterProcessor.hpp"
3
5
6namespace MayaFlux::Buffers {
7
9{
10 if (m_use_internal) {
11 sample = m_filter->process_sample(sample);
12 return;
13 }
14
15 Nodes::atomic_inc_modulator_count(m_filter->m_modulator_count, 1);
16 uint32_t state = m_filter->m_state.load();
17
18 if (state & Utils::NodeState::PROCESSED) {
19 sample = m_filter->get_last_output();
20 } else {
21 sample = m_filter->process_sample(sample);
23 }
24
25 Nodes::atomic_dec_modulator_count(m_filter->m_modulator_count, 1);
27}
28
29void FilterProcessor::processing_function(const std::shared_ptr<Buffer>& buffer)
30{
31 if (!m_filter || !buffer)
32 return;
33
34 auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer);
35 if (!audio_buffer || audio_buffer->get_data().empty())
36 return;
37
38 if (m_pending_filter) {
40 m_pending_filter.reset();
41 m_use_internal = true;
42 }
43
44 auto& data = audio_buffer->get_data();
45
46 const auto& state = m_filter->m_state.load();
47
48 if (state == Utils::NodeState::INACTIVE) {
49 for (size_t i = 0; i < data.size(); ++i) {
50 m_filter->set_input_context(std::span<double>(data.data(), i));
51 data[i] = m_filter->process_sample(data[i]);
52 }
53 } else {
54 m_filter->save_state();
55 for (size_t i = 0; i < data.size(); ++i) {
56 m_filter->set_input_context(std::span<double>(data.data(), i));
57 data[i] = m_filter->process_sample(data[i]);
58 }
59 m_filter->restore_state();
60 }
61
62 m_filter->clear_input_context();
63}
64
65void FilterProcessor::on_attach(const std::shared_ptr<Buffer>& /*buffer*/)
66{
67 if (m_filter)
68 m_filter->reset();
69}
70
71} // namespace MayaFlux::Buffers
void processing_function(const std::shared_ptr< Buffer > &buffer) override
The core processing function that must be implemented by derived classes.
std::shared_ptr< Nodes::Filters::Filter > m_pending_filter
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
void process_single_sample(double &sample)
std::shared_ptr< Nodes::Filters::Filter > m_filter
void atomic_add_flag(std::atomic< Utils::NodeState > &state, Utils::NodeState flag)
Atomically adds a flag to a node state.
Definition NodeUtils.cpp:96
void try_reset_processed_state(std::shared_ptr< Node > node)
Attempts to reset the processed state of a node.
void atomic_inc_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically increments the modulator count by a specified amount.
void atomic_dec_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically decrements the modulator count by a specified amount.
@ INACTIVE
Engine is not processing this node.
Definition Utils.hpp:29
@ PROCESSED
Node has been processed this cycle.
Definition Utils.hpp:34