2 #include <ossia/dataflow/graph_node.hpp>
3 #include <ossia/dataflow/port.hpp>
8 struct gain_node final :
public ossia::nonowning_graph_node
15 m_inlets.push_back(&audio_in);
16 m_inlets.push_back(&gain_in);
17 gain_in.target<ossia::value_port>()->type = ossia::decibel_u{};
18 m_outlets.push_back(&audio_out);
21 void run(
const ossia::token_request& t, ossia::exec_state_facade st) noexcept
override
23 auto& vals = gain_in.target<ossia::value_port>()->get_data();
26 ossia::linear{ossia::decibel{ossia::convert<float>(vals.back().value)}}
31 auto& out = *audio_out;
33 const auto [first_pos, N] = st.timings(t);
34 const int64_t last_pos = first_pos + N;
36 const auto channels = in.channels();
37 out.set_channels(channels);
39 for(std::size_t i = 0; i < channels; i++)
41 auto& in_c = in.channel(i);
42 auto& out_c = out.channel(i);
44 const int64_t cur_chan_size = in_c.size();
46 out_c.resize(st.bufferSize());
48 const auto* input = in_c.data();
49 auto* output = out_c.data();
50 if(cur_chan_size < last_pos)
52 for(int64_t j = first_pos; j < cur_chan_size; j++)
53 output[j] = gain * input[j];
55 for(int64_t j = cur_chan_size; j < last_pos; j++)
60 for(int64_t j = first_pos; j < last_pos; j++)
61 output[j] = gain * input[j];
67 ossia::audio_inlet audio_in;
68 ossia::value_inlet gain_in;
69 ossia::audio_outlet audio_out;
constexpr OSSIA_INLINE T clamp(T d, const T min, const T max) noexcept
clamp Returns the value bounded by a min and a max
Definition: math.hpp:154