Compare commits

...

2 Commits

Author SHA1 Message Date
Ben Loftis 01c7e14c6e MixerScenes: highlight momentarily recalled scenes by using libardour 'undo'
* also moves 'momentary' into libardour so it can be accessed by other UIs
2022-11-10 09:13:56 -06:00
Ben Loftis a40c8d8e9a MixerScenes: implement 'undo' function for mixer scene recalls (libardour)
* this allows the session to better report which scene was last recalled
* this potentially allows controllers (like OSC) to momentarily recall
2022-11-10 09:13:50 -06:00
4 changed files with 50 additions and 12 deletions

View File

@ -125,7 +125,6 @@ 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)
@ -447,7 +446,6 @@ Mixer_UI::~Mixer_UI ()
delete _plugin_selector;
delete track_menu;
delete _group_tabs;
delete _mixer_scene_release;
}
struct MixerStripSorter {
@ -4115,16 +4113,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 */
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);
_mixer_scene_momentary = true;
recall_mixer_scene(idx, false);
return false;
} else if (ev->button == 1) {
return false;
@ -4136,10 +4134,12 @@ Mixer_UI::scene_button_press (GdkEventButton* ev, int idx)
bool
Mixer_UI::scene_button_release (GdkEventButton* ev, int idx)
{
if (_mixer_scene_release) {
_mixer_scene_release->apply ();
delete _mixer_scene_release;
_mixer_scene_release = 0;
if (!_session) {
return false;
}
if (_mixer_scene_momentary) {
_session->apply_mixer_scene_undo();
_mixer_scene_momentary = false;
} else if (ev->button == 1) {
recall_mixer_scene (idx);
}

View File

@ -215,7 +215,7 @@ private:
std::vector<ArdourWidgets::ArdourButton*> _mixer_scene_buttons;
std::vector<Gtk::Label*> _mixer_scene_labels;
ARDOUR::MixerScene* _mixer_scene_release;
bool _mixer_scene_momentary;
void popup_scene_menu (GdkEventButton* ev, int);
bool scene_button_press (GdkEventButton*, int);

View File

@ -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<MixerScene> nth_mixer_scene (size_t, bool create_if_missing = false);
std::vector<boost::shared_ptr<MixerScene>> 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;

View File

@ -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<size_t>::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<MixerScene> 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<MixerScene> scene;
{
Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock);