diff --git a/libs/ardour/ardour/triggerbox.h b/libs/ardour/ardour/triggerbox.h index 796839691e..ddf56345e0 100644 --- a/libs/ardour/ardour/triggerbox.h +++ b/libs/ardour/ardour/triggerbox.h @@ -76,6 +76,16 @@ class LIBARDOUR_API Trigger : public PBD::Stateful { /* explicitly call for the trigger to start */ virtual void start(); + virtual void set_start (timepos_t) = 0; + virtual void set_end (timepos_t) = 0; + /* this accepts timepos_t because the origin is assumed to be the start */ + virtual void set_length (timepos_t const &) = 0; + + timepos_t start_offset () const; /* offset from start of data */ + timepos_t end() const; /* offset from start of data */ + virtual timepos_t current_length() const = 0; /* offset from start() */ + virtual timepos_t natural_length() const = 0; /* offset from start() */ + void process_state_requests (); bool active() const { return _state >= Running; } @@ -112,9 +122,6 @@ class LIBARDOUR_API Trigger : public PBD::Stateful { Temporal::BBT_Offset quantization() const; void set_quantization (Temporal::BBT_Offset const &); - virtual void set_length (timecnt_t const &) = 0; - virtual timecnt_t current_length() const = 0; - virtual timecnt_t natural_length() const = 0; size_t index() const { return _index; } @@ -175,9 +182,14 @@ class LIBARDOUR_API AudioTrigger : public Trigger { int run (BufferSet&, pframes_t nframes, pframes_t offset, bool first); - void set_length (timecnt_t const &); - timecnt_t current_length() const; - timecnt_t natural_length() const; + void set_start (timepos_t); + void set_end (timepos_t); + /* this accepts timepos_t because the origin is assumed to be the start */ + void set_length (timepos_t const &); + timepos_t start_offset () const { return timepos_t (_start_offset); } /* offset from start of data */ + timepos_t end() const; /* offset from start of data */ + timepos_t current_length() const; /* offset from start of data */ + timepos_t natural_length() const; /* offset from start of data */ int set_region (boost::shared_ptr); @@ -189,8 +201,9 @@ class LIBARDOUR_API AudioTrigger : public Trigger { std::vector data; samplecnt_t read_index; samplecnt_t data_length; - samplepos_t start_offset; + samplepos_t _start_offset; samplecnt_t usable_length; + samplepos_t last_sample; void drop_data (); int load_data (boost::shared_ptr); diff --git a/libs/ardour/triggerbox.cc b/libs/ardour/triggerbox.cc index 81bc8f4082..184751d1c6 100644 --- a/libs/ardour/triggerbox.cc +++ b/libs/ardour/triggerbox.cc @@ -43,6 +43,7 @@ Trigger::Trigger (size_t n, TriggerBox& b) , _next_trigger (-1) , _launch_style (Toggle) , _follow_action { { NextTrigger }, { Stop } } + , _follow_action_probability (100) , _quantization (Temporal::BBT_Offset (0, 1, 0)) { } @@ -287,8 +288,9 @@ AudioTrigger::AudioTrigger (size_t n, TriggerBox& b) , data (0) , read_index (0) , data_length (0) - , start_offset (0) + , _start_offset (0) , usable_length (0) + , last_sample (0) { } @@ -300,7 +302,25 @@ AudioTrigger::~AudioTrigger () } void -AudioTrigger::set_length (timecnt_t const & newlen) +AudioTrigger::set_start (timepos_t s) +{ + _start_offset = s.samples (); +} + +void +AudioTrigger::set_end (timepos_t e) +{ + set_length (timepos_t (e.samples() - _start_offset)); +} + +timepos_t +AudioTrigger::end() const +{ + return timepos_t (_start_offset + usable_length); +} + +void +AudioTrigger::set_length (timepos_t const & newlen) { using namespace RubberBand; using namespace Temporal; @@ -315,7 +335,7 @@ AudioTrigger::set_length (timecnt_t const & newlen) load_data (ar); - if (newlen == _region->length()) { + if (newlen == timepos_t (_region->length_samples())) { /* no stretch required */ return; } @@ -337,7 +357,8 @@ AudioTrigger::set_length (timecnt_t const & newlen) new_ratio = (double) newlen.samples() / data_length; } else { /* XXX what to use for position ??? */ - const timecnt_t dur = TempoMap::use()->convert_duration (newlen, timepos_t (0), AudioTime); + timecnt_t l (newlen, timepos_t (AudioTime)); + const timecnt_t dur = TempoMap::use()->convert_duration (l, timepos_t (0), AudioTime); new_ratio = (double) dur.samples() / data_length; } @@ -425,6 +446,7 @@ AudioTrigger::set_length (timecnt_t const & newlen) data_length = processed; if (!usable_length || usable_length > data_length) { usable_length = data_length; + last_sample = _start_offset + usable_length; } } @@ -440,11 +462,13 @@ AudioTrigger::set_usable_length () break; default: usable_length = data_length; + last_sample = _start_offset + usable_length; return; } if (_quantization == Temporal::BBT_Offset ()) { usable_length = data_length; + last_sample = _start_offset + usable_length; return; } @@ -452,24 +476,25 @@ AudioTrigger::set_usable_length () timecnt_t len (Temporal::Beats (_quantization.beats, _quantization.ticks), timepos_t (Temporal::Beats())); usable_length = len.samples(); + last_sample = _start_offset + usable_length; } -timecnt_t +timepos_t AudioTrigger::current_length() const { if (_region) { - return timecnt_t (data_length); + return timepos_t (data_length); } - return timecnt_t (Temporal::BeatTime); + return timepos_t (Temporal::BeatTime); } -timecnt_t +timepos_t AudioTrigger::natural_length() const { if (_region) { - return _region->length(); + return timepos_t::from_superclock (_region->length().magnitude()); } - return timecnt_t (Temporal::BeatTime); + return timepos_t (Temporal::BeatTime); } int @@ -485,7 +510,7 @@ AudioTrigger::set_region (boost::shared_ptr r) /* this will load data, but won't stretch it for now */ - set_length (r->length ()); + set_length (timepos_t::from_superclock (r->length ().magnitude())); PropertyChanged (ARDOUR::Properties::name); @@ -511,6 +536,7 @@ AudioTrigger::load_data (boost::shared_ptr ar) /* if usable length was already set, only adjust it if it is too large */ if (!usable_length || usable_length > data_length) { usable_length = data_length; + last_sample = _start_offset + usable_length; } drop_data (); @@ -531,7 +557,7 @@ AudioTrigger::load_data (boost::shared_ptr ar) void AudioTrigger::retrigger () { - read_index = 0; + read_index = _start_offset; } int @@ -545,7 +571,7 @@ AudioTrigger::run (BufferSet& bufs, pframes_t nframes, pframes_t dest_offset, bo while (nframes) { - pframes_t this_read = (pframes_t) std::min ((samplecnt_t) nframes, (usable_length - read_index)); + pframes_t this_read = (pframes_t) std::min ((samplecnt_t) nframes, (last_sample - read_index)); DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 grab %2 @ %3 dest offset %4\n", index(), this_read, read_index, dest_offset)); @@ -565,7 +591,7 @@ AudioTrigger::run (BufferSet& bufs, pframes_t nframes, pframes_t dest_offset, bo read_index += this_read; - if (read_index >= usable_length) { + if (read_index >= last_sample) { /* We reached the end */ @@ -927,6 +953,8 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp if (trigger.state() == Trigger::Stopped) { + cerr << "stopped, check trigger " << trigger.next_trigger() << std::endl; + if (trigger.next_trigger() != -1) { int nxt = trigger.next_trigger(); @@ -1084,7 +1112,6 @@ TriggerBox::set_next_trigger (size_t current) break; } - all_triggers[current]->set_next_trigger (current); }