// shared between parent/child fork #include "language.h" #include "pluginlv2ui.h" #include #include #include #include void PluginLV2UI::update_value(int idx, uint32_t bfrsz, uint32_t typ, const void *bfr) { if( idx >= config.nb_ports ) return; for( int i=0, sz=config.size(); iidx == idx ) { opt->set_value(*(const float*)bfr); updates |= UPDATE_HOST; break; } } } void PluginLV2UI::write_from_ui(void *the, uint32_t idx, uint32_t bfrsz, uint32_t typ, const void *bfr) { ((PluginLV2UI*)the)->update_value(idx, bfrsz, typ, bfr); } uint32_t PluginLV2UI::port_index(void* obj, const char* sym) { PluginLV2UI *the = (PluginLV2UI*)obj; for( int i=0, sz=the->config.size(); iconfig[i]; if( !strcmp(sym, opt->sym) ) return opt->idx; } return UINT32_MAX; } void PluginLV2UI::update_control(int idx, uint32_t bfrsz, uint32_t typ, const void *bfr) { if( !sinst || idx >= config.nb_ports ) return; suil_instance_port_event(sinst, idx, bfrsz, typ, bfr); } uint32_t PluginLV2UI::uri_to_id(LV2_URID_Map_Handle handle, const char *map, const char *uri) { return ((PluginLV2UriTable *)handle)->map(uri); } LV2_URID PluginLV2UI::uri_table_map(LV2_URID_Map_Handle handle, const char *uri) { return ((PluginLV2UriTable *)handle)->map(uri); } const char *PluginLV2UI::uri_table_unmap(LV2_URID_Map_Handle handle, LV2_URID urid) { return ((PluginLV2UriTable *)handle)->unmap(urid); } void PluginLV2UI::lv2ui_instantiate(void *parent) { if ( !ui_host ) { ui_host = suil_host_new( PluginLV2UI::write_from_ui, PluginLV2UI::port_index, 0, 0); // suil_host_set_touch_func(ui_host, cb_touch); } features.remove(); // remove terminating zero ui_features = features.size(); LV2_Handle lilv_handle = lilv_instance_get_handle(inst); features.append(new Lv2Feature(NS_EXT "instance-access", lilv_handle)); const LV2_Descriptor *lilv_desc = lilv_instance_get_descriptor(inst); ext_data = new LV2_Extension_Data_Feature(); ext_data->data_access = lilv_desc->extension_data; features.append(new Lv2Feature(LV2_DATA_ACCESS_URI, ext_data)); features.append(new Lv2Feature(LV2_UI__parent, parent)); features.append(new Lv2Feature(LV2_UI__idleInterface, 0)); features.append(new Lv2Feature(LV2_EXTERNAL_UI_URI, &extui_host)); features.append(new Lv2Feature(LV2_EXTERNAL_UI_URI__KX__Host, &extui_host)); features.append(0); // add new terminating zero const char* bundle_uri = lilv_node_as_uri(lilv_ui_get_bundle_uri(lilv_ui)); char* bundle_path = lilv_file_uri_parse(bundle_uri, NULL); const char* binary_uri = lilv_node_as_uri(lilv_ui_get_binary_uri(lilv_ui)); char* binary_path = lilv_file_uri_parse(binary_uri, NULL); sinst = suil_instance_new(ui_host, this, ui_type, lilv_node_as_uri(lilv_plugin_get_uri(lilv)), lilv_node_as_uri(lilv_ui_get_uri(lilv_ui)), lilv_node_as_uri(lilv_type), bundle_path, binary_path, features); lilv_free(binary_path); lilv_free(bundle_path); } bool PluginLV2UI::lv2ui_resizable() { if( !lilv_ui ) return false; const LilvNode* s = lilv_ui_get_uri(lilv_ui); LilvNode *p = lilv_new_uri(world, LV2_CORE__optionalFeature); LilvNode *fs = lilv_new_uri(world, LV2_UI__fixedSize); LilvNode *nrs = lilv_new_uri(world, LV2_UI__noUserResize); LilvNodes *fs_matches = lilv_world_find_nodes(world, s, p, fs); LilvNodes *nrs_matches = lilv_world_find_nodes(world, s, p, nrs); lilv_nodes_free(nrs_matches); lilv_nodes_free(fs_matches); lilv_node_free(nrs); lilv_node_free(fs); lilv_node_free(p); return !fs_matches && !nrs_matches; } int PluginLV2UI::update_lv2_input(float *vals, int force) { int ret = 0; float *ctls = config.ctls; for( int i=0; iidx; float val = vals[idx]; if( !force && ctls[idx] == val ) continue; ctls[idx] = val; update_control(idx, sizeof(ctls[idx]), 0, &ctls[idx]); ++ret; } return ret; } void PluginLV2UI::update_lv2_output() { int *ports = config.ports; float *ctls = config.ctls; for( int i=0; istart_gui(); update_lv2_input(config.ctls, 1); connect_ports(config, PORTS_CONTROL | PORTS_ATOM); int n = 0; #if 1 // some plugins must have pointers, or they crash float inp[nb_inputs], out[nb_outputs]; memset(&inp, 0, nb_inputs*sizeof(float)); memset(&out, 0, nb_outputs*sizeof(float)); int ich = 0, och = 0; for( int i=0; i