diff options
author | Robin Gareus <robin@gareus.org> | 2017-05-05 15:26:52 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-05-05 15:26:52 +0200 |
commit | 3a75e7c53b62a69976714e30c4307d955a711047 (patch) | |
tree | c5db9b9cd2ff28b3cba0c23f79e70cafef83b687 /libs/surfaces/faderport8 | |
parent | 337b100b47f432c2057cd4d6b952587f5edce859 (diff) |
FP8: solo+mute undo
Eventually this should be moved into libardour: Mixer undo history.
the tentative solution is specifically ifdef'ed FP8_MUTESOLO_UNDO.
Diffstat (limited to 'libs/surfaces/faderport8')
-rw-r--r-- | libs/surfaces/faderport8/actions.cc | 80 | ||||
-rw-r--r-- | libs/surfaces/faderport8/callbacks.cc | 15 | ||||
-rw-r--r-- | libs/surfaces/faderport8/faderport8.h | 13 |
3 files changed, 101 insertions, 7 deletions
diff --git a/libs/surfaces/faderport8/actions.cc b/libs/surfaces/faderport8/actions.cc index a0711f599e..a14c516c3c 100644 --- a/libs/surfaces/faderport8/actions.cc +++ b/libs/surfaces/faderport8/actions.cc @@ -67,7 +67,11 @@ FaderPort8::setup_actions () BindAction (BtnUndo, "Editor", "undo"); BindAction (BtnRedo, "Editor", "redo"); +#ifdef FP8_MUTESOLO_UNDO + BindMethod (BtnSoloClear, button_solo_clear); +#else BindAction (BtnSoloClear, "Main", "cancel-solo"); +#endif BindMethod (BtnMuteClear, button_mute_clear); BindMethod (FP8Controls::BtnArmAll, button_arm_all); @@ -242,6 +246,44 @@ FaderPort8::button_varispeed (bool ffw) session->request_transport_speed (speed, false); } +#ifdef FP8_MUTESOLO_UNDO +void +FaderPort8::button_solo_clear () +{ + bool soloing = session->soloing() || session->listening(); + if (soloing) { + StripableList all; + session->get_stripables (all); + for (StripableList::const_iterator i = all.begin(); i != all.end(); ++i) { + if ((*i)->is_master() || (*i)->is_auditioner() || (*i)->is_monitor()) { + continue; + } + boost::shared_ptr<AutomationControl> ac = (*i)->solo_control(); + if (ac && ac->get_value () > 0) { + _solo_state.push_back (boost::weak_ptr<AutomationControl>(ac)); + } + } + AccessAction ("Main", "cancel-solo"); + } else { + /* restore solo */ + boost::shared_ptr<ControlList> cl (new ControlList); + for (std::vector <boost::weak_ptr<AutomationControl> >::const_iterator i = _solo_state.begin(); i != _solo_state.end(); ++i) { + boost::shared_ptr<AutomationControl> ac = (*i).lock(); + if (!ac) { + continue; + } + if (ac->automation_state() == Touch && !ac->touching ()) { + ac->start_touch (ac->session().transport_frame()); + } + cl->push_back (ac); + } + if (!cl->empty()) { + session->set_controls (cl, 1.0, PBD::Controllable::NoGroup); + } + } +} +#endif + void FaderPort8::button_mute_clear () { @@ -249,18 +291,46 @@ FaderPort8::button_mute_clear () session->get_stripables (all); boost::shared_ptr<ControlList> cl (new ControlList); for (StripableList::const_iterator i = all.begin(); i != all.end(); ++i) { - if ((*i)->is_master() || (*i)->is_monitor()) { + if ((*i)->is_auditioner() || (*i)->is_monitor()) { continue; } boost::shared_ptr<AutomationControl> ac = (*i)->mute_control(); if (ac && ac->get_value () > 0) { - if (ac->automation_state() == Touch && !ac->touching ()) { - ac->start_touch (ac->session().transport_frame()); - } cl->push_back (ac); } } - session->set_controls (cl, 0.0, PBD::Controllable::UseGroup); + + bool mute = false; +#ifdef FP8_MUTESOLO_UNDO + if (cl->empty ()) { + /* restore mute */ + for (std::vector <boost::weak_ptr<AutomationControl> >::const_iterator i = _mute_state.begin(); i != _mute_state.end(); ++i) { + boost::shared_ptr<AutomationControl> ac = (*i).lock(); + if (ac) { + cl->push_back (ac); + } + } + mute = true; + } else { + /* save muted control IDs */ + _mute_state.clear (); + for (ControlList::const_iterator i = cl->begin (); i != cl->end (); ++i) { + _mute_state.push_back (boost::weak_ptr<AutomationControl>(*i)); + } + } +#endif + + if (cl->empty ()) { + return; + } + + for (ControlList::const_iterator i = cl->begin (); i != cl->end (); ++i) { + if ((*i)->automation_state() == Touch && !(*i)->touching ()) { + (*i)->start_touch ((*i)->session().transport_frame()); + } + } + + session->set_controls (cl, mute ? 1.0 : 0.0, mute ? PBD::Controllable::NoGroup : PBD::Controllable::UseGroup); } void diff --git a/libs/surfaces/faderport8/callbacks.cc b/libs/surfaces/faderport8/callbacks.cc index 72aa8228bf..fa822bb8df 100644 --- a/libs/surfaces/faderport8/callbacks.cc +++ b/libs/surfaces/faderport8/callbacks.cc @@ -184,7 +184,13 @@ FaderPort8::notify_history_changed () void FaderPort8::notify_solo_changed () { - _ctrls.button (FP8Controls::BtnSoloClear).set_active (session->soloing() || session->listening()); + bool soloing = session->soloing() || session->listening(); + _ctrls.button (FP8Controls::BtnSoloClear).set_active (soloing); +#ifdef FP8_MUTESOLO_UNDO + if (soloing) { + _solo_state.clear (); + } +#endif } void @@ -193,7 +199,7 @@ FaderPort8::notify_mute_changed () bool muted = false; boost::shared_ptr<RouteList> rl = session->get_routes(); for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { - if ((*i)->is_master() || (*i)->is_monitor()) { + if ((*i)->is_auditioner() || (*i)->is_monitor()) { continue; } boost::shared_ptr<MuteControl> mc = (*i)->mute_control(); @@ -202,5 +208,10 @@ FaderPort8::notify_mute_changed () break; } } +#ifdef FP8_MUTESOLO_UNDO + if (muted) { + _mute_state.clear (); + } +#endif _ctrls.button (FP8Controls::BtnMuteClear).set_active (muted); } diff --git a/libs/surfaces/faderport8/faderport8.h b/libs/surfaces/faderport8/faderport8.h index e4809e6d2d..aa1fb8a1fc 100644 --- a/libs/surfaces/faderport8/faderport8.h +++ b/libs/surfaces/faderport8/faderport8.h @@ -20,6 +20,10 @@ #ifndef ardour_surface_faderport8_h #define ardour_surface_faderport8_h +// allow to undo "mute clear", "solo clear" +// eventually this should use some libardour mixer history/undo +#define FP8_MUTESOLO_UNDO + #include <list> #include <map> #include <glibmm/threads.h> @@ -243,6 +247,9 @@ private: void button_loop (); void button_metronom (); void button_varispeed (bool); +#ifdef FP8_MUTESOLO_UNDO + void button_solo_clear (); +#endif void button_mute_clear (); void button_arm (bool); void button_arm_all (); @@ -255,6 +262,12 @@ private: void encoder_navigate (bool, int); void encoder_parameter (bool, int); + /* mute undo history */ +#ifdef FP8_MUTESOLO_UNDO + std::vector <boost::weak_ptr<ARDOUR::AutomationControl> > _mute_state; + std::vector <boost::weak_ptr<ARDOUR::AutomationControl> > _solo_state; +#endif + /* user bound actions */ void button_user (bool, FP8Controls::ButtonId); |