From 7e335a8234097198b392b55f7161680d11540236 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 29 Aug 2012 20:22:18 +0000 Subject: [PATCH] Implement latest buf-size extension via new options extension. git-svn-id: svn://localhost/ardour2/branches/3.0@13151 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/lv2_plugin.h | 6 ++- libs/ardour/lv2_plugin.cc | 67 +++++++++------------------------ libs/ardour/wscript | 2 +- 3 files changed, 23 insertions(+), 52 deletions(-) diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 6b51cb3eae..1090f30307 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -225,7 +225,11 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee LV2_Feature _make_path_feature; LV2_Feature _log_feature; LV2_Feature _work_schedule_feature; - LV2_Feature _buf_size_feature; + LV2_Feature _options_feature; + + // Options passed to plugin + int32_t _block_length; + int32_t _seq_size; mutable unsigned _state_version; diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 14d4b6355c..80cf7efb44 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -52,6 +52,7 @@ #include "lv2/lv2plug.in/ns/ext/atom/atom.h" #include "lv2/lv2plug.in/ns/ext/log/log.h" +#include "lv2/lv2plug.in/ns/ext/options/options.h" #include "lv2/lv2plug.in/ns/ext/port-props/port-props.h" #include "lv2/lv2plug.in/ns/ext/presets/presets.h" #include "lv2/lv2plug.in/ns/ext/state/state.h" @@ -158,46 +159,6 @@ work_respond(LV2_Worker_Respond_Handle handle, } } -/* buf-size extension */ - -#ifdef HAVE_NEW_LV2 -/** Called by the plugin to discover properties of the block length. */ -static LV2_Buf_Size_Status -get_sample_count(LV2_Buf_Size_Access_Handle handle, - uint32_t* min, - uint32_t* max, - uint32_t* multiple_of, - uint32_t* power_of) -{ - AudioEngine* engine = (AudioEngine*)handle; - *min = 1; - *max = engine->frames_per_cycle(); - *multiple_of = 1; - *power_of = 0; - return LV2_BUF_SIZE_SUCCESS; -} - -/** Called by the plugin to get the size required for some buffer type. */ -static LV2_Buf_Size_Status -get_buf_size(LV2_Buf_Size_Access_Handle handle, - uint32_t* buf_size, - LV2_URID type, - uint32_t sample_count) -{ - AudioEngine* engine = (AudioEngine*)handle; - if (type == LV2Plugin::_sequence_type) { - *buf_size = engine->raw_buffer_size(DataType::MIDI); - return LV2_BUF_SIZE_SUCCESS; - } - *buf_size = 0; - return LV2_BUF_SIZE_ERR_BAD_TYPE; -} - -static LV2_Buf_Size_Access buf_size_access = { - NULL, sizeof(LV2_Buf_Size_Access), get_sample_count, get_buf_size -}; -#endif - /* log extension */ static int @@ -299,6 +260,8 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate) _bpm_control_port = 0; _freewheel_control_port = 0; _latency_control_port = 0; + _block_length = _engine.frames_per_cycle(); + _seq_size = _engine.raw_buffer_size(DataType::MIDI); _state_version = 0; _was_activated = false; _has_state_interface = false; @@ -310,12 +273,6 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate) _work_schedule_feature.URI = LV2_WORKER__schedule; _work_schedule_feature.data = NULL; -#ifdef HAVE_NEW_LV2 - _buf_size_feature.URI = LV2_BUF_SIZE__access; - _buf_size_feature.data = &buf_size_access; - buf_size_access.handle = &_engine; -#endif - const LilvPlugin* plugin = _impl->plugin; LilvNode* state_iface_uri = lilv_new_uri(_world.world, LV2_STATE__interface); @@ -339,10 +296,20 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate) unsigned n_features = 7; #ifdef HAVE_NEW_LV2 - _buf_size_feature.URI = LV2_BUF_SIZE__access; - _buf_size_feature.data = &buf_size_access; - buf_size_access.handle = &_engine; - _features[n_features++] = &_buf_size_feature; + LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int); + LV2_Options_Option options[] = { + { _uri_map.uri_to_id(LV2_BUF_SIZE__minBlockLength), + sizeof(int32_t), atom_Int, &_block_length }, + { _uri_map.uri_to_id(LV2_BUF_SIZE__maxBlockLength), + sizeof(int32_t), atom_Int, &_block_length }, + { _uri_map.uri_to_id(LV2_BUF_SIZE__sequenceSize), + sizeof(int32_t), atom_Int, &_seq_size }, + { 0, 0, 0, NULL } + }; + + _options_feature.URI = LV2_OPTIONS__options; + _options_feature.data = options; + _features[n_features++] = &_options_feature; #endif LV2_State_Make_Path* make_path = (LV2_State_Make_Path*)malloc( diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 9b3e7944fd..e01de3e764 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -259,7 +259,7 @@ def configure(conf): autowaf.check_pkg(conf, 'lv2', uselib_store='LV2', atleast_version='1.0.0', mandatory=True) autowaf.check_pkg(conf, 'lv2', uselib_store='NEW_LV2', - atleast_version='1.0.7', mandatory=False) + atleast_version='1.0.13', mandatory=False) autowaf.check_pkg(conf, 'serd-0', uselib_store='SERD', atleast_version='0.14.0', mandatory=True) autowaf.check_pkg(conf, 'sord-0', uselib_store='SORD',