MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
BufferSupplyMixing.cpp
Go to the documentation of this file.
2
9
10namespace MayaFlux::Buffers {
11
13 TokenUnitManager& unit_manager,
14 BufferAccessControl& access_control)
15 : m_unit_manager(unit_manager)
16 , m_access_control(access_control)
17{
18}
19
20// ============================================================================
21// Buffer Supply and Mixing
22// ============================================================================
23
25 const std::shared_ptr<AudioBuffer>& buffer,
27 uint32_t channel,
28 double mix)
29{
30 if (!buffer) {
32 "BufferSupplyMixing: Invalid buffer for supplying");
33 return false;
34 }
35
36 if (buffer->get_channel_id() == channel) {
38 "BufferSupplyMixing: Buffer already has the correct channel ID {}", channel);
39 return false;
40 }
41
44 "BufferSupplyMixing: Token/channel combination out of range for supplying (token: {}, channel: {})",
45 static_cast<int>(token), channel);
46 return false;
47 }
48
50 auto root_buffer = unit.get_buffer(channel);
51 auto processing_chain = unit.get_chain(channel);
52
53 std::shared_ptr<MixProcessor> mix_processor = processing_chain->get_processor<MixProcessor>(root_buffer);
54
55 if (!mix_processor) {
56 mix_processor = std::make_shared<MixProcessor>();
57 processing_chain->add_processor(mix_processor, root_buffer);
58 }
59
60 return mix_processor->register_source(buffer, mix, false);
61}
62
64 const std::shared_ptr<AudioBuffer>& buffer,
66 uint32_t channel)
67{
68 if (!buffer) {
70 "BufferSupplyMixing: Invalid buffer for removal");
71 return false;
72 }
73
76 "BufferSupplyMixing: Token/channel combination out of range for removal (token: {}, channel: {})",
77 static_cast<int>(token), channel);
78 return false;
79 }
80
82 auto root_buffer = unit.get_buffer(channel);
83 auto processing_chain = unit.get_chain(channel);
84
85 if (std::shared_ptr<MixProcessor> mix_processor = processing_chain->get_processor<MixProcessor>(root_buffer)) {
86 return mix_processor->remove_source(buffer);
87 }
88 return false;
89}
90
91// ============================================================================
92// Interleaved Data I/O
93// ============================================================================
94
96 const double* interleaved_data,
97 uint32_t num_frames,
99 uint32_t num_channels)
100{
102 return;
103 }
104
106 uint32_t channels_to_process = std::min(num_channels, unit.channel_count);
107
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()));
111
112 for (uint32_t frame = 0; frame < frames_to_copy; ++frame) {
113 buffer_data[frame] = interleaved_data[frame * num_channels + channel];
114 }
115 }
116}
117
119 double* interleaved_data,
120 uint32_t num_frames,
122 uint32_t num_channels) const
123{
125 return;
126 }
127
128 const auto& unit = m_unit_manager.get_audio_unit(token);
129 uint32_t channels_to_process = std::min(num_channels, unit.channel_count);
130
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()));
134
135 for (uint32_t frame = 0; frame < frames_to_copy; ++frame) {
136 interleaved_data[frame * num_channels + channel] = buffer_data[frame];
137 }
138 }
139}
140
141// ============================================================================
142// Buffer Cloning
143// ============================================================================
144
145std::vector<std::shared_ptr<AudioBuffer>> BufferSupplyMixing::clone_audio_buffer_for_channels(
146 const std::shared_ptr<AudioBuffer>& buffer,
147 const std::vector<uint32_t>& channels,
149{
150 if (channels.empty()) {
152 "BufferSupplyMixing: No channels specified for cloning");
153 return {};
154 }
155 if (!buffer) {
157 "BufferSupplyMixing: Invalid buffer for cloning");
158 return {};
159 }
160
163 "BufferSupplyMixing: Token not found for cloning");
164 return {};
165 }
166
168
169 std::vector<std::shared_ptr<AudioBuffer>> cloned_buffers {};
170
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;
176 }
177
178 auto cloned_buffer = buffer->clone_to(channel);
179 m_access_control.add_audio_buffer(cloned_buffer, token, channel);
180 cloned_buffers.push_back(cloned_buffer);
181 }
182
183 return cloned_buffers;
184}
185
186} // namespace MayaFlux::Buffers
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
Definition Timers.cpp:8
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.
Definition Yantra.cpp:1019
std::shared_ptr< RootAudioBuffer > get_buffer(uint32_t channel) const