X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fplaylist.h;h=d2920fb6105e9c5059ec15171be69c2665944655;hb=022818b4a796f52c0a91eea42e65aec0bc7bed43;hp=9cc3f86f0b27afb98454322141fcacd11a98656f;hpb=fbb9576d4047c03276cc2e1b750465c3b0371c6c;p=ardour.git diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 9cc3f86f0b..d2920fb610 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __ardour_playlist_h__ @@ -26,6 +25,7 @@ #include #include #include +#include #include @@ -35,41 +35,51 @@ #include #include -#include +#include + +#include #include +#include #include #include +#include namespace ARDOUR { class Session; class Region; -class Playlist : public PBD::StatefulDestructible { +class Playlist : public SessionObject, public boost::enable_shared_from_this { public: typedef list > RegionList; - Playlist (Session&, const XMLNode&, bool hidden = false); - Playlist (Session&, string name, bool hidden = false); - Playlist (const Playlist&, string name, bool hidden = false); - Playlist (const Playlist&, nframes_t start, nframes_t cnt, string name, bool hidden = false); + Playlist (Session&, const XMLNode&, DataType type, bool hidden = false); + Playlist (Session&, string name, DataType type, bool hidden = false); + Playlist (boost::shared_ptr, string name, bool hidden = false); + Playlist (boost::shared_ptr, nframes_t start, nframes_t cnt, string name, bool hidden = false); + + virtual ~Playlist (); + + void set_region_ownership (); virtual void clear (bool with_signals=true); virtual void dump () const; - void ref(); - void unref(); - uint32_t refcnt() const { return _refcnt; } + void use(); + void release(); + bool used () const { return _refcnt != 0; } + + bool set_name (const string& str); - const string& name() const { return _name; } - void set_name (const string& str); + const DataType& data_type() const { return _type; } bool frozen() const { return _frozen; } void set_frozen (bool yn); bool hidden() const { return _hidden; } bool empty() const; + uint32_t n_regions() const; nframes_t get_maximum_extent () const; layer_t top_layer() const; @@ -84,23 +94,28 @@ class Playlist : public PBD::StatefulDestructible { void get_region_list_equivalent_regions (boost::shared_ptr, std::vector >&); void replace_region (boost::shared_ptr old, boost::shared_ptr newr, nframes_t pos); void split_region (boost::shared_ptr, nframes_t position); + void split (nframes64_t at); + void shift (nframes64_t at, nframes64_t distance, bool move_intersected, bool ignore_music_glue); void partition (nframes_t start, nframes_t end, bool just_top_level); void duplicate (boost::shared_ptr, nframes_t position, float times); void nudge_after (nframes_t start, nframes_t distance, bool forwards); + void shuffle (boost::shared_ptr, int dir); + void update_after_tempo_map_change (); - boost::shared_ptr find_region (const PBD::ID&) const; + boost::shared_ptr cut (list&, bool result_is_hidden = true); + boost::shared_ptr copy (list&, bool result_is_hidden = true); + int paste (boost::shared_ptr, nframes_t position, float times); - Playlist* cut (list&, bool result_is_hidden = true); - Playlist* copy (list&, bool result_is_hidden = true); - int paste (Playlist&, nframes_t position, float times); - - uint32_t read_data_count() { return _read_data_count; } - - RegionList* regions_at (nframes_t frame); - RegionList* regions_touched (nframes_t start, nframes_t end); + RegionList* regions_at (nframes_t frame); + RegionList* regions_touched (nframes_t start, nframes_t end); + RegionList* regions_to_read (nframes_t start, nframes_t end); + boost::shared_ptr find_region (const PBD::ID&) const; boost::shared_ptr top_region_at (nframes_t frame); + boost::shared_ptr find_next_region (nframes_t frame, RegionPoint point, int dir); + nframes64_t find_next_region_boundary (nframes64_t frame, int dir); + bool region_is_shuffle_constrained (boost::shared_ptr); - boost::shared_ptr find_next_region (nframes_t frame, RegionPoint point, int dir); + nframes64_t find_next_transient (nframes64_t position, int dir); template void foreach_region (T *t, void (T::*func)(boost::shared_ptr, void *), void *arg); template void foreach_region (T *t, void (T::*func)(boost::shared_ptr)); @@ -109,17 +124,13 @@ class Playlist : public PBD::StatefulDestructible { int set_state (const XMLNode&); XMLNode& get_template (); - sigc::signal InUse; - sigc::signal Modified; - sigc::signal NameChanged; - sigc::signal LengthChanged; - sigc::signal LayeringChanged; - sigc::signal StatePushed; - - static sigc::signal PlaylistCreated; + sigc::signal InUse; + sigc::signal Modified; + sigc::signal NameChanged; + sigc::signal LengthChanged; + sigc::signal > const &> RangesMoved; static string bump_name (string old_name, Session&); - static string bump_name_once (string old_name); void freeze (); void thaw (); @@ -131,8 +142,6 @@ class Playlist : public PBD::StatefulDestructible { uint32_t read_data_count() const { return _read_data_count; } - Session& session() { return _session; } - 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; } @@ -140,9 +149,14 @@ class Playlist : public PBD::StatefulDestructible { virtual bool destroy_region (boost::shared_ptr) = 0; + /* special case function used by UI selection objects, which have playlists that actually own the regions + within them. + */ + + void drop_regions (); + protected: friend class Session; - virtual ~Playlist (); /* members of the public use unref() */ protected: struct RegionLock { @@ -166,8 +180,8 @@ class Playlist : public PBD::StatefulDestructible { RegionList regions; /* the current list of regions in the playlist */ std::set > all_regions; /* all regions ever added to this playlist */ - string _name; - Session& _session; + std::list region_state_changed_connections; + DataType _type; mutable gint block_notifications; mutable gint ignore_state_changes; mutable Glib::Mutex region_lock; @@ -176,11 +190,14 @@ class Playlist : public PBD::StatefulDestructible { RegionList pending_bounds; bool pending_modified; bool pending_length; + list< Evoral::RangeMove > pending_range_moves; bool save_on_thaw; string last_save_reason; uint32_t in_set_state; + bool first_set_state; bool _hidden; bool _splicing; + bool _shuffling; bool _nudging; uint32_t _refcnt; EditMode _edit_mode; @@ -215,6 +232,7 @@ class Playlist : public PBD::StatefulDestructible { void notify_layering_changed (); void notify_modified (); void notify_state_changed (Change); + void notify_region_moved (boost::shared_ptr); void mark_session_dirty(); @@ -226,12 +244,12 @@ class Playlist : public PBD::StatefulDestructible { void sort_regions (); - void possibly_splice (); - void possibly_splice_unlocked(); - void core_splice (); - void splice_locked (); - void splice_unlocked (); + void possibly_splice (nframes_t at, nframes64_t distance, boost::shared_ptr exclude = boost::shared_ptr()); + void possibly_splice_unlocked(nframes_t at, nframes64_t distance, boost::shared_ptr exclude = boost::shared_ptr()); + void core_splice (nframes_t at, nframes64_t distance, boost::shared_ptr exclude); + void splice_locked (nframes_t at, nframes64_t distance, boost::shared_ptr exclude); + void splice_unlocked (nframes_t at, nframes64_t distance, boost::shared_ptr exclude); virtual void finalize_split_region (boost::shared_ptr original, boost::shared_ptr left, boost::shared_ptr right) {} @@ -243,31 +261,29 @@ class Playlist : public PBD::StatefulDestructible { boost::shared_ptr region_by_id (PBD::ID); - void add_region_internal (boost::shared_ptr, nframes_t position, bool delay_sort = false); - - int remove_region_internal (boost::shared_ptr, bool delay_sort = false); + bool add_region_internal (boost::shared_ptr, nframes_t position); + + int remove_region_internal (boost::shared_ptr); RegionList *find_regions_at (nframes_t frame); void copy_regions (RegionList&) const; void partition_internal (nframes_t start, nframes_t end, bool cutting, RegionList& thawlist); nframes_t _get_maximum_extent() const; - Playlist* cut_copy (Playlist* (Playlist::*pmf)(nframes_t, nframes_t, bool), - list& ranges, bool result_is_hidden); - Playlist *cut (nframes_t start, nframes_t cnt, bool result_is_hidden); - Playlist *copy (nframes_t start, nframes_t cnt, bool result_is_hidden); - + boost::shared_ptr cut_copy (boost::shared_ptr (Playlist::*pmf)(nframes_t, nframes_t, bool), + list& ranges, bool result_is_hidden); + boost::shared_ptr cut (nframes_t start, nframes_t cnt, bool result_is_hidden); + boost::shared_ptr copy (nframes_t start, nframes_t cnt, bool result_is_hidden); int move_region_to_layer (layer_t, boost::shared_ptr r, int dir); void relayer (); - - static Playlist* copyPlaylist (const Playlist&, nframes_t start, nframes_t length, - string name, bool result_is_hidden); void unset_freeze_parent (Playlist*); void unset_freeze_child (Playlist*); void timestamp_layer_op (boost::shared_ptr); + + void _split_region (boost::shared_ptr, nframes_t position); }; } /* namespace ARDOUR */