From fd2f2f46cce42253d9425fc13ebac219eca9566b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 5 Jan 2022 10:26:10 -0700 Subject: [PATCH] triggerbox: implement cue-triggering session event handling (sync with location markers) Still requires handling tempo changes --- libs/ardour/ardour/session.h | 1 + libs/ardour/session_events.cc | 2 +- libs/ardour/session_process.cc | 83 ++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 228eb07498..51eb635062 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -2301,6 +2301,7 @@ private: void setup_thread_local_variables (); void cue_marker_change (Location*); void sync_cues (); + void sync_cues_from_list (Locations::LocationList const &); }; diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index 5f4a3f42df..a0c880282b 100644 --- a/libs/ardour/session_events.cc +++ b/libs/ardour/session_events.cc @@ -162,7 +162,7 @@ SessionEventManager::dump_events () const cerr << "EVENT DUMP" << endl; for (Events::const_iterator i = events.begin(); i != events.end(); ++i) { - cerr << "\tat " << (*i)->action_sample << ' ' << enum_2_string ((*i)->type) << " target = " << (*i)->target_sample << endl; + cerr << "\tat " << (*i)->action_sample << " type " << enum_2_string ((*i)->type) << " target = " << (*i)->target_sample << endl; } cerr << "Next event: "; diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 723c654e46..74fc9a7fd1 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -861,6 +861,11 @@ Session::set_next_event () break; } } + if (next_event != events.end()) { + DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("@ %1 next event set to %2 @ %3\n", _transport_sample, enum_2_string ((*next_event)->type), (*next_event)->action_sample)); + } else { + DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("no next event for %1\n", _transport_sample)); + } } void @@ -968,6 +973,8 @@ Session::process_event (SessionEvent* ev) case SessionEvent::TriggerSceneChange: TriggerBox::scene_bang (ev->scene); + remove = false; + del = false; break; case SessionEvent::PunchIn: @@ -1588,5 +1595,81 @@ Session::implement_master_strategy () void Session::sync_cues () { + std::cerr << "Need to sync cues!\n"; + + _locations->apply (*this, &Session::sync_cues_from_list); + } +struct LocationByTime +{ + bool operator() (Location const *a, Location const * b) { + return a->start() < b->start(); + } +}; + +void +Session::sync_cues_from_list (Locations::LocationList const & locs) +{ + /* iterate over all cue markers, check there is a SessionEvent for them all */ + + Locations::LocationList sorted (locs); + LocationByTime cmp; + + sorted.sort (cmp); + + Events::iterator evi = events.begin(); + + for (auto const & loc : locs) { + + if (loc->is_cue_marker()) { + + const samplepos_t cue_sample = loc->start_sample(); + + if (evi == events.end()) { + + SessionEvent* ev = new SessionEvent (SessionEvent::TriggerSceneChange, SessionEvent::Add, cue_sample, 0, 0); + ev->scene = loc->cue_id(); + events.insert (evi, ev); + + } else if (cue_sample > (*evi)->target_sample) { + + SessionEvent* ev = new SessionEvent (SessionEvent::TriggerSceneChange, SessionEvent::Add, cue_sample, 0, 0); + ev->scene = loc->cue_id(); + events.insert (evi, ev); + + /* we don't advance evi here because we inserted before it */ + + } else if ((*evi)->type == SessionEvent::TriggerSceneChange) { + + if ((*evi)->action_sample == cue_sample) { + + /* replace the contents of the event */ + (*evi)->scene = loc->cue_id(); + ++evi; + + } else if ((*evi)->action_sample < cue_sample) { + + /* existing event but no corresponding cue marker */ + evi = events.erase (evi); + } + } else { + ++evi; + } + + } + } + + /* Remove any relevant events that are timestamped after the last cue marker */ + + while (evi != events.end()) { + if ((*evi)->type == SessionEvent::TriggerSceneChange) { + evi = events.erase (evi); + } else { + ++evi; + } + } + + dump_events (); + set_next_event (); +}