24 #ifndef LVTK_LV2_UI_HPP
25 #define LVTK_LV2_UI_HPP
33 #include <lv2/lv2plug.in/ns/extensions/ui/ui.h>
35 #include <lvtk/feature.hpp>
36 #include <lvtk/ext/common.h>
37 #include <lvtk/ext/data_access.hpp>
38 #include <lvtk/ext/instance_access.hpp>
40 #include "private/debug.hpp"
41 #include "private/ui_features.hpp"
47 #define widget_cast(w) reinterpret_cast<LV2UI_Widget*> (w)
60 get_lv2g2g_descriptors();
92 template<
class Derived,
class Ext1 = end,
class Ext2 = end,
93 class Ext3 = end,
class Ext4 = end,
class Ext5 = end,
94 class Ext6 = end,
class Ext7 = end,
class Ext8 = end,
96 class UI :
public MixinTree<Derived, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6,
109 m_features = s_features;
110 m_bundle_path = s_bundle_path;
118 Derived::map_feature_handlers(hmap);
122 FeatureHandlerMap::iterator miter;
123 miter = hmap.find((*iter)->URI);
124 if (miter != hmap.end())
126 miter->second(static_cast<Derived*>(
this),
136 port_event(uint32_t port, uint32_t buffer_size, uint32_t format,
150 LV2UI_Descriptor desc;
151 std::memset(&desc, 0,
sizeof(LV2UI_Descriptor));
152 desc.URI = strdup(uri);
153 desc.instantiate = &Derived::create_ui_instance;
154 desc.cleanup = &Derived::delete_ui_instance;
155 desc.port_event = &Derived::_port_event;
156 desc.extension_data = &Derived::extension_data;
158 get_lv2g2g_descriptors().push_back(desc);
159 return get_lv2g2g_descriptors().size() - 1;
169 write(uint32_t port, uint32_t buffer_size, uint32_t format,
172 (*m_wfunc)(m_ctrl, port, buffer_size, format, buffer);
179 write(port,
sizeof(
float), 0, &value);
197 return m_bundle_path;
216 #if defined (LVTK_EXTRAS_ENABLED)
217 friend class WriteMIDI<true>::I<Derived>;
218 friend class
WriteMIDI<false>::I<Derived>;
219 friend class WriteOSC<true>::I<Derived>;
220 friend class WriteOSC<false>::I<Derived>;
229 create_ui_instance (LV2UI_Descriptor const* descriptor,
230 char const* plugin_uri, char const* bundle_path,
231 LV2UI_Write_Function write_func, LV2UI_Controller ctrl,
232 LV2UI_Widget* widget, LV2_Feature const* const * features)
238 s_wfunc = write_func;
245 std::clog <<
"[LV2::UI] Creating UI...\n\n"
246 <<
" Plugin URI: \"" << plugin_uri <<
"\"\n"
248 <<
" UI Features:\n";
250 for (iter =
features; *iter; ++iter)
251 std::clog <<
" \"" << (*iter)->URI <<
"\"\n";
256 std::clog <<
" Creating LV2 Widget..." << std::endl;
257 Derived* ui =
new Derived(plugin_uri);
258 *widget = ui->widget();
261 if (ui->check_ok() && *widget != NULL)
263 return reinterpret_cast<LV2UI_Handle
>(ui);
276 delete_ui_instance(LV2UI_Handle instance)
278 delete static_cast<Derived*
>(instance);
286 _port_event(LV2UI_Handle instance, uint32_t port,
287 uint32_t buffer_size, uint32_t format,
void const* buffer)
289 static_cast<Derived*
>(instance)->
port_event(port, buffer_size,
294 LV2UI_Write_Function m_wfunc;
296 char const* m_bundle_path;
299 static LV2UI_Write_Function s_wfunc;
301 static char const* s_bundle_path;
306 template<
class Derived,
class Ext1,
class Ext2,
class Ext3,
class Ext4,
307 class Ext5,
class Ext6,
class Ext7,
class Ext8,
class Ext9>
308 void* UI<Derived, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7, Ext8, Ext9>::s_ctrl =
311 template<
class Derived,
class Ext1,
class Ext2,
class Ext3,
class Ext4,
312 class Ext5,
class Ext6,
class Ext7,
class Ext8,
class Ext9>
313 LV2UI_Write_Function UI<Derived, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6,
314 Ext7, Ext8, Ext9>::s_wfunc = 0;
316 template<
class Derived,
class Ext1,
class Ext2,
class Ext3,
class Ext4,
317 class Ext5,
class Ext6,
class Ext7,
class Ext8,
class Ext9>
318 lvtk::Feature const*
const * UI<Derived, Ext1, Ext2, Ext3, Ext4, Ext5,
319 Ext6, Ext7, Ext8, Ext9>::s_features = 0;
321 template<
class Derived,
class Ext1,
class Ext2,
class Ext3,
class Ext4,
322 class Ext5,
class Ext6,
class Ext7,
class Ext8,
class Ext9>
323 char const* UI<Derived, Ext1, Ext2, Ext3, Ext4, Ext5, Ext6, Ext7, Ext8,
324 Ext9>::s_bundle_path = 0;