2#include <ossia/dataflow/audio_port.hpp>
3#include <ossia/dataflow/graph_node.hpp>
4#include <ossia/dataflow/midi_port.hpp>
5#include <ossia/dataflow/port.hpp>
6#include <ossia/math/safe_math.hpp>
9class forward_node :
public ossia::nonowning_graph_node
14 m_inlets.push_back(&audio_in);
16 m_outlets.push_back(&audio_out);
20 [[nodiscard]] std::string label() const noexcept
override {
return "forward_node"; }
21 void run(
const token_request& t, exec_state_facade)
noexcept override
26 ossia::audio_port& i = *audio_in;
27 ossia::audio_port& o = *audio_out;
28 if(!audio_out.has_gain)
40 process_audio_out_mono(i, audio_out);
44 process_audio_out_general(i, audio_out);
56 ossia::audio_inlet audio_in;
58 ossia::audio_outlet audio_out;
62class interval final :
public forward_node
65 using forward_node::forward_node;
69 if(m_inlets.size() == 4)
77 [[nodiscard]] std::string label() const noexcept
override {
return "Interval"; }
79 void run(
const token_request& t, exec_state_facade f)
noexcept override
81 forward_node::run(t, f);
82 if(m_inlets.size() >= 4)
85 ossia::value_port& vp = *m_inlets[1]->target<ossia::value_port>();
86 if(
auto& data = vp.get_data(); !data.empty())
88 tempo = ossia::convert<float>(data.back().value);
92 ossia::value_port& vp = *m_inlets[2]->target<ossia::value_port>();
93 if(
auto& data = vp.get_data(); !data.empty())
95 const float s = ossia::convert<float>(data.back().value);
96 if(ossia::safe_isfinite(s) && s > no_speed && s < -no_speed)
101 ossia::value_port& vp = *m_inlets[3]->target<ossia::value_port>();
102 if(
auto& data = vp.get_data(); !data.empty())
104 float seek_ms = ossia::convert<float>(data.back().value);
105 seek = ossia::flicks_per_millisecond<double> * seek_ms;
111 static const constexpr float no_tempo = -1000.f;
112 static const constexpr float no_speed = -1000.f;
113 float tempo{no_tempo};
120 float speed_override{no_speed};
121 int64_t seek{std::numeric_limits<int64_t>::min()};
123class loop final :
public forward_node
126 using forward_node::forward_node;
127 [[nodiscard]] std::string label() const noexcept
override {
return "Loop"; }
129class scenario final :
public forward_node
132 using forward_node::forward_node;
133 [[nodiscard]] std::string label() const noexcept
override {
return "Scenario"; }