Cache results of lilv_port_is_a(...) in various places.
authorCarl Hetherington <carl@carlh.net>
Mon, 23 Jan 2012 18:02:22 +0000 (18:02 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 23 Jan 2012 18:02:22 +0000 (18:02 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@11315 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/lv2_plugin.h
libs/ardour/lv2_plugin.cc

index 6396e300385efdb286af6289075fd000ac08f3a4..a627c2eb43e7705f02ddc3de701077e9e05bdbbe 100644 (file)
@@ -131,6 +131,10 @@ class LV2Plugin : public ARDOUR::Plugin
        bool              _was_activated;
        bool              _has_state_interface;
        std::vector<bool> _port_is_input;
+       std::vector<bool> _port_is_output;
+       std::vector<bool> _port_is_midi;
+       std::vector<bool> _port_is_audio;
+       std::vector<bool> _port_is_control;
 
        std::map<std::string,uint32_t> _port_indices;
 
index 46fcc2b4f20cadcac7ec0a937826578339c82d6a..4c288d32c388e0d46c7884d6efcc2a2300491bbf 100644 (file)
@@ -218,6 +218,16 @@ LV2Plugin::init(void* c_plugin, framecnt_t rate)
        _sample_rate = rate;
 
        const uint32_t num_ports    = this->num_ports();
+
+       for (uint32_t i = 0; i < num_ports; ++i) {
+               const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, i);
+               _port_is_control.push_back(lilv_port_is_a(_impl->plugin, port, _world.control_class));
+               _port_is_audio.push_back(lilv_port_is_a(_impl->plugin, port, _world.audio_class));
+               _port_is_midi.push_back(lilv_port_is_a(_impl->plugin, port, _world.event_class));
+               _port_is_output.push_back(lilv_port_is_a(_impl->plugin, port, _world.output_class));
+               _port_is_input.push_back(lilv_port_is_a(_impl->plugin, port, _world.input_class));
+       }
+       
        const bool     latent       = lilv_plugin_has_latency(plugin);
        const uint32_t latency_port = (latent)
            ? lilv_plugin_get_latency_port_index(plugin)
@@ -1073,37 +1083,36 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 bool
 LV2Plugin::parameter_is_control(uint32_t param) const
 {
-       const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, param);
-       return lilv_port_is_a(_impl->plugin, port, _world.control_class);
+       assert(param < _port_is_control.size());
+       return _port_is_control[param];
 }
 
 bool
 LV2Plugin::parameter_is_audio(uint32_t param) const
 {
-       const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, param);
-       return lilv_port_is_a(_impl->plugin, port, _world.audio_class);
+       assert(param < _port_is_audio.size());
+       return _port_is_audio[param];
 }
 
 bool
 LV2Plugin::parameter_is_midi(uint32_t param) const
 {
-       const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, param);
-       return lilv_port_is_a(_impl->plugin, port, _world.event_class);
-       //      && lilv_port_supports_event(_impl->plugin, port, _world.midi_class);
+       assert(param < _port_is_midi.size());
+       return _port_is_midi[param];
 }
 
 bool
 LV2Plugin::parameter_is_output(uint32_t param) const
 {
-       const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, param);
-       return lilv_port_is_a(_impl->plugin, port, _world.output_class);
+       assert(param < _port_is_output.size());
+       return _port_is_output[param];
 }
 
 bool
 LV2Plugin::parameter_is_input(uint32_t param) const
 {
-       const LilvPort* port = lilv_plugin_get_port_by_index(_impl->plugin, param);
-       return lilv_port_is_a(_impl->plugin, port, _world.input_class);
+       assert(param < _port_is_input.size());
+       return _port_is_input[param];
 }
 
 void