Context.hpp
1 #pragma once
2 #include <lv2/lv2plug.in/ns/ext/atom/atom.h>
3 #include <lv2/lv2plug.in/ns/ext/atom/forge.h>
4 #include <lv2/lv2plug.in/ns/ext/buf-size/buf-size.h>
5 #include <lv2/lv2plug.in/ns/ext/data-access/data-access.h>
6 #include <lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h>
7 #include <lv2/lv2plug.in/ns/ext/event/event.h>
8 #include <lv2/lv2plug.in/ns/ext/instance-access/instance-access.h>
9 #include <lv2/lv2plug.in/ns/ext/log/log.h>
10 #include <lv2/lv2plug.in/ns/ext/midi/midi.h>
11 #include <lv2/lv2plug.in/ns/ext/morph/morph.h>
12 #include <lv2/lv2plug.in/ns/ext/options/options.h>
13 #include <lv2/lv2plug.in/ns/ext/parameters/parameters.h>
14 #include <lv2/lv2plug.in/ns/ext/patch/patch.h>
15 #include <lv2/lv2plug.in/ns/ext/port-groups/port-groups.h>
16 #include <lv2/lv2plug.in/ns/ext/port-props/port-props.h>
17 #include <lv2/lv2plug.in/ns/ext/presets/presets.h>
18 #include <lv2/lv2plug.in/ns/ext/resize-port/resize-port.h>
19 #include <lv2/lv2plug.in/ns/ext/state/state.h>
20 #include <lv2/lv2plug.in/ns/ext/time/time.h>
21 #include <lv2/lv2plug.in/ns/ext/uri-map/uri-map.h>
22 #include <lv2/lv2plug.in/ns/ext/urid/urid.h>
23 #include <lv2/lv2plug.in/ns/ext/worker/worker.h>
24 #include <lv2/lv2plug.in/ns/extensions/ui/ui.h>
25 
26 #include <ossia/detail/hash_map.hpp>
27 #include <ossia/detail/lockfree_queue.hpp>
28 #include <ossia/detail/small_vector.hpp>
29 
30 #include <boost/bimap.hpp>
31 
32 #include <lilv/lilvmm.hpp>
33 
34 #include <readerwriterqueue.h>
35 
36 #include <atomic>
37 #include <cstdarg>
38 #include <cstdio>
39 #include <functional>
40 #include <vector>
41 
42 #include <suil-0/suil/suil.h>
43 
44 namespace LV2
45 {
46 struct EffectContext;
47 struct GlobalContext;
49 {
50  Lilv::Node make_node(const char* desc)
51  {
52  Lilv::Node n{nullptr};
53  n.me = lilv_new_uri(world.me, desc);
54  return n;
55  }
56 
57  LV2::GlobalContext* global{};
58  LV2::EffectContext* current{};
59  LV2_Feature const* const* features{};
60  Lilv::World& world;
61 
62  LV2_Atom_Forge forge{};
63 
64  Lilv::Node input_class{make_node(LILV_URI_INPUT_PORT)};
65  Lilv::Node output_class{make_node(LILV_URI_OUTPUT_PORT)};
66  Lilv::Node control_class{make_node(LILV_URI_CONTROL_PORT)};
67  Lilv::Node audio_class{make_node(LILV_URI_AUDIO_PORT)};
68  Lilv::Node atom_class{make_node(LV2_ATOM__AtomPort)};
69  Lilv::Node atom_object_class{make_node(LV2_ATOM__Object)};
70  Lilv::Node event_class{make_node(LILV_URI_EVENT_PORT)};
71  Lilv::Node midi_event_class{make_node(LILV_URI_MIDI_EVENT)};
72  Lilv::Node cv_class{make_node(LV2_CORE__CVPort)};
73  Lilv::Node work_interface{make_node(LV2_WORKER__interface)};
74  Lilv::Node work_schedule{make_node(LV2_WORKER__schedule)};
75 
76  Lilv::Node time_time_class{make_node(LV2_TIME__Time)};
77  Lilv::Node time_Position_class{make_node(LV2_TIME__Position)};
78  Lilv::Node time_rate_class{make_node(LV2_TIME__Rate)};
79  //Lilv::Node time_position_class{make_node(LV2_TIME__position)};
80  Lilv::Node time_barBeat_class{make_node(LV2_TIME__barBeat)};
81  Lilv::Node time_bar_class{make_node(LV2_TIME__bar)};
82  Lilv::Node time_beat_class{make_node(LV2_TIME__beat)};
83  Lilv::Node time_beatUnit_class{make_node(LV2_TIME__beatUnit)};
84  Lilv::Node time_beatsPerBar_class{make_node(LV2_TIME__beatsPerBar)};
85  Lilv::Node time_beatsPerMinute_class{make_node(LV2_TIME__beatsPerMinute)};
86  Lilv::Node time_frame_class{make_node(LV2_TIME__frame)};
87  Lilv::Node time_framesPerSecond_class{make_node(LV2_TIME__framesPerSecond)};
88  Lilv::Node time_speed_class{make_node(LV2_TIME__speed)};
89 
90  Lilv::Node optional_feature{make_node(LV2_CORE__optionalFeature)};
91  Lilv::Node fixed_size{make_node(LV2_UI__fixedSize)};
92  Lilv::Node no_user_resize{make_node(LV2_UI__noUserResize)};
93 
94  Lilv::Node host_ui_type{make_node("http://lv2plug.in/ns/extensions/ui#Qt5UI")};
95 
96  int32_t midi_buffer_size = 2048;
97  LV2_URID midi_event_id{};
98  LV2_URID atom_chunk_id{};
99  LV2_URID atom_sequence_id{};
100  LV2_URID atom_object_id{};
101  LV2_URID null_id{};
102  LV2_URID atom_eventTransfer{};
103 
104  LV2_URID time_Time_id{};
105  LV2_URID time_Position_id{};
106  LV2_URID time_rate_id{};
107  // LV2_URID time_position_id{};
108  LV2_URID time_barBeat_id{};
109  LV2_URID time_bar_id{};
110  LV2_URID time_beat_id{};
111  LV2_URID time_beatUnit_id{};
112  LV2_URID time_beatsPerBar_id{};
113  LV2_URID time_beatsPerMinute_id{};
114  LV2_URID time_frame_id{};
115  LV2_URID time_framesPerSecond_id{};
116  LV2_URID time_speed_id{};
117 
118  std::vector<char> acquire_worker_data(const char* data, uint32_t s) noexcept
119  {
120  std::vector<char> cp;
121  worker_datas_pool.try_dequeue(cp);
122  cp.assign(data, data + s);
123  return cp;
124  }
125 
126  void release_worker_data(std::vector<char>&& v) noexcept
127  {
128  worker_datas_pool.enqueue(std::move(v));
129  }
130 
131  ossia::mpmc_queue<std::vector<char>> worker_datas_pool{};
132 };
133 
135 {
136  Lilv::Plugin plugin{nullptr};
137  LilvInstance* instance{};
138  const LV2_Worker_Interface* worker{};
139  LV2_Extension_Data_Feature data{};
140  const LilvUI* ui{};
141  const LilvNode* ui_type{};
142  SuilInstance* ui_instance{};
143 
144  ossia::mpmc_queue<std::vector<char>> worker_datas;
145 };
146 
148 {
149 public:
150  GlobalContext(int buffer_size, LV2::HostContext& host);
151  void loadPlugins();
152  LV2_Feature const* const* features() const { return lv2_features.data(); }
153 
154  using urid_map_t = boost::bimap<std::string, LV2_URID>;
155  LV2::HostContext& host;
156  int sampleRate = 44100;
157 
158  std::vector<LV2_Options_Option> options;
159 
160  LV2_URID urid_map_cur = 1;
161  ossia::hash_map<std::string, LV2_URID> urid_map_left;
162  ossia::hash_map<LV2_URID, std::string> urid_map_right;
163 
164  LV2_URI_Map_Feature uri_map{};
165  LV2_URID uri_map_cur = 1;
166  ossia::hash_map<std::string, LV2_URID> uri_map_left;
167 
168  LV2_URID_Map map{};
169  LV2_URID_Unmap unmap{};
170  LV2_Event_Feature event{};
171  LV2_Worker_Schedule worker{};
172  LV2_Worker_Schedule worker_state{};
173 
174  LV2_Log_Log logger{};
175  LV2_Extension_Data_Feature ext_data{nullptr};
176 
177  LV2_Resize_Port_Resize ext_port_resize{};
178  LV2_State_Make_Path state_make_path{};
179 
180  LV2_Feature uri_map_feature{"http://lv2plug.in/ns/ext/uri-map", &uri_map};
181  LV2_Feature map_feature{LV2_URID__map, &map};
182  LV2_Feature unmap_feature{LV2_URID__unmap, &unmap};
183  LV2_Feature event_feature{LV2_EVENT_URI, &event};
184  LV2_Feature options_feature{LV2_OPTIONS__options, nullptr};
185  LV2_Feature worker_feature{LV2_WORKER__schedule, &worker};
186  LV2_Feature worker_state_feature{LV2_WORKER__schedule, &worker};
187  LV2_Feature logger_feature{LV2_LOG__log, &logger};
188  LV2_Feature ext_data_feature{LV2_DATA_ACCESS_URI, &ext_data};
189  LV2_Feature ext_port_resize_feature{LV2_RESIZE_PORT_URI, &ext_port_resize};
190  LV2_Feature state_make_path_feature{LV2_STATE__makePath, &state_make_path};
191 
192  LV2_Feature state_load_default_feature{LV2_STATE__loadDefaultState, nullptr};
193  // LV2_Feature
194  // state_thread_safe_restore_feature{LV2_STATE__threadSafeRestore, nullptr};
195 
196  LV2_Feature bounded{LV2_BUF_SIZE__boundedBlockLength, nullptr};
197  LV2_Feature pow2{LV2_BUF_SIZE__powerOf2BlockLength, nullptr};
198 
199  std::vector<LV2_Feature*> lv2_features;
200 
201  SuilHost* ui_host{};
202 
203  const LV2_Feature data_feature{LV2_DATA_ACCESS_URI, &ext_data};
204 };
205 
206 struct LV2Data
207 {
209 
210  ~LV2Data() { }
211 
212  LV2::HostContext& host;
213  LV2::EffectContext& effect;
214  ossia::small_vector<int, 4> audio_in_ports, audio_out_ports;
215  ossia::small_vector<int, 8> control_in_ports, control_out_ports, control_other_ports;
216  ossia::small_vector<int, 2> midi_in_ports, midi_out_ports, midi_other_ports, cv_ports;
217 
218  ossia::small_vector<int, 2> time_Position_ports{};
219 
220  // ossia::small_vector<int, 2> atom_in_ports, atom_out_ports;
221 };
222 
223 struct Message
224 {
225  uint32_t index;
226  uint32_t protocol;
227  ossia::small_vector<uint8_t, 32> body;
228 };
229 }
Definition: Context.hpp:135
Definition: Context.hpp:148
Definition: Context.hpp:49
Definition: Context.hpp:207
Definition: Context.hpp:224