diff --git a/libs/ardour/ardour/mixer_scene.h b/libs/ardour/ardour/mixer_scene.h index afb9a5f156..7bdd6bb86a 100644 --- a/libs/ardour/ardour/mixer_scene.h +++ b/libs/ardour/ardour/mixer_scene.h @@ -40,6 +40,7 @@ public: void snapshot (); bool apply () const; + bool apply (AutomationControlSet const&) const; void clear (); bool empty () const { return _ctrl_map.empty (); } diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 1c5d340ba1..3caae966f0 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1215,6 +1215,7 @@ public: boost::shared_ptr recently_touched_controllable () const; bool apply_nth_mixer_scene (size_t); + bool apply_nth_mixer_scene (size_t, RouteList const&); void store_nth_mixer_scene (size_t); bool nth_mixer_scene_valid (size_t) const; diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index 9fa7f8b994..a0cd532bb6 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -1846,7 +1846,8 @@ LuaBindings::common (lua_State* L) .endClass () .beginWSPtrClass ("MixerScene") - .addFunction ("apply", &MixerScene::apply) + .addFunction ("apply", (bool (MixerScene::*)() const)&MixerScene::apply) + .addFunction ("apply_to", (bool (MixerScene::*)(AutomationControlSet const&) const)&MixerScene::apply) .addFunction ("snapshot", &MixerScene::snapshot) .addFunction ("clear", &MixerScene::clear) .addFunction ("empty", &MixerScene::empty) @@ -2809,7 +2810,8 @@ LuaBindings::common (lua_State* L) .addFunction ("bundles", &Session::bundles) - .addFunction ("apply_nth_mixer_scene", &Session::apply_nth_mixer_scene) + .addFunction ("apply_nth_mixer_scene", (bool (Session::*)(size_t))&Session::apply_nth_mixer_scene) + .addFunction ("apply_nth_mixer_scene_to", (bool (Session::*)(size_t, RouteList const&))&Session::apply_nth_mixer_scene) .addFunction ("store_nth_mixer_scene", &Session::store_nth_mixer_scene) .addFunction ("nth_mixer_scene_valid", &Session::nth_mixer_scene_valid) .addFunction ("nth_mixer_scene", &Session::nth_mixer_scene) diff --git a/libs/ardour/mixer_scene.cc b/libs/ardour/mixer_scene.cc index 0a7901f22d..5a5c447965 100644 --- a/libs/ardour/mixer_scene.cc +++ b/libs/ardour/mixer_scene.cc @@ -138,6 +138,19 @@ MixerScene::apply () const return rv; } +bool +MixerScene::apply (AutomationControlSet const& acs) const +{ + bool rv = false; + std::set done; + + for (auto const& c : acs) { + rv |= recurse_to_master (c, done); + } + + return rv; +} + XMLNode& MixerScene::get_state () const { diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 7f2de21938..62f08ffbbe 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -7536,6 +7536,30 @@ Session::apply_nth_mixer_scene (size_t nth) return scene->apply (); } +bool +Session::apply_nth_mixer_scene (size_t nth, RouteList const& rl) +{ + boost::shared_ptr scene; + { + Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock); + if (_mixer_scenes.size () <= nth) { + return false; + } + if (!_mixer_scenes[nth]) { + return false; + } + scene = _mixer_scenes[nth]; + } + assert (scene); + + AutomationControlSet acs; + for (auto const& r : rl) { + r->automatables (acs); + } + + return scene->apply (acs); +} + void Session::store_nth_mixer_scene (size_t nth) {