X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Flv2_plugin.cc;h=345c1a47ddf937744295c3d77adff96c3e921457;hb=d8329d855dab6199afef27cc8635472ddca0fe7b;hp=6288616824c2b70c7c8689117059e7b5f57717eb;hpb=5cf1f7f3b28abd36f9390014016def94f4e1468d;p=ardour.git diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 6288616824..345c1a47dd 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -144,6 +144,8 @@ public: LilvNode* ui_GtkUI; LilvNode* ui_external; LilvNode* ui_externalkx; + LilvNode* units_unit; + LilvNode* units_midiNote; private: bool _bundle_checked; @@ -1025,6 +1027,7 @@ LV2Plugin::load_preset(PresetRecord r) if (state) { lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL); lilv_state_free(state); + Plugin::load_preset(r); } lilv_node_free(pset); @@ -1092,7 +1095,14 @@ LV2Plugin::do_save_preset(string name) lilv_state_free(state); - return Glib::filename_to_uri(Glib::build_filename(bundle, file_name)); + std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name)); + LilvNode *node_bundle = lilv_new_uri(_world.world, Glib::filename_to_uri(Glib::build_filename(bundle, "/")).c_str()); + LilvNode *node_preset = lilv_new_uri(_world.world, uri.c_str()); + lilv_world_load_bundle(_world.world, node_bundle); + lilv_world_load_resource(_world.world, node_preset); + lilv_node_free(node_bundle); + lilv_node_free(node_preset); + return uri; } void @@ -1161,10 +1171,14 @@ LV2Plugin::write_from_ui(uint32_t index, * e.g 48kSPS / 128fpp -> audio-periods = 375 Hz * ui-periods = 25 Hz (SuperRapidScreenUpdate) * default minimumSize = 32K (see LV2Plugin::allocate_atom_event_buffers() - * -> 15 * 32K - * it is safe to overflow (but the plugin state may be inconsistent). + * + * it is NOT safe to overflow (msg.size will be misinterpreted) */ - rbs = max((size_t) 32768 * 6, rbs); + uint32_t bufsiz = 32768; + if (_atom_ev_buffers && _atom_ev_buffers[0]) { + bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]); + } + rbs = max((size_t) bufsiz * 8, rbs); _from_ui = new RingBuffer(rbs); } @@ -1193,8 +1207,12 @@ LV2Plugin::enable_ui_emmission() { if (!_to_ui) { /* see note in LV2Plugin::write_from_ui() */ + uint32_t bufsiz = 32768; + if (_atom_ev_buffers && _atom_ev_buffers[0]) { + bufsiz = lv2_evbuf_get_capacity(_atom_ev_buffers[0]); + } size_t rbs = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS; - rbs = max((size_t) 32768 * 8, rbs); + rbs = max((size_t) bufsiz * 8, rbs); _to_ui = new RingBuffer(rbs); } } @@ -1329,8 +1347,10 @@ LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) c { const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, which); + LilvNodes* portunits; LilvNode *def, *min, *max; lilv_port_get_range(_impl->plugin, port, &def, &min, &max); + portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit); desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer); desc.toggled = lilv_port_has_property(_impl->plugin, port, _world.lv2_toggled); @@ -1339,6 +1359,8 @@ LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) c desc.label = lilv_node_as_string(lilv_port_get_name(_impl->plugin, port)); desc.lower = min ? lilv_node_as_float(min) : 0.0f; desc.upper = max ? lilv_node_as_float(max) : 1.0f; + desc.midinote = lilv_nodes_contains(portunits, _world.units_midiNote); + if (desc.sr_dependent) { desc.lower *= _session.frame_rate (); desc.upper *= _session.frame_rate (); @@ -1363,6 +1385,7 @@ LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) c lilv_node_free(def); lilv_node_free(min); lilv_node_free(max); + lilv_nodes_free(portunits); return 0; } @@ -1502,7 +1525,7 @@ LV2Plugin::allocate_atom_event_buffers() return; } - DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers\n", total_atom_buffers)); + DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize)); _atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*)); for (int i = 0; i < total_atom_buffers; ++i ) { _atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM, @@ -1675,6 +1698,9 @@ LV2Plugin::connect_and_run(BufferSet& bufs, } } else if (!valid) { // Nothing we understand or care about, connect to scratch + // see note for midi-buffer size above + scratch_bufs.ensure_lv2_bufsize((flags & PORT_INPUT), + 0, _port_minimumSize[port_index]); _ev_buffers[port_index] = scratch_bufs.get_lv2_midi( (flags & PORT_INPUT), 0, (flags & PORT_EVENT)); } @@ -1966,10 +1992,14 @@ LV2World::LV2World() ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI); ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external"); ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget"); + units_unit = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/units#unit"); + units_midiNote = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/units#midiNote"); } LV2World::~LV2World() { + lilv_node_free(units_midiNote); + lilv_node_free(units_unit); lilv_node_free(ui_externalkx); lilv_node_free(ui_external); lilv_node_free(ui_GtkUI); @@ -2060,7 +2090,9 @@ LV2PluginInfo::discover() PluginInfoList* plugs = new PluginInfoList; const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world); - info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg; + if (!Config->get_show_plugin_scan_window()) { + info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg; + } LILV_FOREACH(plugins, i, plugins) { const LilvPlugin* p = lilv_plugins_get(plugins, i); @@ -2078,6 +2110,7 @@ LV2PluginInfo::discover() info->name = string(lilv_node_as_string(name)); lilv_node_free(name); + ARDOUR::PluginScanMessage(_("LV2"), info->name, false); const LilvPluginClass* pclass = lilv_plugin_get_class(p); const LilvNode* label = lilv_plugin_class_get_label(pclass);