X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Flv2_plugin.cc;h=940ec8ae0389ac49a47057a89da98f5550fb2f0a;hb=065d7c852a1586a3020affd6905f108abf252119;hp=bed66b62afbf5b65c985db64e169acd9076d98f6;hpb=311adde0231070ea6ad7ec5f2f276a36a3ca5d8e;p=ardour.git diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index bed66b62af..940ec8ae03 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -155,6 +155,7 @@ public: LilvNode* units_midiNote; LilvNode* patch_writable; LilvNode* patch_Message; + LilvNode* lv2_noSampleAccurateCtrl; #ifdef HAVE_LV2_1_2_0 LilvNode* bufz_powerOf2BlockLength; LilvNode* bufz_fixedBlockLength; @@ -244,7 +245,9 @@ struct LV2Plugin::Impl { #endif , state(0) , block_length(0) +#ifdef HAVE_LV2_1_2_0 , options(0) +#endif {} /** Find the LV2 input port with the given designation. @@ -266,7 +269,9 @@ struct LV2Plugin::Impl { LV2_Atom_Forge forge; LV2_Atom_Forge ui_forge; int32_t block_length; +#ifdef HAVE_LV2_1_2_0 LV2_Options_Option* options; +#endif }; LV2Plugin::LV2Plugin (AudioEngine& engine, @@ -282,6 +287,7 @@ LV2Plugin::LV2Plugin (AudioEngine& engine, , _patch_port_in_index((uint32_t)-1) , _patch_port_out_index((uint32_t)-1) , _uri_map(URIMap::instance()) + , _no_sample_accurate_ctrl (false) { init(c_plugin, rate); } @@ -296,6 +302,7 @@ LV2Plugin::LV2Plugin (const LV2Plugin& other) , _patch_port_in_index((uint32_t)-1) , _patch_port_out_index((uint32_t)-1) , _uri_map(URIMap::instance()) + , _no_sample_accurate_ctrl (false) { init(other._impl->plugin, other._sample_rate); @@ -477,6 +484,12 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate) throw failed_constructor(); } lilv_nodes_free(required_features); + + LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin); + if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) { + _no_sample_accurate_ctrl = true; + } + lilv_nodes_free(optional_features); #endif #ifdef HAVE_LILV_0_16_0 @@ -681,6 +694,25 @@ LV2Plugin::set_block_size (pframes_t nframes) return 0; } +bool +LV2Plugin::requires_fixed_sized_buffers () const +{ + /* This controls if Ardour will split the plugin's run() + * on automation events in order to pass sample-accurate automation + * via standard control-ports. + * + * When returning true Ardour will *not* sub-divide the process-cycle. + * Automation events that happen between cycle-start and cycle-end will be + * ignored (ctrl values are interpolated to cycle-start). + * NB. Atom Sequences are still sample accurate. + * + * Note: This does not guarantee a fixed block-size. + * e.g The process cycle may be split when looping, also + * the period-size may change any time: see set_block_size() + */ + return _no_sample_accurate_ctrl; +} + LV2Plugin::~LV2Plugin () { DEBUG_TRACE(DEBUG::LV2, string_compose("%1 destroy\n", name())); @@ -692,7 +724,9 @@ LV2Plugin::~LV2Plugin () lilv_state_free(_impl->state); lilv_node_free(_impl->name); lilv_node_free(_impl->author); +#ifdef HAVE_LV2_1_2_0 free(_impl->options); +#endif free(_features); free(_make_path_feature.data); @@ -2442,6 +2476,7 @@ LV2World::LV2World() units_db = lilv_new_uri(world, LV2_UNITS__db); patch_writable = lilv_new_uri(world, LV2_PATCH__writable); patch_Message = lilv_new_uri(world, LV2_PATCH__Message); + lv2_noSampleAccurateCtrl = lilv_new_uri(world, LV2_CORE_PREFIX "NoSampleAccurateCtrl"); // XXX #ifdef HAVE_LV2_1_2_0 bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength); bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength); @@ -2457,6 +2492,7 @@ LV2World::~LV2World() lilv_node_free(bufz_fixedBlockLength); lilv_node_free(bufz_powerOf2BlockLength); #endif + lilv_node_free(lv2_noSampleAccurateCtrl); lilv_node_free(patch_Message); lilv_node_free(patch_writable); lilv_node_free(units_hz); @@ -2555,6 +2591,17 @@ LV2PluginInfo::load(Session& session) return PluginPtr(); } +bool +LV2PluginInfo::in_category (const std::string &c) const +{ + // TODO use untranslated lilv_plugin_get_class() + // match gtk2_ardour/plugin_selector.cc + if (category == c) { + return true; + } + return false; +} + PluginInfoList* LV2PluginInfo::discover() {