OSSIA
Open Scenario System for Interactive Application
execution_state.hpp
1 #pragma once
2 #include <ossia/dataflow/dataflow_fwd.hpp>
3 #include <ossia/dataflow/graph/graph_interface.hpp>
4 #include <ossia/dataflow/value_vector.hpp>
5 #include <ossia/detail/lockfree_queue.hpp>
6 #include <ossia/detail/ptr_set.hpp>
7 #include <ossia/network/base/device.hpp>
8 #if defined(OSSIA_SMALL_VECTOR)
9 #include <libremidi/message.hpp>
10 #else
11 namespace libremidi
12 {
13 struct message;
14 }
15 #endif
16 namespace ossia
17 {
18 namespace net::midi
19 {
20 class midi_protocol;
21 class midi_parameter;
22 }
23 class state;
24 class message_queue;
25 class audio_parameter;
26 struct typed_value;
27 struct timed_value;
28 struct local_pull_visitor;
29 struct global_pull_visitor;
30 struct state_exec_visitor;
31 struct execution_state_policy;
32 struct OSSIA_EXPORT execution_state : public Nano::Observer
33 {
34  execution_state();
35  execution_state(const execution_state&) = delete;
36  execution_state(execution_state&&) = delete;
37  execution_state& operator=(const execution_state&) = delete;
38  execution_state& operator=(execution_state&&) = delete;
39  ~execution_state();
40 
41  void set_policy(const tick_setup_options&);
42 
44  void register_device(ossia::net::device_base* d);
45  void unregister_device(net::device_base* d);
46 
47  const ossia::small_vector<ossia::net::device_base*, 4>& edit_devices() const noexcept
48  {
49  return m_devices_edit;
50  }
51 
53  void register_port(const ossia::inlet& port);
54  void register_port(const ossia::outlet& port);
55  void unregister_port(const ossia::inlet& port);
56  void unregister_port(const ossia::outlet& port);
57 
58  const ossia::small_vector<ossia::net::device_base*, 4>& exec_devices() const noexcept
59  {
60  return m_devices_exec;
61  }
62  ossia::net::node_base* find_node(std::string_view name) const noexcept
63  {
64  for(auto dev : m_devices_exec)
65  {
66  if(auto res = ossia::net::find_node(dev->get_root_node(), name))
67  return res;
68  }
69  return nullptr;
70  }
71 
72  template <typename T>
73  auto get_value_or(std::string_view v, const T& val) noexcept
74  {
75  if(auto node = find_node(v))
76  return ossia::convert<T>(node->get_parameter()->value());
77  return val;
78  }
79 
80  void begin_tick();
81 
82  void clear_devices();
83  void reset();
84 
85  void advance_tick(std::size_t);
86  void apply_device_changes();
87 
88  void find_and_copy(ossia::net::parameter_base& addr, inlet& in);
89  void copy_from_global(ossia::net::parameter_base& addr, inlet& in);
90  void copy_from_global_node(ossia::net::node_base& addr, inlet& in);
91 
92  void insert(ossia::net::parameter_base& dest, const ossia::value_port& v);
93  void insert(ossia::audio_parameter& dest, const audio_port& v);
94  void insert(ossia::net::midi::midi_parameter& dest, const midi_port& v);
95 
96  void commit();
97 
98  bool in_local_scope(ossia::net::parameter_base& other) const;
99 
100  int sampleRate{44100};
101  int bufferSize{64};
102  double modelToSamplesRatio{1.};
103  double samplesToModelRatio{1.};
104  int64_t samples_since_start{};
105  double start_date{}; // in ns, for vst
106  double cur_date{};
107 
108 #if !defined(OSSIA_TESTING)
109 private:
110 #endif
111  void init_midi_timings();
112  void get_new_values();
113 
114  void register_parameter(ossia::net::parameter_base& p);
115  void unregister_parameter(ossia::net::parameter_base& p);
116  void register_midi_parameter(net::midi::midi_protocol& p);
117  void unregister_midi_parameter(net::midi::midi_protocol& p);
118  ossia::small_vector<ossia::net::device_base*, 4> m_devices_edit;
119  ossia::small_vector<ossia::net::device_base*, 4> m_devices_exec;
120  struct device_operation
121  {
122  enum
123  {
124  REGISTER,
125  UNREGISTER
126  } operation{};
127  ossia::net::device_base* device{};
128  };
129  ossia::spsc_queue<device_operation> m_device_change_queue;
130 
131  std::list<message_queue> m_valueQueues;
132 
133  ossia::ptr_map<ossia::net::parameter_base*, value_vector<ossia::value>>
134  m_receivedValues;
135 
136  struct received_midi_state
137  {
138  value_vector<libremidi::message> messages;
139  int64_t last_buffer_start{};
140  int64_t current_buffer_start{};
141  int count{};
142  };
143 
144  ossia::ptr_map<ossia::net::midi::midi_protocol*, received_midi_state> m_receivedMidi;
145 
146  friend struct local_pull_visitor;
147  friend struct global_pull_visitor;
148  friend struct global_pull_node_visitor;
149  friend struct state_exec_visitor;
150 
151  std::unique_ptr<execution_state_policy> m_policy;
152 };
153 }
Root of a device tree.
Definition: ossia/network/base/device.hpp:58
The node_base class.
Definition: network/base/node.hpp:48
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48
Definition: git_info.h:7
OSSIA_EXPORT ossia::net::node_base * find_node(node_base &dev, std::string_view parameter_base)
Find a node in a device.