diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 5ea33f54a5..ccab3e5513 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -125,6 +125,7 @@ Mixer_UI::instance () Mixer_UI::Mixer_UI () : Tabbable (_content, _("Mixer"), X_("mixer")) , plugin_search_clear_button (Stock::CLEAR) + , _mixer_scene_release (0) , no_track_list_redisplay (false) , in_group_row_change (false) , track_menu (0) @@ -446,6 +447,7 @@ Mixer_UI::~Mixer_UI () delete _plugin_selector; delete track_menu; delete _group_tabs; + delete _mixer_scene_release; } struct MixerStripSorter { @@ -4113,16 +4115,16 @@ Mixer_UI::scene_button_press (GdkEventButton* ev, int idx) return false; } - _mixer_scene_momentary = false; - if (Keyboard::is_context_menu_event (ev)) { popup_scene_menu (ev, idx); } else if (Keyboard::is_delete_event (ev)) { clear_mixer_scene (idx, true); } else if (Keyboard::is_momentary_push_event (ev)) { /* momentary */ - _mixer_scene_momentary = true; - recall_mixer_scene(idx, false); + delete _mixer_scene_release; // .. or keep existing? + _mixer_scene_release = new MixerScene (*_session); + _mixer_scene_release->snapshot (); // TODO; prevent changed signal + recall_mixer_scene (idx, false); return false; } else if (ev->button == 1) { return false; @@ -4134,12 +4136,10 @@ Mixer_UI::scene_button_press (GdkEventButton* ev, int idx) bool Mixer_UI::scene_button_release (GdkEventButton* ev, int idx) { - if (!_session) { - return false; - } - if (_mixer_scene_momentary) { - _session->apply_mixer_scene_undo(); - _mixer_scene_momentary = false; + if (_mixer_scene_release) { + _mixer_scene_release->apply (); + delete _mixer_scene_release; + _mixer_scene_release = 0; } else if (ev->button == 1) { recall_mixer_scene (idx); } diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h index fed44c4555..b05f2181ad 100644 --- a/gtk2_ardour/mixer_ui.h +++ b/gtk2_ardour/mixer_ui.h @@ -215,7 +215,7 @@ private: std::vector _mixer_scene_buttons; std::vector _mixer_scene_labels; - bool _mixer_scene_momentary; + ARDOUR::MixerScene* _mixer_scene_release; void popup_scene_menu (GdkEventButton* ev, int); bool scene_button_press (GdkEventButton*, int); diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index d4673ba2a1..0fb75a52ed 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1219,7 +1219,6 @@ 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; @@ -1439,11 +1438,7 @@ private: bool _session_range_is_free; bool _silent; samplecnt_t _remaining_latency_preroll; - - void stash_mixer_scene_undo (); - ARDOUR::MixerScene* _mixer_scene_undo; - size_t _mixer_scene_undo_idx; - size_t _last_touched_mixer_scene_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 f6cff34682..37b4424aeb 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -198,8 +198,6 @@ Session::Session (AudioEngine &eng, , _session_range_is_free (true) , _silent (false) , _remaining_latency_preroll (0) - , _mixer_scene_undo_idx (0) - , _mixer_scene_undo (0) , _last_touched_mixer_scene_idx (std::numeric_limits::max()) , _engine_speed (1.0) , _signalled_varispeed (0) @@ -818,8 +816,6 @@ 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 */ @@ -7527,32 +7523,9 @@ 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); @@ -7573,8 +7546,6 @@ 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);