OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
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
11namespace libremidi
12{
13struct message;
14}
15#endif
16namespace ossia
17{
18namespace net::midi
19{
20class midi_protocol;
21class midi_stream;
22class midi_parameter;
23}
24class state;
25class message_queue;
26class audio_parameter;
27struct typed_value;
28struct timed_value;
29struct local_pull_visitor;
30struct global_pull_visitor;
31struct state_exec_visitor;
32struct execution_state_policy;
33struct OSSIA_EXPORT execution_state : public Nano::Observer
34{
35 execution_state();
36 execution_state(const execution_state&) = delete;
37 execution_state(execution_state&&) = delete;
38 execution_state& operator=(const execution_state&) = delete;
39 execution_state& operator=(execution_state&&) = delete;
40 ~execution_state();
41
42 void set_policy(const tick_setup_options&);
43
45 void register_device(ossia::net::device_base* d);
46 void unregister_device(net::device_base* d);
47
48 const ossia::small_vector<ossia::net::device_base*, 4>& edit_devices() const noexcept
49 {
50 return m_devices_edit;
51 }
52
54 void register_port(const ossia::inlet& port);
55 void register_port(const ossia::outlet& port);
56 void unregister_port(const ossia::inlet& port);
57 void unregister_port(const ossia::outlet& port);
58
59 const ossia::small_vector<ossia::net::device_base*, 4>& exec_devices() const noexcept
60 {
61 return m_devices_exec;
62 }
63
64 ossia::net::node_base* find_node(std::string_view name) const noexcept
65 {
66 for(auto dev : m_devices_exec)
67 {
68 if(auto res = ossia::net::find_node(dev->get_root_node(), name))
69 return res;
70 }
71 return nullptr;
72 }
73
74 template <typename T>
75 auto get_value_or(std::string_view v, const T& val) noexcept
76 {
77 if(auto node = find_node(v))
78 return ossia::convert<T>(node->get_parameter()->value());
79 return val;
80 }
81
82 void begin_tick();
83
84 void clear_devices();
85 void reset();
86
87 void advance_tick(std::size_t);
88 void apply_device_changes();
89
90 void find_and_copy(ossia::net::parameter_base& addr, inlet& in);
91 void copy_from_global(ossia::net::parameter_base& addr, inlet& in);
92 void copy_from_global_node(ossia::net::node_base& addr, inlet& in);
93
94 void insert(ossia::net::parameter_base& dest, const ossia::value_port& v);
95 void insert(ossia::audio_parameter& dest, const audio_port& v);
96 void insert(ossia::net::midi::midi_parameter& dest, const midi_port& v);
97
98 void commit();
99
100 bool in_local_scope(ossia::net::parameter_base& other) const;
101
102 int sampleRate{44100};
104 int bufferSize{64};
108 int maxBufferSize{};
109 [[nodiscard]] int setupBufferSize() const noexcept
110 {
111 return bufferSize > maxBufferSize ? bufferSize : maxBufferSize;
112 }
114 int inputLatency{};
115 int outputLatency{};
116 double modelToSamplesRatio{1.};
117 double samplesToModelRatio{1.};
118 int64_t samples_since_start{};
119 double start_date{}; // in ns, for vst
120 double cur_date{};
121
122#if !defined(OSSIA_TESTING)
123private:
124#endif
125 void init_midi_timings();
126 void get_new_values();
127
128 void register_parameter(ossia::net::parameter_base& p);
129 void unregister_parameter(ossia::net::parameter_base& p);
130 void register_midi_parameter(net::midi::midi_stream& p);
131 void unregister_midi_parameter(net::midi::midi_stream* p);
132 void register_midi_inlet(const ossia::inlet& port, net::midi::midi_stream& p);
133 ossia::small_vector<ossia::net::device_base*, 4> m_devices_edit;
134 ossia::small_vector<ossia::net::device_base*, 4> m_devices_exec;
135 struct device_operation
136 {
137 enum
138 {
139 REGISTER,
140 UNREGISTER
141 } operation{};
142 ossia::net::device_base* device{};
146 ossia::net::midi::midi_stream* midi{};
147 };
148 ossia::spsc_queue<device_operation> m_device_change_queue;
149
150 std::list<message_queue> m_valueQueues;
151
152 ossia::ptr_map<ossia::net::parameter_base*, value_vector<ossia::value>>
153 m_receivedValues;
154
155 struct received_midi_state
156 {
157 value_vector<libremidi::ump> messages;
158 int64_t last_buffer_start{};
159 int64_t current_buffer_start{};
160 int count{};
161 };
162
163 ossia::ptr_map<ossia::net::midi::midi_stream*, received_midi_state> m_receivedMidi;
167 ossia::ptr_map<const ossia::inlet*, ossia::net::midi::midi_stream*> m_midiInlets;
168
169 friend struct local_pull_visitor;
170 friend struct global_pull_visitor;
171 friend struct global_pull_node_visitor;
172 friend struct state_exec_visitor;
173
174 std::unique_ptr<execution_state_policy> m_policy;
175};
176}
Definition midi_stream.hpp:33
The state class.
Definition editor/state/state.hpp:25
Definition git_info.h:7