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
This commit is contained in:
parent
cc912cca1b
commit
a40c8d8e9a
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user