MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
AudioBuffer.cpp
Go to the documentation of this file.
1#include "AudioBuffer.hpp"
2
4
6
8
9namespace MayaFlux::Buffers {
10
12 : AudioBuffer(0, MayaFlux::Config::get_buffer_size())
13{
14}
15
16AudioBuffer::AudioBuffer(uint32_t channel_id, uint32_t num_samples)
17 : m_channel_id(channel_id)
18 , m_num_samples(num_samples)
19 , m_default_processor(nullptr)
20 , m_has_data(true)
21 , m_should_remove(false)
22 , m_process_default(true)
23 , m_processing_chain(std::make_shared<BufferProcessingChain>())
24 , m_is_processing(false)
25{
26 if (num_samples != MayaFlux::Config::get_buffer_size()) {
28 "AudioBuffer initialized with a non-default number of samples ({}). This may lead to unexpected behavior.",
29 num_samples);
30 }
31 m_data.resize(num_samples);
32}
33
34void AudioBuffer::setup(uint32_t channel, uint32_t num_samples)
35{
36 m_channel_id = channel;
37 resize(num_samples);
38}
39
40void AudioBuffer::resize(uint32_t num_samples)
41{
42 m_num_samples = num_samples;
43 m_data.resize(num_samples);
44}
45
47{
48 std::ranges::fill(m_data, 0.0);
49}
50
51void AudioBuffer::set_num_samples(uint32_t num_samples)
52{
53 m_num_samples = num_samples;
54 m_data.resize(num_samples);
55}
56
58{
60 m_default_processor->process(shared_from_this());
61 }
62}
63
64void AudioBuffer::set_default_processor(const std::shared_ptr<BufferProcessor>& processor)
65{
66 try {
68 m_default_processor->on_detach(shared_from_this());
69 }
70 if (processor) {
71 processor->on_attach(shared_from_this());
72 }
73 m_default_processor = processor;
74 } catch (const std::exception& e) {
76 std::source_location::current(),
77 "Error setting default processor: {}", e.what());
78 }
79}
80
81std::shared_ptr<Buffer> AudioBuffer::clone_to(uint8_t dest_desc)
82{
83 auto buf = clone_to(static_cast<uint32_t>(dest_desc));
84 return std::dynamic_pointer_cast<Buffer>(buf);
85}
86
87std::shared_ptr<AudioBuffer> AudioBuffer::clone_to(uint32_t channel)
88{
89 auto buffer = std::make_shared<AudioBuffer>(channel, m_num_samples);
90 buffer->get_data() = m_data;
91 buffer->set_default_processor(m_default_processor);
92 buffer->set_processing_chain(get_processing_chain(), true);
93
94 return buffer;
95}
96
97bool AudioBuffer::read_once(const std::shared_ptr<AudioBuffer>& buffer, bool force)
98{
99 if (buffer && buffer->get_num_samples() == m_num_samples) {
100 if (m_is_processing.load() || buffer->is_processing()) {
102 "read_once: Attempting to read from an audio buffer while it is being processed.");
103
104 if (!force) {
106 "read_once: Skipping read due to ongoing processing.");
107 return false;
108 }
110 "read_once: Forcing read despite ongoing processing. This may lead to data corruption.");
111 }
112 m_data = buffer->get_data();
113 m_has_data = true;
114 return true;
115 }
116
118 "read_once: Buffer read failed due to size mismatch or null buffer.");
119
120 return false;
121}
122
123void AudioBuffer::set_processing_chain(const std::shared_ptr<BufferProcessingChain>& chain, bool force)
124{
125 if (m_processing_chain && !force) {
126 m_processing_chain->merge_chain(chain);
127 return;
128 }
129 m_processing_chain = chain;
130}
131
132}
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
bool m_has_data
Whether the audio buffer has data to process this cycle.
virtual void setup(uint32_t channel, uint32_t num_samples)
Initializes the audio buffer with specified channel and capacity.
virtual void clear() override
Resets all audio samples in the buffer to silence.
virtual bool read_once(const std::shared_ptr< AudioBuffer > &buffer, bool force=false)
Reads audio data into the buffer from the audio backend.
uint32_t m_channel_id
Audio channel identifier for this buffer.
std::atomic< bool > m_is_processing
virtual void process_default() override
Applies the default audio transformation to the buffer's data.
uint32_t m_num_samples
Capacity of the buffer in audio samples.
virtual void resize(uint32_t num_samples)
Adjusts the audio buffer's sample capacity.
std::shared_ptr< BufferProcessingChain > m_processing_chain
Audio transformation processing chain for this buffer.
std::shared_ptr< BufferProcessor > m_default_processor
Default audio transformation processor for this buffer.
virtual void set_num_samples(uint32_t num_samples)
Sets the capacity of the audio buffer.
virtual void set_processing_chain(const std::shared_ptr< BufferProcessingChain > &chain, bool force=false) override
Sets the audio transformation chain for this buffer.
virtual void set_default_processor(const std::shared_ptr< BufferProcessor > &processor) override
Sets the default audio transformation processor for this buffer.
std::vector< double > m_data
Vector storing the actual double-precision audio sample data.
virtual std::shared_ptr< BufferProcessingChain > get_processing_chain() override
Gets the audio transformation chain attached to this buffer.
AudioBuffer()
Creates a new uninitialized audio buffer.
bool m_process_default
Whether the audio buffer should be processed using its default processor.
virtual std::shared_ptr< AudioBuffer > clone_to(uint32_t channel)
Creates a clone of this audio buffer for a specific channel.
Concrete audio implementation of the Buffer interface for double-precision audio data.
Advanced pipeline manager for multi-stage buffer transformations with backend optimization.
uint32_t get_buffer_size()
Gets the buffer size from the default engine.
Definition Config.cpp:51
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
Main namespace for the Maya Flux audio engine.
Definition LiveAid.hpp:6