Optimize automation-event process splitting
[ardour.git] / libs / ardour / lv2_plugin.cc
index 1fd54c6286c3ddb434d3ef2b85aabff8c6f034af..79bef11cdde146bb9170f406d56800eafbbb5342 100644 (file)
@@ -51,6 +51,7 @@
 
 #include "ardour/audio_buffer.h"
 #include "ardour/audioengine.h"
+#include "ardour/directory_names.h"
 #include "ardour/debug.h"
 #include "ardour/lv2_plugin.h"
 #include "ardour/midi_patch_manager.h"
@@ -1380,13 +1381,20 @@ LV2Plugin::add_state(XMLNode* root) const
                unsigned int saved_state = _state_version;;
                g_mkdir_with_parents(new_dir.c_str(), 0744);
 
+               std::string xternal_dir = _session.externals_dir ();
+
+               if (!_plugin_state_dir.empty()) {
+                       xternal_dir = Glib::build_filename (_plugin_state_dir, externals_dir_name);
+                       g_mkdir_with_parents(xternal_dir.c_str(), 0744);
+               }
+
                LilvState* state = lilv_state_new_from_instance(
                        _impl->plugin,
                        _impl->instance,
                        _uri_map.urid_map(),
                        scratch_dir().c_str(),
                        file_dir().c_str(),
-                       _session.externals_dir().c_str(),
+                       xternal_dir.c_str(),
                        new_dir.c_str(),
                        NULL,
                        const_cast<LV2Plugin*>(this),
@@ -1416,6 +1424,7 @@ LV2Plugin::add_state(XMLNode* root) const
                        } else {
                                // template save (dedicated state-dir)
                                lilv_state_free(state);
+                               g_rmdir (xternal_dir.c_str()); // try remove unused dir
                                --_state_version;
                        }
                } else {
@@ -1983,6 +1992,16 @@ LV2Plugin::load_supported_properties(PropertyDescriptors& descs)
        lilv_nodes_free(properties);
 }
 
+Variant
+LV2Plugin::get_property_value (uint32_t prop_id) const
+{
+       std::map<uint32_t, Variant>::const_iterator it;
+       if ((it = _property_values.find (prop_id)) == _property_values.end()) {
+               return Variant();
+       }
+       return it->second;
+}
+
 void
 LV2Plugin::announce_property_values()
 {
@@ -2559,7 +2578,7 @@ write_position(LV2_Atom_Forge*     forge,
 int
 LV2Plugin::connect_and_run(BufferSet& bufs,
                samplepos_t start, samplepos_t end, double speed,
-               ChanMapping in_map, ChanMapping out_map,
+               ChanMapping const& in_map, ChanMapping const& out_map,
                pframes_t nframes, samplecnt_t offset)
 {
        DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
@@ -2935,6 +2954,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
                                                                // Emit PropertyChanged signal for UI
                                                                // TODO: This should emit the control's Changed signal
                                                                PropertyChanged(prop_id, Variant(Variant::PATH, path));
+                                                               _property_values[prop_id] = Variant(Variant::PATH, path);
                                                        } else {
                                                                std::cerr << "warning: patch:Set for unknown property" << std::endl;
                                                        }