MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
FeedbackBuffer.cpp
Go to the documentation of this file.
1#include "FeedbackBuffer.hpp"
2
3namespace MayaFlux::Buffers {
4
5//-----------------------------------------------------------------------------
6// FeedbackBuffer
7//-----------------------------------------------------------------------------
8
9FeedbackBuffer::FeedbackBuffer(uint32_t channel_id, uint32_t num_samples,
10 float feedback, uint32_t feed_samples)
11 : AudioBuffer(channel_id, num_samples)
12 , m_feedback_amount(feedback)
13 , m_feed_samples(feed_samples)
14 , m_history(feed_samples)
15{
17}
18
20{
21 m_default_processor->process(shared_from_this());
22}
23
25{
26 m_feedback_amount = amount;
27 if (auto proc = std::dynamic_pointer_cast<FeedbackProcessor>(m_default_processor)) {
28 proc->set_feedback(amount);
29 }
30}
31
33{
34 m_feed_samples = samples;
36 if (auto proc = std::dynamic_pointer_cast<FeedbackProcessor>(m_default_processor)) {
37 proc->set_feed_samples(samples);
38 }
39}
40
41std::shared_ptr<BufferProcessor> FeedbackBuffer::create_default_processor()
42{
43 return std::make_shared<FeedbackProcessor>(m_feedback_amount, m_feed_samples);
44}
45
46//-----------------------------------------------------------------------------
47// FeedbackProcessor
48//-----------------------------------------------------------------------------
49
50FeedbackProcessor::FeedbackProcessor(float feedback, uint32_t feed_samples)
51 : m_feedback_amount(feedback)
52 , m_feed_samples(feed_samples)
53 , m_history(feed_samples)
54{
55}
56
57void FeedbackProcessor::on_attach(const std::shared_ptr<Buffer>& buffer)
58{
59 if (auto fb = std::dynamic_pointer_cast<FeedbackBuffer>(buffer)) {
60 m_active_history = &fb->get_history_buffer();
61
62 if (m_feed_samples != fb->get_feed_samples()) {
63 m_feed_samples = fb->get_feed_samples();
64 }
65
66 if (m_feedback_amount != fb->get_feedback()) {
67 fb->set_feedback(m_feedback_amount);
68 }
69 } else {
72 }
73}
74
75void FeedbackProcessor::on_detach(const std::shared_ptr<Buffer>& /*buffer*/)
76{
77 m_active_history = nullptr;
78}
79
81{
82 m_feed_samples = samples;
84
87 }
88}
89
90void FeedbackProcessor::processing_function(const std::shared_ptr<Buffer>& buffer)
91{
92 auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer);
93 if (!audio_buffer) {
94 return;
95 }
96
97 if (!m_active_history) {
98 if (auto fb = std::dynamic_pointer_cast<FeedbackBuffer>(buffer)) {
99 m_active_history = &fb->get_history_buffer();
100 } else {
102 }
103 }
104
105 auto& data = audio_buffer->get_data();
106
107 for (double& sample : data) {
108 double delayed = (*m_active_history)[m_feed_samples - 1];
109
110 double output = sample + (m_feedback_amount * delayed);
111
112 m_active_history->push(output);
113
114 sample = output;
115 }
116}
117
118} // namespace MayaFlux::Buffers
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.
FeedbackBuffer(uint32_t channel_id, uint32_t num_samples, float feedback=0.5F, uint32_t feed_samples=512)
Construct feedback buffer.
void set_feedback(float amount)
Set feedback coefficient.
Memory::HistoryBuffer< double > m_history
std::shared_ptr< BufferProcessor > create_default_processor() override
Creates a default audio transformation processor for this buffer type.
void set_feed_samples(uint32_t samples)
Set delay length in samples.
FeedbackProcessor(float feedback=0.5F, uint32_t feed_samples=512)
Construct feedback processor.
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
void processing_function(const std::shared_ptr< Buffer > &buffer) override
The core processing function that must be implemented by derived classes.
void set_feed_samples(uint32_t samples)
Set delay length in samples.
Memory::HistoryBuffer< double > * m_active_history
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
Memory::HistoryBuffer< double > m_history
void push(const T &value)
Push new value to front of history.
History buffer for difference equations and recursive relations.