OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
libmapper_protocol.hpp
1#pragma once
2
3#include <ossia/detail/hash_map.hpp>
4#include <ossia/detail/thread.hpp>
5#include <ossia/detail/variant.hpp>
6#include <ossia/network/base/protocol.hpp>
7#include <ossia/network/common/complex_type.hpp>
8#include <ossia/network/common/device_parameter.hpp>
9#include <ossia/network/domain/domain.hpp>
10#include <ossia/network/oscquery/oscquery_server.hpp>
11
12#include <concurrentqueue.h>
13
14#include <vector>
15
16typedef void* mpr_graph;
17typedef void* mpr_device;
18typedef void* mpr_signal;
19typedef void* mpr_link;
20typedef void* mpr_map;
21typedef void* mpr_slot;
22typedef void* mpr_network;
23typedef void* mpr_database;
24typedef void* mpr_queue;
25typedef int mpr_signal_group;
26
27namespace ossia::net
28{
29
30class OSSIA_EXPORT libmapper_server_protocol final : public ossia::net::protocol_base
31{
32public:
33 libmapper_server_protocol();
34 libmapper_server_protocol(const libmapper_server_protocol&) = delete;
35 libmapper_server_protocol(libmapper_server_protocol&&) = delete;
36 libmapper_server_protocol& operator=(const libmapper_server_protocol&) = delete;
37 libmapper_server_protocol& operator=(libmapper_server_protocol&&) = delete;
38 ~libmapper_server_protocol() override;
39
40 void set_device(ossia::net::device_base& dev) override;
41
42 bool pull(ossia::net::parameter_base& param) override;
43 bool push(const ossia::net::parameter_base& param, const ossia::value& v) override;
44 bool push_raw(const ossia::net::full_parameter_data&) override;
45 bool observe(ossia::net::parameter_base& param, bool enable) override;
46
47 bool update(ossia::net::node_base&) override;
48 void stop() override;
49
50private:
51 template <typename OssiaType, typename LibmapperType>
52 void create_1d_parameter(const parameter_base& p);
53 template <std::size_t N>
54 void create_array_parameter(const parameter_base& p);
55 void create_vector_parameter(const parameter_base& p);
56 friend struct libmapper_create_param;
57 friend struct libmapper_apply_control;
58
59 void on_nodeCreated(const ossia::net::node_base&);
60 void on_nodeRemoved(const ossia::net::node_base&);
61 void on_parameterCreated(const ossia::net::parameter_base&);
62 void on_parameterRemoved(const ossia::net::parameter_base&);
63 void on_parameterChanged(const ossia::net::parameter_base&);
64 void on_attributeChanged(const ossia::net::node_base&, std::string_view attr);
65 void on_nodeRenamed(const ossia::net::node_base& n, std::string oldname);
66
67 void execThread();
68
69 ossia::net::device_base* m_device{};
70
71 mpr_device m_mapper_dev{};
72
73 ossia::hash_map<const ossia::net::parameter_base*, mpr_signal> m_inputMap;
74 ossia::hash_map<const ossia::net::parameter_base*, mpr_signal> m_outputMap;
75
76 ossia::thread m_thread;
77 std::atomic_bool m_running{};
78
79 struct Message
80 {
81 mpr_signal sig;
82 ossia::value value;
83 };
84
85 moodycamel::ConcurrentQueue<Message> m_sendQueue;
86
87 struct CreateSignal
88 {
89 const ossia::net::parameter_base* param;
90 };
91 struct RemoveSignal
92 {
93 mpr_signal sig;
94 };
95 using ControlMessage = ossia::variant<CreateSignal, RemoveSignal>;
96 moodycamel::ConcurrentQueue<ControlMessage> m_ctlQueue;
97
98 std::atomic_int m_editSemaphore{};
99};
100
101class OSSIA_EXPORT libmapper_client_protocol final : public ossia::net::protocol_base
102{
103public:
104 explicit libmapper_client_protocol(std::string device);
105 libmapper_client_protocol(const libmapper_client_protocol&) = delete;
106 libmapper_client_protocol(libmapper_client_protocol&&) = delete;
107 libmapper_client_protocol& operator=(const libmapper_client_protocol&) = delete;
108 libmapper_client_protocol& operator=(libmapper_client_protocol&&) = delete;
109 ~libmapper_client_protocol() override;
110
111 void set_device(ossia::net::device_base& dev) override;
112
113 bool pull(ossia::net::parameter_base& param) override;
114 bool push(const ossia::net::parameter_base& param, const ossia::value& v) override;
115 bool push_raw(const ossia::net::full_parameter_data&) override;
116 bool observe(ossia::net::parameter_base& param, bool enable) override;
117
118 bool update();
119 bool update(ossia::net::node_base&) override;
120 void stop() override;
121
122 void poll(int);
123
124private:
125 ossia::net::device_base* m_device{};
126
127 std::string m_mapper_dev_name;
128
129 mpr_graph m_db{};
130 mpr_device m_mapper_dev{};
131
132 ossia::hash_map<const ossia::net::parameter_base*, mpr_signal> m_inputMap;
133 ossia::hash_map<const ossia::net::parameter_base*, mpr_signal> m_outputMap;
134};
135}
Root of a device tree.
Definition ossia/network/base/device.hpp:58
The node_base class.
Definition node.hpp:48
The parameter_base class.
Definition ossia/network/base/parameter.hpp:48
The protocol_base class.
Definition protocol.hpp:40
Definition thread.hpp:28
The value class.
Definition value.hpp:173
Full information about a parameter.
Definition parameter_data.hpp:61