X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fplaylist.h;h=9e15b9cf5d10795f2d283d93eb866a3d12e296ea;hb=cd2047cbffc5e0270acab555364bb9d958fe7927;hp=d13789fa380daf4998bca37e577ccc2c11925cef;hpb=792e3de1d4cb291a02c5c31dad54028049bafed9;p=ardour.git diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index d13789fa38..9e15b9cf5d 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -35,7 +35,6 @@ #include "pbd/undo.h" #include "pbd/stateful.h" -#include "pbd/stateful_owner.h" #include "pbd/statefuldestructible.h" #include "pbd/sequence_property.h" @@ -43,8 +42,6 @@ #include "ardour/ardour.h" #include "ardour/session_object.h" -#include "ardour/crossfade_compare.h" -#include "ardour/location.h" #include "ardour/data_type.h" namespace ARDOUR { @@ -52,43 +49,40 @@ namespace ARDOUR { class Session; class Region; class Playlist; +class Crossfade; namespace Properties { - /* fake the type, since regions are handled by SequenceProperty which doesn't - care about such things. - */ - extern PBD::PropertyDescriptor regions; + /* fake the type, since regions are handled by SequenceProperty which doesn't + care about such things. + */ + extern PBD::PropertyDescriptor regions; } -class RegionListProperty : public PBD::SequenceProperty > > +class RegionListProperty : public PBD::SequenceProperty > > { public: - RegionListProperty (Playlist&); + RegionListProperty (Playlist&); - boost::shared_ptr lookup_id (const PBD::ID& id); - void diff (PBD::PropertyList& undo, PBD::PropertyList& redo) const; + RegionListProperty* clone () const; + void get_content_as_xml (boost::shared_ptr, XMLNode &) const; + boost::shared_ptr get_content_from_xml (XMLNode const &) const; private: - friend class Playlist; - std::list > rlist() { return _val; } - - /* we live and die with our playlist, no lifetime management needed */ - Playlist& _playlist; - - /* create a copy of this RegionListProperty that only - has what is needed for use in a history list command. This - means that it won't contain the actual region list but - will have the added/removed list. - */ - RegionListProperty* copy_for_history () const; + RegionListProperty* create () const; + + /* copy construction only by ourselves */ + RegionListProperty (RegionListProperty const & p); + + friend class Playlist; + /* we live and die with our playlist, no lifetime management needed */ + Playlist& _playlist; }; -class Playlist : public SessionObject - , public PBD::StatefulOwner - , public boost::enable_shared_from_this { - public: - typedef std::list > RegionList; - static void make_property_quarks (); +class Playlist : public SessionObject , public boost::enable_shared_from_this +{ +public: + typedef std::list > RegionList; + static void make_property_quarks (); Playlist (Session&, const XMLNode&, DataType type, bool hidden = false); Playlist (Session&, std::string name, DataType type, bool hidden = false); @@ -97,14 +91,13 @@ class Playlist : public SessionObject virtual ~Playlist (); - bool set_property (const PBD::PropertyBase&); - void update (const RegionListProperty::ChangeRecord&); - void clear_owned_history (); - void rdiff (std::vector&) const; + void update (const RegionListProperty::ChangeRecord&); + void clear_owned_changes (); + void rdiff (std::vector&) const; - PBD::PropertyList* property_factory (const XMLNode&) const; + boost::shared_ptr region_by_id (const PBD::ID&) const; - boost::shared_ptr region_by_id (const PBD::ID&); + uint32_t max_source_level () const; void set_region_ownership (); @@ -116,7 +109,7 @@ class Playlist : public SessionObject bool used () const { return _refcnt != 0; } bool set_name (const std::string& str); - int sort_id() { return _sort_id; } + int sort_id() { return _sort_id; } const DataType& data_type() const { return _type; } @@ -126,7 +119,7 @@ class Playlist : public SessionObject bool hidden() const { return _hidden; } bool empty() const; uint32_t n_regions() const; - std::pair get_extent () const; + std::pair get_extent () const; layer_t top_layer() const; EditMode get_edit_mode() const { return _edit_mode; } @@ -136,6 +129,7 @@ class Playlist : public SessionObject void add_region (boost::shared_ptr, framepos_t position, float times = 1, bool auto_partition = false); void remove_region (boost::shared_ptr); + void remove_region_by_source (boost::shared_ptr); void get_equivalent_regions (boost::shared_ptr, std::vector >&); void get_region_list_equivalent_regions (boost::shared_ptr, std::vector >&); void replace_region (boost::shared_ptr old, boost::shared_ptr newr, framepos_t pos); @@ -145,6 +139,9 @@ class Playlist : public SessionObject void partition (framepos_t start, framepos_t end, bool cut = false); void duplicate (boost::shared_ptr, framepos_t position, float times); void nudge_after (framepos_t start, framecnt_t distance, bool forwards); + boost::shared_ptr combine (const RegionList&); + void uncombine (boost::shared_ptr); + void shuffle (boost::shared_ptr, int dir); void update_after_tempo_map_change (); @@ -155,8 +152,11 @@ class Playlist : public SessionObject const RegionListProperty& region_list () const { return regions; } RegionList* regions_at (framepos_t frame); + uint32_t count_regions_at (framepos_t) const; + uint32_t count_joined_regions () const; RegionList* regions_touched (framepos_t start, framepos_t end); RegionList* regions_to_read (framepos_t start, framepos_t end); + uint32_t region_use_count (boost::shared_ptr) const; boost::shared_ptr find_region (const PBD::ID&) const; boost::shared_ptr top_region_at (framepos_t frame); boost::shared_ptr top_unmuted_region_at (framepos_t frame); @@ -165,6 +165,7 @@ class Playlist : public SessionObject bool region_is_shuffle_constrained (boost::shared_ptr); bool has_region_at (framepos_t const) const; + bool uses_source (boost::shared_ptr src) const; framepos_t find_next_transient (framepos_t position, int dir); @@ -181,20 +182,25 @@ class Playlist : public SessionObject PBD::Signal0 NameChanged; PBD::Signal0 LengthChanged; PBD::Signal0 LayeringChanged; - PBD::Signal1 > const &> RangesMoved; + + /** Emitted when regions have moved (not when regions have only been trimmed) */ + PBD::Signal2 > const &, bool> RangesMoved; + + /** Emitted when regions are extended; the ranges passed are the new extra time ranges + that these regions now occupy. + */ + PBD::Signal1 > const &> RegionsExtended; static std::string bump_name (std::string old_name, Session&); void freeze (); - void thaw (); + void thaw (bool from_undo = false); void raise_region (boost::shared_ptr); void lower_region (boost::shared_ptr); void raise_region_to_top (boost::shared_ptr); void lower_region_to_bottom (boost::shared_ptr); - uint32_t read_data_count() const { return _read_data_count; } - /* XXX: use of diskstream here is a little unfortunate */ const PBD::ID& get_orig_diskstream_id () const { return _orig_diskstream_id; } void set_orig_diskstream_id (const PBD::ID& did) { _orig_diskstream_id = did; } @@ -203,6 +209,8 @@ class Playlist : public SessionObject virtual bool destroy_region (boost::shared_ptr) = 0; + void sync_all_regions_with_regions (); + /* special case function used by UI selection objects, which have playlists that actually own the regions within them. */ @@ -215,6 +223,13 @@ class Playlist : public SessionObject void set_explicit_relayering (bool e); + virtual boost::shared_ptr find_crossfade (const PBD::ID &) const { + return boost::shared_ptr (); + } + + framepos_t find_next_top_layer_position (framepos_t) const; + uint32_t combine_ops() const { return _combine_ops; } + protected: friend class Session; @@ -238,11 +253,11 @@ class Playlist : public SessionObject friend class RegionLock; - RegionListProperty regions; /* the current list of regions in the playlist */ + RegionListProperty regions; /* the current list of regions in the playlist */ std::set > all_regions; /* all regions ever added to this playlist */ PBD::ScopedConnectionList region_state_changed_connections; DataType _type; - int _sort_id; + int _sort_id; mutable gint block_notifications; mutable gint ignore_state_changes; mutable Glib::RecMutex region_lock; @@ -252,7 +267,14 @@ class Playlist : public SessionObject bool pending_contents_change; bool pending_layering; bool pending_length; + + /** Movements of time ranges caused by region moves; note that + * region trims are not included in this list; it is used to + * do automation-follows-regions. + */ std::list< Evoral::RangeMove > pending_range_moves; + /** Extra sections added to regions during trims */ + std::list< Evoral::Range > pending_region_extensions; bool save_on_thaw; std::string last_save_reason; uint32_t in_set_state; @@ -268,11 +290,11 @@ class Playlist : public SessionObject bool in_partition; bool _frozen; uint32_t subcnt; - uint32_t _read_data_count; PBD::ID _orig_diskstream_id; uint64_t layer_op_counter; framecnt_t freeze_length; bool auto_partition; + uint32_t _combine_ops; /** true if relayering should be done using region's current layers and their `pending explicit relayer' * flags; otherwise false if relayering should be done using the layer-model (most recently moved etc.) @@ -288,11 +310,11 @@ class Playlist : public SessionObject } void delay_notifications (); - void release_notifications (); - virtual void flush_notifications (); + void release_notifications (bool from_undo = false); + virtual void flush_notifications (bool from_undo = false); void clear_pending (); - void _set_sort_id (); + void _set_sort_id (); void notify_region_removed (boost::shared_ptr); void notify_region_added (boost::shared_ptr); @@ -301,6 +323,8 @@ class Playlist : public SessionObject void notify_contents_changed (); void notify_state_changed (const PBD::PropertyChange&); void notify_region_moved (boost::shared_ptr); + void notify_region_start_trimmed (boost::shared_ptr); + void notify_region_end_trimmed (boost::shared_ptr); void mark_session_dirty(); @@ -330,11 +354,11 @@ class Playlist : public SessionObject bool add_region_internal (boost::shared_ptr, framepos_t position); int remove_region_internal (boost::shared_ptr); - RegionList *find_regions_at (framepos_t frame); + RegionList *find_regions_at (framepos_t); void copy_regions (RegionList&) const; void partition_internal (framepos_t start, framepos_t end, bool cutting, RegionList& thawlist); - std::pair _get_extent() const; + std::pair _get_extent() const; boost::shared_ptr cut_copy (boost::shared_ptr (Playlist::*pmf)(framepos_t, framecnt_t, bool), std::list& ranges, bool result_is_hidden); @@ -352,6 +376,25 @@ class Playlist : public SessionObject void timestamp_layer_op (boost::shared_ptr); void _split_region (boost::shared_ptr, framepos_t position); + + typedef std::pair, boost::shared_ptr > TwoRegions; + virtual void copy_dependents (const std::vector&, Playlist*) const { } + + struct RegionInfo { + boost::shared_ptr region; + framepos_t position; + framecnt_t length; + framepos_t start; + }; + + /* this is called before we create a new compound region */ + virtual void pre_combine (std::vector >&) {} + /* this is called before we create a new compound region */ + virtual void post_combine (std::vector >&, boost::shared_ptr) {} + /* this is called before we remove a compound region and replace it + with its constituent regions + */ + virtual void pre_uncombine (std::vector >&, boost::shared_ptr) {} }; } /* namespace ARDOUR */