MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NodeBuffer.cpp
Go to the documentation of this file.
1#include "NodeBuffer.hpp"
2
5
6namespace MayaFlux::Buffers {
7NodeSourceProcessor::NodeSourceProcessor(std::shared_ptr<Nodes::Node> node, float mix, bool clear_before_process)
8 : m_node(std::move(node))
9 , m_mix(mix)
10 , m_clear_before_process(clear_before_process)
11{
12}
13
14void NodeSourceProcessor::processing_function(std::shared_ptr<Buffer> buffer)
15{
16 if (!m_node) {
17 MF_RT_ERROR(Journal::Component::Buffers, Journal::Context::BufferProcessing, "NodeSourceProcessor has null node. Skipping processing.");
18 return;
19 }
20
21 try {
22 auto& buffer_data = std::dynamic_pointer_cast<AudioBuffer>(buffer)->get_data();
23
24 bool should_clear = m_clear_before_process;
25 if (auto node_buffer = std::dynamic_pointer_cast<NodeBuffer>(buffer)) {
26 should_clear = node_buffer->get_clear_before_process();
27 }
28
29 if (should_clear) {
30 buffer->clear();
31 }
32
33 update_buffer(buffer_data);
34
35 } catch (const std::exception& e) {
36 error_rethrow(Journal::Component::Buffers, Journal::Context::BufferProcessing, std::source_location::current(), "Error processing node: {}", e.what());
37 }
38}
39
40std::vector<double> NodeSourceProcessor::get_node_data(uint32_t num_samples)
41{
42 std::vector<double> output(num_samples);
43 const auto& state = m_node->m_state.load();
44
45 if (state == Utils::NodeState::INACTIVE) {
46 for (size_t i = 0; i < num_samples; i++) {
47 output[i] = m_node->process_sample(0.F);
48 }
49 } else {
50 m_node->save_state();
51 for (size_t i = 0; i < num_samples; i++) {
52 output[i] = m_node->process_sample(0.F);
53 }
54 m_node->restore_state();
55 }
56
57 return output;
58}
59
60void NodeSourceProcessor::update_buffer(std::vector<double>& buffer_data)
61{
62 const auto& state = m_node->m_state.load();
63 if (state == Utils::NodeState::INACTIVE) {
64 for (double& i : buffer_data) {
65 i += m_node->process_sample(0.F) * m_mix;
66 }
67 return;
68 }
69 m_node->save_state();
70
71 for (double& i : buffer_data) {
72 i += m_node->process_sample(0.F) * m_mix;
73 }
74 m_node->restore_state();
75}
76
77NodeBuffer::NodeBuffer(uint32_t channel_id, uint32_t num_samples, std::shared_ptr<Nodes::Node> source, bool clear_before_process)
78 : AudioBuffer(channel_id, num_samples)
79 , m_source_node(std::move(source))
80 , m_clear_before_process(clear_before_process)
81{
83}
84
86{
88 clear();
89 }
90 m_default_processor->process(shared_from_this());
91}
92
93std::shared_ptr<BufferProcessor> NodeBuffer::create_default_processor()
94{
95 return std::make_shared<NodeSourceProcessor>(m_source_node);
96}
97}
#define MF_RT_ERROR(comp, ctx,...)
virtual void clear() override
Resets all audio samples in the buffer to silence.
std::shared_ptr< BufferProcessor > m_default_processor
Default audio transformation processor for this buffer.
Concrete audio implementation of the Buffer interface for double-precision audio data.
NodeBuffer(uint32_t channel_id, uint32_t num_samples, std::shared_ptr< Nodes::Node > source, bool clear_before_process=true)
Creates a new buffer connected to a computational node.
std::shared_ptr< BufferProcessor > create_default_processor() override
Creates the default processor for this buffer type.
std::shared_ptr< Nodes::Node > m_source_node
Source node that generates sequential data values.
bool m_clear_before_process
Whether to reset the buffer before adding node output.
void process_default() override
Processes this buffer using its default processor.
bool m_clear_before_process
Whether to reset the buffer before adding node output.
void update_buffer(std::vector< double > &buffer_data)
Updates the buffer data with node output.
NodeSourceProcessor(std::shared_ptr< Nodes::Node > node, float mix=0.5f, bool clear_before_process=true)
Creates a new processor that connects a computational node to data buffers.
Definition NodeBuffer.cpp:7
float m_mix
Interpolation coefficient between existing and incoming data (0.0-1.0)
std::shared_ptr< Nodes::Node > m_node
Source node that generates sequential data values.
std::vector< double > get_node_data(uint32_t num_samples)
Gets a batch of data from the node.
void processing_function(std::shared_ptr< Buffer > buffer) override
Captures node computation output into a buffer.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
@ INACTIVE
Engine is not processing this node.
Definition Utils.hpp:29
std::vector< double > mix(const std::vector< std::vector< double > > &streams)
Mix multiple data streams with equal weighting.
Definition Yantra.cpp:1019