MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NodeBuffer.cpp
Go to the documentation of this file.
1#include "NodeBuffer.hpp"
2
4
6
7namespace MayaFlux::Buffers {
8
9NodeSourceProcessor::NodeSourceProcessor(std::shared_ptr<Nodes::Node> node, float mix, bool clear_before_process)
10 : m_node(std::move(node))
11 , m_mix(mix)
12 , m_clear_before_process(clear_before_process)
13{
14}
15
16void NodeSourceProcessor::on_attach(const std::shared_ptr<Buffer>& /*buffer*/)
17{
18 if (m_node) {
19 m_node->add_buffer_reference();
20 }
21}
22
23void NodeSourceProcessor::on_detach(const std::shared_ptr<Buffer>& /*buffer*/)
24{
25 if (m_node) {
26 m_node->remove_buffer_reference();
27 }
28}
29
30void NodeSourceProcessor::processing_function(const std::shared_ptr<Buffer>& buffer)
31{
32 if (!m_node) {
33 MF_RT_ERROR(Journal::Component::Buffers, Journal::Context::BufferProcessing, "NodeSourceProcessor has null node. Skipping processing.");
34 return;
35 }
36
37 try {
38 auto& buffer_data = std::dynamic_pointer_cast<AudioBuffer>(buffer)->get_data();
39
40 bool should_clear = m_clear_before_process;
41 if (auto node_buffer = std::dynamic_pointer_cast<NodeBuffer>(buffer)) {
42 should_clear = node_buffer->get_clear_before_process();
43 }
44
45 if (should_clear) {
46 buffer->clear();
47 }
48
50
51 } catch (const std::exception& e) {
52 error_rethrow(Journal::Component::Buffers, Journal::Context::BufferProcessing, std::source_location::current(), "Error processing node: {}", e.what());
53 }
54}
55
56std::vector<double> NodeSourceProcessor::get_node_data(uint32_t num_samples)
57{
58 return Buffers::extract_multiple_samples(m_node, num_samples);
59}
60
61NodeBuffer::NodeBuffer(uint32_t channel_id, uint32_t num_samples, std::shared_ptr<Nodes::Node> source, bool clear_before_process)
62 : AudioBuffer(channel_id, num_samples)
63 , m_source_node(std::move(source))
64 , m_clear_before_process(clear_before_process)
65{
66}
67
69{
71 m_default_processor->on_attach(shared_from_this());
72}
73
75{
77 clear();
78 }
79 m_default_processor->process(shared_from_this());
80}
81
82std::shared_ptr<BufferProcessor> NodeBuffer::create_default_processor()
83{
84 return std::make_shared<NodeSourceProcessor>(m_source_node);
85}
86
87}
#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.
void setup_processors(ProcessingToken token) override
Sets up audio processors for the specified processing token.
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.
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:9
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
bool m_clear_before_process
Whether to reset the buffer before adding node output.
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.
void processing_function(const std::shared_ptr< Buffer > &buffer) override
Captures node computation output into a buffer.
std::vector< double > get_node_data(uint32_t num_samples)
Gets a batch of data from the node.
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
std::vector< double > extract_multiple_samples(const std::shared_ptr< Nodes::Node > &node, size_t num_samples)
Extract multiple samples from a node into a vector.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
void update_buffer_with_node_data(const std::shared_ptr< Nodes::Node > &node, std::span< double > buffer, double mix)
Apply node output to an existing buffer with mixing.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
std::vector< double > mix(const std::vector< std::vector< double > > &streams)
Mix multiple data streams with equal weighting.
Definition Yantra.cpp:1019