diff --git a/libs/ardour/ardour/triggerbox.h b/libs/ardour/ardour/triggerbox.h index 69991616e2..67b8d80678 100644 --- a/libs/ardour/ardour/triggerbox.h +++ b/libs/ardour/ardour/triggerbox.h @@ -149,7 +149,7 @@ class LIBARDOUR_API Trigger : public PBD::Stateful { virtual timepos_t current_length() const = 0; /* offset from start() */ virtual timepos_t natural_length() const = 0; /* offset from start() */ - void process_state_requests (); + void process_state_requests (BufferSet& bufs, pframes_t dest_offset); bool active() const { return _state >= Running; } State state() const { return _state; } @@ -220,9 +220,9 @@ class LIBARDOUR_API Trigger : public PBD::Stateful { bool legato () const { return _legato; } virtual void startup (); - virtual void shutdown (); + virtual void shutdown (BufferSet& bufs, pframes_t dest_offset); virtual void jump_start (); - virtual void jump_stop (); + virtual void jump_stop (BufferSet& bufs, pframes_t dest_offset); void begin_stop (bool explicit_stop = false); bool explicitly_stopped() const { return _explicitly_stopped; } @@ -300,7 +300,7 @@ class LIBARDOUR_API Trigger : public PBD::Stateful { std::atomic _pending; - void when_stopped_during_run (); + void when_stopped_during_run (BufferSet& bufs, pframes_t dest_offset); void set_region_internal (boost::shared_ptr); virtual void retrigger() = 0; virtual void set_usable_length () = 0; @@ -332,7 +332,7 @@ class LIBARDOUR_API AudioTrigger : public Trigger { int set_region_in_worker_thread (boost::shared_ptr); void startup (); void jump_start (); - void jump_stop (); + void jump_stop (BufferSet& bufs, pframes_t dest_offset); XMLNode& get_state (void); int set_state (const XMLNode&, int version); @@ -405,7 +405,8 @@ class LIBARDOUR_API MIDITrigger : public Trigger { int set_region_in_worker_thread (boost::shared_ptr); void startup (); void jump_start (); - void jump_stop (); + void shutdown (BufferSet& bufs, pframes_t dest_offset); + void jump_stop (BufferSet& bufs, pframes_t dest_offset); XMLNode& get_state (void); int set_state (const XMLNode&, int version); diff --git a/libs/ardour/triggerbox.cc b/libs/ardour/triggerbox.cc index 5296d602f6..522ff17902 100644 --- a/libs/ardour/triggerbox.cc +++ b/libs/ardour/triggerbox.cc @@ -419,7 +419,7 @@ Trigger::startup() } void -Trigger::shutdown () +Trigger::shutdown (BufferSet& bufs, pframes_t dest_offset) { _state = Stopped; _gain = 1.0; @@ -441,12 +441,12 @@ Trigger::jump_start() } void -Trigger::jump_stop() +Trigger::jump_stop (BufferSet& bufs, pframes_t dest_offset) { /* this is used when we start a new trigger in legato mode. We do not wait for quantization. */ - shutdown (); + shutdown (bufs, dest_offset); DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 requested state %2\n", index(), enum_2_string (_state))); PropertyChanged (ARDOUR::Properties::running); } @@ -464,7 +464,7 @@ Trigger::begin_stop (bool explicit_stop) } void -Trigger::process_state_requests () +Trigger::process_state_requests (BufferSet& bufs, pframes_t dest_offset) { bool stop = _requests.stop.exchange (false); @@ -473,7 +473,7 @@ Trigger::process_state_requests () /* This is for an immediate stop, not a quantized one */ if (_state != Stopped) { - shutdown (); + shutdown (bufs, dest_offset); DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 immediate stop implemented\n", name())); } @@ -554,7 +554,7 @@ Trigger::process_state_requests () case WaitingToStart: /* didn't even get started */ - shutdown (); + shutdown (bufs, dest_offset); DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 unbanged, never started, now stopped\n", index())); } } @@ -692,7 +692,7 @@ Trigger::maybe_compute_next_transition (samplepos_t start_sample, Temporal::Beat } void -Trigger::when_stopped_during_run () +Trigger::when_stopped_during_run (BufferSet& bufs, pframes_t dest_offset) { if (_state == Stopped || _state == Stopping) { @@ -708,7 +708,7 @@ Trigger::when_stopped_during_run () /* have played the specified number of times, we're done */ DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 loop cnt %2 satisfied, now stopped\n", index(), _follow_count)); - shutdown (); + shutdown (bufs, dest_offset); } else if (_state == Stopping) { @@ -719,7 +719,7 @@ Trigger::when_stopped_during_run () */ DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 not at end, but ow stopped\n", index())); - shutdown (); + shutdown (bufs, dest_offset); } else { @@ -808,9 +808,9 @@ AudioTrigger::jump_start () } void -AudioTrigger::jump_stop () +AudioTrigger::jump_stop (BufferSet& bufs, pframes_t dest_offset) { - Trigger::jump_stop (); + Trigger::jump_stop (bufs, dest_offset); retrigger (); } @@ -1414,7 +1414,7 @@ AudioTrigger::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sa } if (_state == Stopped || _state == Stopping) { - when_stopped_during_run (); + when_stopped_during_run (bufs, dest_offset); } return orig_nframes - nframes; @@ -1484,9 +1484,21 @@ MIDITrigger::jump_start () } void -MIDITrigger::jump_stop () +MIDITrigger::shutdown (BufferSet& bufs, pframes_t dest_offset) { - Trigger::jump_stop (); + Trigger::shutdown (bufs, dest_offset); + MidiBuffer& mb (bufs.get_midi (0)); + tracker.resolve_notes (mb, dest_offset); +} + +void +MIDITrigger::jump_stop (BufferSet& bufs, pframes_t dest_offset) +{ + Trigger::jump_stop (bufs, dest_offset); + + MidiBuffer& mb (bufs.get_midi (0)); + tracker.resolve_notes (mb, dest_offset); + retrigger (); } @@ -1771,7 +1783,7 @@ MIDITrigger::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sam } if (_state == Stopped || _state == Stopping) { - when_stopped_during_run (); + when_stopped_during_run (bufs, dest_offset); } return orig_nframes - nframes; @@ -2383,7 +2395,7 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp std::vector to_run; for (uint32_t n = 0; n < all_triggers.size(); ++n) { - all_triggers[n]->process_state_requests (); + all_triggers[n]->process_state_requests (bufs, nframes - 1); } /* cue handling is over at this point, reset _active_scene to reflect this */ @@ -2490,7 +2502,7 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp nxt = trigger (n); nxt->jump_start (); - _currently_playing->jump_stop (); + _currently_playing->jump_stop (bufs, dest_offset); /* and switch */ DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 => %2 switched to in legato mode\n", _currently_playing->index(), nxt->index())); _currently_playing = nxt;