10 std::shared_ptr<Nodes::Network::NodeNetwork> network,
12 bool clear_before_process)
13 : m_network(
std::move(network))
15 , m_clear_before_process(clear_before_process)
31 "NetworkAudioSourceProcessor has null network");
35 auto output_mode =
m_network->get_output_mode();
39 "NetworkAudioSourceProcessor: network is not an audio sink (mode={})",
40 static_cast<int>(output_mode));
46 "NetworkAudioSourceProcessor: network is disabled");
50 auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer);
56 if (
auto net_buf = std::dynamic_pointer_cast<NetworkAudioBuffer>(buffer)) {
57 should_clear = net_buf->get_clear_before_process();
64 if (!
m_network->is_processed_this_cycle()) {
70 m_network->add_channel_usage(audio_buffer->get_channel_id());
72 m_network->process_batch(audio_buffer->get_num_samples());
77 const auto net_output =
m_network->get_audio_buffer();
82 auto& buffer_data = audio_buffer->get_data();
83 const auto& network_data = *net_output;
85 auto scale =
static_cast<double>(
m_mix);
89 uint32_t channel = audio_buffer->get_channel_id();
90 double routing_amount =
m_network->get_routing_state().amount[channel];
91 scale *= routing_amount;
99 const size_t copy_size = std::min(buffer_data.size(), network_data.size());
101 if (should_clear && scale == 1.0) {
102 std::copy_n(network_data.begin(), copy_size, buffer_data.begin());
104 for (
size_t i = 0; i < copy_size; ++i) {
105 buffer_data[i] += network_data[i] * scale;
111 m_network->request_reset_from_channel(audio_buffer->get_channel_id());
117 uint32_t num_samples,
118 std::shared_ptr<Nodes::Network::NodeNetwork> network,
119 bool clear_before_process)
121 , m_network(
std::move(network))
122 , m_clear_before_process(clear_before_process)
124 auto mode =
m_network->get_output_mode();
127 error<std::invalid_argument>(
130 std::source_location::current(),
131 "NetworkAudioBuffer requires AUDIO_SINK or AUDIO_COMPUTE network, got mode={}",
132 static_cast<int>(mode));
152 return std::make_shared<NetworkAudioProcessor>(
m_network);
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_DEBUG(comp, ctx,...)
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.
void process_default() override
Applies the default audio transformation to the buffer's data.
NetworkAudioBuffer(uint32_t channel_id, uint32_t num_samples, std::shared_ptr< Nodes::Network::NodeNetwork > network, bool clear_before_process=true)
Creates a buffer connected to a NodeNetwork.
std::shared_ptr< BufferProcessor > create_default_processor() override
Creates a default audio transformation processor for this buffer type.
std::shared_ptr< Nodes::Network::NodeNetwork > m_network
void setup_processors(ProcessingToken token) override
Sets up audio processors for the specified processing token.
bool m_clear_before_process
void processing_function(const std::shared_ptr< Buffer > &buffer) override
Drives or reads network batch output into the buffer.
std::shared_ptr< Nodes::Network::NodeNetwork > m_network
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
NetworkAudioProcessor(std::shared_ptr< Nodes::Network::NodeNetwork > network, float mix=1.0F, bool clear_before_process=true)
Creates a processor connected to a NodeNetwork.
bool m_clear_before_process
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
@ AUDIO_COMPUTE
processed each cycle but not sent to output
@ AUDIO_SINK
Aggregated audio samples sent to output.
std::vector< double > mix(const std::vector< std::vector< double > > &streams)
Mix multiple data streams with equal weighting.