diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 0fb75a52ed..d4673ba2a1 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1219,6 +1219,7 @@ public: void store_nth_mixer_scene (size_t); bool nth_mixer_scene_valid (size_t) const; size_t last_touched_mixer_scene_idx () {return _last_touched_mixer_scene_idx;} + void apply_mixer_scene_undo (); boost::shared_ptr nth_mixer_scene (size_t, bool create_if_missing = false); std::vector> mixer_scenes () const; @@ -1438,7 +1439,11 @@ private: bool _session_range_is_free; bool _silent; samplecnt_t _remaining_latency_preroll; - size_t _last_touched_mixer_scene_idx; + + void stash_mixer_scene_undo (); + ARDOUR::MixerScene* _mixer_scene_undo; + size_t _mixer_scene_undo_idx; + size_t _last_touched_mixer_scene_idx; // varispeed playback -- TODO: move out of session to backend. double _engine_speed; diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 37b4424aeb..7ef140fc83 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -198,7 +198,13 @@ Session::Session (AudioEngine &eng, , _session_range_is_free (true) , _silent (false) , _remaining_latency_preroll (0) +<<<<<<< HEAD , _last_touched_mixer_scene_idx (std::numeric_limits::max()) +======= + , _mixer_scene_undo_idx (0) + , _mixer_scene_undo (0) + , _last_touched_mixer_scene_idx (999) +>>>>>>> c0379f7432 (MixerScenes: implement 'undo' function for mixer scene recalls (libardour)) , _engine_speed (1.0) , _signalled_varispeed (0) , auto_play_legal (false) @@ -816,6 +822,8 @@ Session::destroy () delete midi_clock; + delete _mixer_scene_undo; + /* clear event queue, the session is gone, nobody is interested in * those anymore, but they do leak memory if not removed */ @@ -7523,9 +7531,32 @@ Session::nth_mixer_scene_valid (size_t nth) const return !_mixer_scenes[nth]->empty (); } +void +Session::stash_mixer_scene_undo () +{ + delete _mixer_scene_undo; // .. or keep existing? + _mixer_scene_undo = new MixerScene (*this); + _mixer_scene_undo->snapshot (); + _mixer_scene_undo_idx = _last_touched_mixer_scene_idx; +} + +void +Session::apply_mixer_scene_undo () +{ + if (_mixer_scene_undo) { + _mixer_scene_undo->apply (); + delete _mixer_scene_undo; + _mixer_scene_undo = 0; + _last_touched_mixer_scene_idx = _mixer_scene_undo_idx; + } + MixerScene::Change(); +} + bool Session::apply_nth_mixer_scene (size_t nth) { + stash_mixer_scene_undo(); + boost::shared_ptr scene; { Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock); @@ -7546,6 +7577,8 @@ Session::apply_nth_mixer_scene (size_t nth) bool Session::apply_nth_mixer_scene (size_t nth, RouteList const& rl) { + stash_mixer_scene_undo(); + boost::shared_ptr scene; { Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock);