MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
InputAudioBuffer.cpp
Go to the documentation of this file.
2
3namespace MayaFlux::Buffers {
4
5InputAudioBuffer::InputAudioBuffer(uint32_t channel_id, uint32_t num_samples)
6 : AudioBuffer(channel_id, num_samples)
7{
8}
9
10void InputAudioBuffer::write_to(std::shared_ptr<AudioBuffer> buffer)
11{
12 if (!buffer) {
13 std::cerr << "InputAudioBuffer: Attempted to write to null buffer" << std::endl;
14 return;
15 }
16
17 const auto& src_data = get_data();
18 auto& dst_data = buffer->get_data();
19
20 if (dst_data.size() != src_data.size()) {
21 dst_data.resize(src_data.size());
22 }
23
24 std::copy(src_data.begin(), src_data.end(), dst_data.begin());
25}
26
27void InputAudioBuffer::register_listener(std::shared_ptr<AudioBuffer> buffer)
28{
29 if (!buffer) {
30 std::cerr << "InputAudioBuffer: Attempted to register null listener" << std::endl;
31 return;
32 }
33
34 if (auto processor = std::dynamic_pointer_cast<InputAccessProcessor>(get_default_processor())) {
35 processor->add_listener(buffer);
36 }
37}
38
39void InputAudioBuffer::unregister_listener(std::shared_ptr<AudioBuffer> buffer)
40{
41 if (auto processor = std::dynamic_pointer_cast<InputAccessProcessor>(get_default_processor())) {
42 processor->remove_listener(buffer);
43 }
44}
45
47{
48 if (auto processor = std::dynamic_pointer_cast<InputAccessProcessor>(get_default_processor())) {
49 processor->clear_listeners();
50 }
51}
52
53void InputAccessProcessor::processing_function(std::shared_ptr<Buffer> buffer)
54{
55 auto input_buffer = std::dynamic_pointer_cast<InputAudioBuffer>(buffer);
56 if (!input_buffer)
57 return;
58
59 for (auto& listener : m_listeners) {
60 if (!listener)
61 continue;
62
63 input_buffer->write_to(listener);
64 }
65}
66
67void InputAccessProcessor::on_attach(std::shared_ptr<Buffer> buffer)
68{
69 auto input_buffer = std::dynamic_pointer_cast<InputAudioBuffer>(buffer);
70 if (!input_buffer) {
71 throw std::runtime_error("InputAccessProcessor can only be attached to InputAudioBuffer");
72 }
73}
74
75bool InputAccessProcessor::is_compatible_with(std::shared_ptr<Buffer> buffer) const
76{
77 return std::dynamic_pointer_cast<InputAudioBuffer>(buffer) != nullptr;
78}
79
80void InputAccessProcessor::add_listener(std::shared_ptr<AudioBuffer> buffer)
81{
82 if (!buffer)
83 return;
84
85 auto it = std::find(m_listeners.begin(), m_listeners.end(), buffer);
86 if (it == m_listeners.end()) {
87 m_listeners.push_back(buffer);
88 }
89}
90
91void InputAccessProcessor::remove_listener(std::shared_ptr<AudioBuffer> buffer)
92{
93 auto it = std::find(m_listeners.begin(), m_listeners.end(), buffer);
94 if (it != m_listeners.end()) {
95 m_listeners.erase(it);
96 }
97}
98
99}
virtual std::vector< double > & get_data()
Gets mutable access to the buffer's underlying audio data.
virtual std::shared_ptr< BufferProcessor > get_default_processor() const override
Gets the current default audio transformation processor.
Concrete audio implementation of the Buffer interface for double-precision audio data.
void processing_function(std::shared_ptr< Buffer > buffer) override
Main processing function - dispatches data to listeners.
void on_attach(std::shared_ptr< Buffer > buffer) override
Called when processor is attached to a buffer.
void remove_listener(std::shared_ptr< AudioBuffer > buffer)
Removes a listener buffer.
void add_listener(std::shared_ptr< AudioBuffer > buffer)
Adds a listener buffer.
bool is_compatible_with(std::shared_ptr< Buffer > buffer) const override
Checks compatibility with buffer type.
std::vector< std::shared_ptr< AudioBuffer > > m_listeners
void unregister_listener(std::shared_ptr< AudioBuffer > buffer)
Unregisters a listener buffer.
void write_to(std::shared_ptr< AudioBuffer > buffer)
Writes buffer data to a specific listener buffer.
void register_listener(std::shared_ptr< AudioBuffer > buffer)
Registers a buffer as a listener of this input.
void clear_listeners()
Clears all registered listeners.
InputAudioBuffer(uint32_t channel_id, uint32_t num_samples)
Constructor - only BufferManager can create.