there is no remote model choice anymore - ordering is determined by the GUI
[ardour.git] / libs / ardour / ardour / region.h
index 54cfd57fea55b478b3640b76d016d6bd405dff9f..29f4244dffb448cc3779886f131f8a415d116060 100644 (file)
@@ -27,7 +27,6 @@
 
 #include "pbd/undo.h"
 #include "pbd/signals.h"
-
 #include "ardour/ardour.h"
 #include "ardour/data_type.h"
 #include "ardour/automatable.h"
@@ -101,8 +100,6 @@ class LIBARDOUR_API Region
 
        const DataType& data_type () const { return _type; }
 
-       AnalysisFeatureList transients () { return _transients; };
-
        /** How the region parameters play together:
         *
         * POSITION: first frame of the region along the timeline
@@ -132,7 +129,6 @@ class LIBARDOUR_API Region
 
        frameoffset_t sync_offset (int& dir) const;
        framepos_t sync_position () const;
-       framepos_t sync_point () const;
 
        framepos_t adjust_to_sync (framepos_t) const;
 
@@ -153,7 +149,7 @@ class LIBARDOUR_API Region
        Evoral::Range<framepos_t> last_range () const {
                return Evoral::Range<framepos_t> (_last_position, _last_position + _last_length - 1);
        }
-       
+
        Evoral::Range<framepos_t> range () const {
                return Evoral::Range<framepos_t> (first_frame(), last_frame());
        }
@@ -164,7 +160,6 @@ class LIBARDOUR_API Region
        bool locked ()           const { return _locked; }
        bool position_locked ()  const { return _position_locked; }
        bool video_locked ()     const { return _video_locked; }
-       bool valid_transients () const { return _valid_transients; }
        bool automatic ()        const { return _automatic; }
        bool whole_file ()       const { return _whole_file; }
        bool captured ()         const { return !(_import || _external); }
@@ -212,8 +207,9 @@ class LIBARDOUR_API Region
        void set_length (framecnt_t);
        void set_start (framepos_t);
        void set_position (framepos_t);
+       void set_initial_position (framepos_t);
        void special_set_position (framepos_t);
-       virtual void update_after_tempo_map_change ();
+       virtual void update_after_tempo_map_change (bool send_change = true);
        void nudge_position (frameoffset_t);
 
        bool at_natural_position () const;
@@ -290,37 +286,45 @@ class LIBARDOUR_API Region
                // no transients, but its OK
        }
 
-       virtual int update_transient (framepos_t /* old_position */, framepos_t /* new_position */) {
+       virtual void clear_transients () {
                // no transients, but its OK
-               return 0;
        }
 
-       virtual void remove_transient (framepos_t /* where */) {
+       virtual void update_transient (framepos_t /* old_position */, framepos_t /* new_position */) {
                // no transients, but its OK
        }
 
-       virtual int set_transients (AnalysisFeatureList&) {
+       virtual void remove_transient (framepos_t /* where */) {
                // no transients, but its OK
-               return 0;
        }
 
-       virtual int get_transients (AnalysisFeatureList&, bool force_new = false) {
-               (void) force_new;
+       virtual void set_onsets (AnalysisFeatureList&) {
                // no transients, but its OK
-               return 0;
        }
 
-       virtual int adjust_transients (frameoffset_t /*delta*/) {
+       /** merges _onsets and _user_transients into given list
+        * and removed exact duplicates.
+        */
+       void transients (AnalysisFeatureList&);
+
+       /** merges _onsets OR _transients with _user_transients into given list
+        * if _onsets and _transients are unset, run analysis.
+        * list is not thinned, duplicates remain in place.
+        * 
+        * intended for: Playlist::find_next_transient ()
+        */
+       virtual void get_transients (AnalysisFeatureList&) {
                // no transients, but its OK
-               return 0;
        }
 
+       bool has_transients () const;
+
        virtual int separate_by_channel (ARDOUR::Session&,
                        std::vector< boost::shared_ptr<Region> >&) const {
                return 0;
        }
 
-       void invalidate_transients ();
+       void maybe_invalidate_transients ();
 
        void drop_sources ();
 
@@ -354,7 +358,7 @@ class LIBARDOUR_API Region
        virtual void set_position_internal (framepos_t pos, bool allow_bbt_recompute);
        virtual void set_length_internal (framecnt_t);
        virtual void set_start_internal (framecnt_t);
-       
+
        DataType _type;
 
        PBD::Property<bool>        _sync_marked;
@@ -366,15 +370,26 @@ class LIBARDOUR_API Region
        PBD::Property<framepos_t>  _position;
        /** Sync position relative to the start of our file */
        PBD::Property<framepos_t>  _sync_position;
-       
+
        SourceList              _sources;
        /** Used when timefx are applied, so we can always use the original source */
        SourceList              _master_sources;
 
-       AnalysisFeatureList     _transients;
-       
        boost::weak_ptr<ARDOUR::Playlist> _playlist;
-       
+
+       void merge_features (AnalysisFeatureList&, const AnalysisFeatureList&, const frameoffset_t) const;
+
+       AnalysisFeatureList     _onsets; // used by the Ferret (Aubio OnsetDetector)
+
+       // _transient_user_start is covered by  _valid_transients
+       AnalysisFeatureList     _user_transients; // user added
+       framepos_t              _transient_user_start; // region's _start relative to user_transients
+
+       // these are used by Playlist::find_next_transient() in absence of onsets
+       AnalysisFeatureList     _transients; // Source Analysis (QM Transient), user read-only
+       framepos_t              _transient_analysis_start;
+       framepos_t              _transient_analysis_end;
+
   private:
        void mid_thaw (const PBD::PropertyChange&);
 
@@ -413,7 +428,7 @@ class LIBARDOUR_API Region
        framecnt_t              _last_length;
        framepos_t              _last_position;
        mutable RegionEditState _first_edit;
-       Timecode::BBT_Time      _bbt_time;
+       double                  _beat;
        layer_t                 _layer;
 
        void register_properties ();