15 : m_unit_manager(unit_manager)
16 , m_access_control(access_control)
25 const std::shared_ptr<AudioBuffer>& buffer,
32 "BufferSupplyMixing: Invalid buffer for supplying");
36 if (buffer->get_channel_id() == channel) {
38 "BufferSupplyMixing: Buffer already has the correct channel ID {}", channel);
44 "BufferSupplyMixing: Token/channel combination out of range for supplying (token: {}, channel: {})",
45 static_cast<int>(
token), channel);
51 auto processing_chain = unit.get_chain(channel);
53 std::shared_ptr<MixProcessor> mix_processor = processing_chain->get_processor<
MixProcessor>(root_buffer);
56 mix_processor = std::make_shared<MixProcessor>();
57 processing_chain->add_processor(mix_processor, root_buffer);
60 return mix_processor->register_source(buffer,
mix,
false);
64 const std::shared_ptr<AudioBuffer>& buffer,
70 "BufferSupplyMixing: Invalid buffer for removal");
76 "BufferSupplyMixing: Token/channel combination out of range for removal (token: {}, channel: {})",
77 static_cast<int>(
token), channel);
83 auto processing_chain = unit.get_chain(channel);
85 if (std::shared_ptr<MixProcessor> mix_processor = processing_chain->get_processor<
MixProcessor>(root_buffer)) {
86 return mix_processor->remove_source(buffer);
96 const double* interleaved_data,
99 uint32_t num_channels)
106 uint32_t channels_to_process = std::min(num_channels, unit.channel_count);
108 for (uint32_t channel = 0; channel < channels_to_process; ++channel) {
109 auto& buffer_data = unit.get_buffer(channel)->get_data();
110 uint32_t frames_to_copy = std::min(num_frames,
static_cast<uint32_t
>(buffer_data.size()));
112 for (uint32_t frame = 0; frame < frames_to_copy; ++frame) {
113 buffer_data[frame] = interleaved_data[frame * num_channels + channel];
119 double* interleaved_data,
122 uint32_t num_channels)
const
129 uint32_t channels_to_process = std::min(num_channels, unit.channel_count);
131 for (uint32_t channel = 0; channel < channels_to_process; ++channel) {
132 const auto& buffer_data = unit.get_buffer(channel)->get_data();
133 uint32_t frames_to_copy = std::min(num_frames,
static_cast<uint32_t
>(buffer_data.size()));
135 for (uint32_t frame = 0; frame < frames_to_copy; ++frame) {
136 interleaved_data[frame * num_channels + channel] = buffer_data[frame];
146 const std::shared_ptr<AudioBuffer>& buffer,
147 const std::vector<uint32_t>& channels,
150 if (channels.empty()) {
152 "BufferSupplyMixing: No channels specified for cloning");
157 "BufferSupplyMixing: Invalid buffer for cloning");
163 "BufferSupplyMixing: Token not found for cloning");
169 std::vector<std::shared_ptr<AudioBuffer>> cloned_buffers {};
171 for (
const auto channel : channels) {
172 if (channel >= unit.channel_count) {
174 "BufferSupplyMixing: Channel {} out of range for cloning", channel);
175 return cloned_buffers;
178 auto cloned_buffer = buffer->clone_to(channel);
180 cloned_buffers.push_back(cloned_buffer);
183 return cloned_buffers;
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
void add_audio_buffer(const std::shared_ptr< AudioBuffer > &buffer, ProcessingToken token, uint32_t channel)
Adds an audio buffer to a token and channel.
Token-aware buffer and unit access patterns.
bool supply_audio_buffer_to(const std::shared_ptr< AudioBuffer > &buffer, ProcessingToken token, uint32_t channel, double mix=1.0)
Supplies an external audio buffer to a specific token and channel.
bool remove_supplied_audio_buffer(const std::shared_ptr< AudioBuffer > &buffer, ProcessingToken token, uint32_t channel)
Removes a previously supplied buffer from a token and channel.
void fill_audio_interleaved(double *interleaved_data, uint32_t num_frames, ProcessingToken token, uint32_t num_channels) const
Fills interleaved buffer from audio token channels.
TokenUnitManager & m_unit_manager
Reference to the token/unit manager.
BufferSupplyMixing(TokenUnitManager &unit_manager, BufferAccessControl &access_control)
Creates a new supply/mixing control handler.
std::vector< std::shared_ptr< AudioBuffer > > clone_audio_buffer_for_channels(const std::shared_ptr< AudioBuffer > &buffer, const std::vector< uint32_t > &channels, ProcessingToken token)
Clones an audio buffer for each channel in the specified list.
BufferAccessControl & m_access_control
Reference to the buffer access control.
void fill_audio_from_interleaved(const double *interleaved_data, uint32_t num_frames, ProcessingToken token, uint32_t num_channels)
Fills audio token channels from interleaved source data.
Processes multiple audio buffers and mixes their data into a single output buffer.
uint32_t get_audio_channel_count(ProcessingToken token) const
Gets the number of channels in an audio unit.
const RootAudioUnit & get_audio_unit(ProcessingToken token) const
Gets an existing audio unit without creating if missing.
bool has_audio_unit(ProcessingToken token) const
Checks if an audio unit exists for the given token.
RootAudioUnit & get_audio_unit_mutable(ProcessingToken token)
Gets an existing audio unit without creating if missing (mutable)
Token-scoped unit storage and lifecycle management.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Core
Core engine, backend, subsystems.
std::vector< double > mix(const std::vector< std::vector< double > > &streams)
Mix multiple data streams with equal weighting.
std::shared_ptr< RootAudioBuffer > get_buffer(uint32_t channel) const