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>
25 class audio_parameter;
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
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;
41 void set_policy(
const tick_setup_options&);
45 void unregister_device(net::device_base* d);
47 const ossia::small_vector<ossia::net::device_base*, 4>& edit_devices() const noexcept
49 return m_devices_edit;
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);
58 const ossia::small_vector<ossia::net::device_base*, 4>& exec_devices() const noexcept
60 return m_devices_exec;
64 for(
auto dev : m_devices_exec)
66 if(
auto res = ossia::net::find_node(dev->get_root_node(), name))
73 auto get_value_or(std::string_view v,
const T& val) noexcept
76 return ossia::convert<T>(node->get_parameter()->value());
85 void advance_tick(std::size_t);
86 void apply_device_changes();
93 void insert(ossia::audio_parameter& dest,
const audio_port& v);
94 void insert(ossia::net::midi::midi_parameter& dest,
const midi_port& v);
100 int sampleRate{44100};
102 double modelToSamplesRatio{1.};
103 double samplesToModelRatio{1.};
104 int64_t samples_since_start{};
108 #if !defined(OSSIA_TESTING)
111 void init_midi_timings();
112 void get_new_values();
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
129 ossia::spsc_queue<device_operation> m_device_change_queue;
131 std::list<message_queue> m_valueQueues;
133 ossia::ptr_map<ossia::net::parameter_base*, value_vector<ossia::value>>
136 struct received_midi_state
138 value_vector<libremidi::message> messages;
139 int64_t last_buffer_start{};
140 int64_t current_buffer_start{};
144 ossia::ptr_map<ossia::net::midi::midi_protocol*, received_midi_state> m_receivedMidi;
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;
151 std::unique_ptr<execution_state_policy> m_policy;
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
OSSIA_EXPORT ossia::net::node_base * find_node(node_base &dev, std::string_view parameter_base)
Find a node in a device.