there is no remote model choice anymore - ordering is determined by the GUI
[ardour.git] / libs / ardour / ardour / region.h
index 593832343f26580959ef945353f8db62720b3dac..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"
 
 class XMLNode;
 
-
 namespace ARDOUR {
 
 namespace Properties {
-       extern PBD::PropertyDescriptor<bool>              muted;
-       extern PBD::PropertyDescriptor<bool>              opaque;
-       extern PBD::PropertyDescriptor<bool>              locked;
-       extern PBD::PropertyDescriptor<bool>              video_locked;
-       extern PBD::PropertyDescriptor<bool>              automatic;
-       extern PBD::PropertyDescriptor<bool>              whole_file;
-       extern PBD::PropertyDescriptor<bool>              import;
-       extern PBD::PropertyDescriptor<bool>              external;
-       extern PBD::PropertyDescriptor<bool>              sync_marked;
-       extern PBD::PropertyDescriptor<bool>              left_of_split;
-       extern PBD::PropertyDescriptor<bool>              right_of_split;
-       extern PBD::PropertyDescriptor<bool>              hidden;
-       extern PBD::PropertyDescriptor<bool>              position_locked;
-       extern PBD::PropertyDescriptor<bool>              valid_transients;
-       extern PBD::PropertyDescriptor<framepos_t>        start;
-       extern PBD::PropertyDescriptor<framecnt_t>        length;
-       extern PBD::PropertyDescriptor<framepos_t>        position;
-       extern PBD::PropertyDescriptor<framecnt_t>        sync_position;
-       extern PBD::PropertyDescriptor<layer_t>           layer;
-       extern PBD::PropertyDescriptor<framepos_t>        ancestral_start;
-       extern PBD::PropertyDescriptor<framecnt_t>        ancestral_length;
-       extern PBD::PropertyDescriptor<float>             stretch;
-       extern PBD::PropertyDescriptor<float>             shift;
-       extern PBD::PropertyDescriptor<PositionLockStyle> position_lock_style;
-       extern PBD::PropertyDescriptor<uint64_t>          layering_index;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              muted;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              opaque;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              locked;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              video_locked;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              automatic;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              whole_file;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              import;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              external;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              sync_marked;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              left_of_split;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              right_of_split;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              hidden;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              position_locked;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<bool>              valid_transients;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t>        start;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t>        length;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t>        position;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t>        sync_position;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<layer_t>           layer;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t>        ancestral_start;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t>        ancestral_length;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<float>             stretch;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<float>             shift;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<PositionLockStyle> position_lock_style;
+       LIBARDOUR_API extern PBD::PropertyDescriptor<uint64_t>          layering_index;
 };
 
 class Playlist;
@@ -74,14 +72,14 @@ class Filter;
 class ExportSpecification;
 class Progress;
 
-enum RegionEditState {
+enum LIBARDOUR_API RegionEditState {
        EditChangesNothing = 0,
        EditChangesName    = 1,
        EditChangesID      = 2
 };
 
 
-class Region
+class LIBARDOUR_API Region
        : public SessionObject
        , public boost::enable_shared_from_this<Region>
        , public Readable
@@ -102,8 +100,6 @@ class 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
@@ -133,7 +129,6 @@ class 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;
 
@@ -154,7 +149,7 @@ class 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());
        }
@@ -165,7 +160,6 @@ class 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); }
@@ -213,8 +207,9 @@ class 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;
@@ -225,6 +220,8 @@ class Region
        void trim_end (framepos_t new_position);
        void trim_to (framepos_t position, framecnt_t length);
 
+       virtual void fade_range (framepos_t, framepos_t) {}
+
        void cut_front (framepos_t new_position);
        void cut_end (framepos_t new_position);
 
@@ -289,37 +286,45 @@ class 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 ();
 
@@ -353,7 +358,7 @@ class 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;
@@ -365,15 +370,26 @@ class 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&);
 
@@ -387,7 +403,7 @@ class Region
        bool verify_start (framepos_t);
        bool verify_start_and_length (framepos_t, framecnt_t&);
        bool verify_start_mutable (framepos_t&_start);
-       bool verify_length (framecnt_t);
+       bool verify_length (framecnt_t&);
 
        virtual void recompute_at_start () = 0;
        virtual void recompute_at_end () = 0;
@@ -412,7 +428,7 @@ class 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 ();