diff --git a/libs/ardour/ardour/mixer_scene.h b/libs/ardour/ardour/mixer_scene.h index 2b656f69b1..5ea48106a9 100644 --- a/libs/ardour/ardour/mixer_scene.h +++ b/libs/ardour/ardour/mixer_scene.h @@ -25,6 +25,7 @@ #include "ardour/libardour_visibility.h" #include "ardour/session_handle.h" +#include "ardour/types.h" namespace PBD { class Controllable; @@ -40,7 +41,7 @@ public: void snapshot (); bool apply () const; - bool apply (PBD::ControllableSet const&) const; + bool apply (PBD::ControllableSet const&, AutomationTypeSet const& ts = AutomationTypeSet()) const; void clear (); bool empty () const { return _ctrl_map.empty (); } @@ -55,7 +56,7 @@ public: private: typedef std::map ControllableValueMap; - bool recurse_to_master (boost::shared_ptr, std::set &) const; + bool recurse_to_master (boost::shared_ptr, std::set &, AutomationTypeSet const&) const; ControllableValueMap _ctrl_map; std::string _name; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 6e9ebe6a71..11a673ee46 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -639,6 +639,7 @@ typedef std::list > WeakRouteList; typedef std::list > WeakStripableList; typedef std::list > ControlList; typedef std::list > SlavableControlList; +typedef std::set AutomationTypeSet; typedef std::list > VCAList; diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index 980b4a3159..87d6c7c3b0 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -1848,7 +1848,7 @@ LuaBindings::common (lua_State* L) .beginWSPtrClass ("MixerScene") .addFunction ("apply", (bool (MixerScene::*)() const)&MixerScene::apply) - .addFunction ("apply_to", (bool (MixerScene::*)(PBD::ControllableSet const&) const)&MixerScene::apply) + .addFunction ("apply_to", (bool (MixerScene::*)(PBD::ControllableSet const&, AutomationTypeSet const&) const)&MixerScene::apply) .addFunction ("snapshot", &MixerScene::snapshot) .addFunction ("clear", &MixerScene::clear) .addFunction ("empty", &MixerScene::empty) @@ -2150,6 +2150,10 @@ LuaBindings::common (lua_State* L) .beginStdSet > ("ControllableSet") .endClass () + // typedef std::set AutomationTypeSet; + .beginStdSet ("AutomationTypeSet") + .endClass () + // typedef std::vector XrunPositions .beginStdVector ("XrunPositions") .endClass () diff --git a/libs/ardour/mixer_scene.cc b/libs/ardour/mixer_scene.cc index aa7ea93b37..d7fb5dd181 100644 --- a/libs/ardour/mixer_scene.cc +++ b/libs/ardour/mixer_scene.cc @@ -77,25 +77,35 @@ MixerScene::snapshot () } bool -MixerScene::recurse_to_master (boost::shared_ptr c, std::set & done) const +MixerScene::recurse_to_master (boost::shared_ptr c, std::set & done, AutomationTypeSet const& ts) const { if (done.find (c->id()) != done.end ()) { return false; } -#if 1 /* ignore controls in Write, or Touch + touching() state */ auto ac = boost::dynamic_pointer_cast (c); +#if 1 /* ignore controls in Write, or Touch + touching() state */ if (ac && ac->automation_write ()) { done.insert (c->id ()); return false; } #endif + if (!ts.empty ()) { + if (!ac) { + done.insert (c->id ()); + return false; + } + if (ts.find (ac->desc().type) == ts.end ()) { + done.insert (c->id ()); + return false; + } + } auto sc = boost::dynamic_pointer_cast (c); if (sc && sc->slaved ()) { /* first set masters, then set own value */ for (auto const& m : sc->masters ()) { - recurse_to_master (m, done); + recurse_to_master (m, done, ts); } } @@ -130,22 +140,23 @@ MixerScene::apply () const { bool rv = false; std::set done; + AutomationTypeSet ts; for (auto const& c : Controllable::registered_controllables ()) { - rv |= recurse_to_master (c, done); + rv |= recurse_to_master (c, done, ts); } return rv; } bool -MixerScene::apply (ControllableSet const& acs) const +MixerScene::apply (PBD::ControllableSet const& acs, AutomationTypeSet const& ts) const { bool rv = false; std::set done; for (auto const& c : acs) { - rv |= recurse_to_master (c, done); + rv |= recurse_to_master (c, done, ts); } return rv;