OSSIA
Open Scenario System for Interactive Application
forward_node.hpp
1 #pragma once
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 namespace ossia::nodes
7 {
8 class forward_node : public ossia::nonowning_graph_node
9 {
10 public:
11  forward_node()
12  {
13  m_inlets.push_back(&audio_in);
14  // m_inlets.push_back(&midi_in);
15  m_outlets.push_back(&audio_out);
16  // m_outlets.push_back(&midi_out);
17  }
18 
19  void run(const token_request& t, exec_state_facade) noexcept override
20  {
21  // OPTIMIZEME : we copy the ins & outs of the token more
22  // than necessary
23  {
24  ossia::audio_port& i = *audio_in;
25  ossia::audio_port& o = *audio_out;
26  if(!audio_out.has_gain)
27  {
28  o = i;
29  }
30  else
31  {
32  switch(i.channels())
33  {
34  case 0:
35  return;
36 
37  case 1:
38  process_audio_out_mono(i, audio_out);
39  break;
40 
41  default:
42  process_audio_out_general(i, audio_out);
43  break;
44  }
45  }
46  }
47  // {
48  // auto i = midi_in.target<ossia::midi_port>();
49  // auto o = midi_out.target<ossia::midi_port>();
50  // o->messages = i->messages;
51  // }
52  }
53 
54  ossia::audio_inlet audio_in;
55  // ossia::midi_inlet midi_in;
56  ossia::audio_outlet audio_out;
57  // ossia::midi_outlet midi_out;
58 };
59 
60 class interval final : public forward_node
61 {
62 public:
63  using forward_node::forward_node;
64 
65  ~interval()
66  {
67  if(m_inlets.size() == 4)
68  {
69  delete m_inlets[1];
70  delete m_inlets[2];
71  delete m_inlets[3];
72  m_inlets.resize(1);
73  }
74  }
75  [[nodiscard]] std::string label() const noexcept override { return "Interval"; }
76 
77  void run(const token_request& t, exec_state_facade f) noexcept override
78  {
79  forward_node::run(t, f);
80  if(m_inlets.size() >= 4)
81  {
82  {
83  ossia::value_port& vp = *m_inlets[1]->target<ossia::value_port>();
84  if(auto& data = vp.get_data(); !data.empty())
85  {
86  tempo = ossia::convert<float>(data.back().value);
87  }
88  }
89  {
90  ossia::value_port& vp = *m_inlets[3]->target<ossia::value_port>();
91  if(auto& data = vp.get_data(); !data.empty())
92  {
93  float seek_ms = ossia::convert<float>(data.back().value);
94  seek = ossia::flicks_per_millisecond<double> * seek_ms;
95  }
96  }
97  }
98  }
99 
100  static const constexpr float no_tempo = -1000.f;
101  float tempo{no_tempo};
102  int64_t seek{std::numeric_limits<int64_t>::min()};
103 };
104 class loop final : public forward_node
105 {
106 public:
107  using forward_node::forward_node;
108  [[nodiscard]] std::string label() const noexcept override { return "Loop"; }
109 };
110 class scenario final : public forward_node
111 {
112 public:
113  using forward_node::forward_node;
114  [[nodiscard]] std::string label() const noexcept override { return "Scenario"; }
115 };
116 }
constexpr OSSIA_INLINE auto min(const T a, const U b) noexcept -> typename std::conditional<(sizeof(T) > sizeof(U)), T, U >::type
min function tailored for values
Definition: math.hpp:125