X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fplaylist.h;h=a8fabd7e65e9121f2f84c8ddf6328359c419842b;hb=8a4518d76fe78e5fb99900ff5ff71a22e5912395;hp=ababa600631d19f14e324b1e892d5dd8acb4ffa1;hpb=e5e12acc5698090f2c0c614385e457cc0b46fbb0;p=ardour.git diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index ababa60063..a8fabd7e65 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -38,7 +38,7 @@ #include "pbd/sequence_property.h" #include "pbd/stacktrace.h" -#include "evoral/types.hpp" +#include "evoral/Range.hpp" #include "ardour/ardour.h" #include "ardour/region.h" @@ -86,7 +86,7 @@ public: Playlist (Session&, const XMLNode&, DataType type, bool hidden = false); Playlist (Session&, std::string name, DataType type, bool hidden = false); Playlist (boost::shared_ptr, std::string name, bool hidden = false); - Playlist (boost::shared_ptr, framepos_t start, framecnt_t cnt, std::string name, bool hidden = false); + Playlist (boost::shared_ptr, samplepos_t start, samplecnt_t cnt, std::string name, bool hidden = false); virtual ~Playlist (); @@ -115,11 +115,24 @@ public: bool frozen() const { return _frozen; } void set_frozen (bool yn); + void AddToSoloSelectedList(const Region*); + void RemoveFromSoloSelectedList(const Region*); + bool SoloSelectedListIncludes(const Region*); + bool SoloSelectedActive(); + bool hidden() const { return _hidden; } bool empty() const; + + bool shared () const { return !_shared_with_ids.empty(); } + void share_with (const PBD::ID&); + void unshare_with (const PBD::ID&); + bool shared_with (const PBD::ID&) const; + void reset_shares (); + uint32_t n_regions() const; bool all_regions_empty() const; - std::pair get_extent () const; + std::pair get_extent () const; + std::pair get_extent_with_endspace() const; layer_t top_layer() const; EditMode get_edit_mode() const { return _edit_mode; } @@ -127,25 +140,29 @@ public: /* Editing operations */ - void add_region (boost::shared_ptr, framepos_t position, float times = 1, bool auto_partition = false); + void add_region (boost::shared_ptr, samplepos_t position, float times = 1, bool auto_partition = false, int32_t sub_num = 0, double quarter_note = 0.0, bool for_music = 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 get_source_equivalent_regions (boost::shared_ptr, std::vector >&); - void replace_region (boost::shared_ptr old, boost::shared_ptr newr, framepos_t pos); - void split_region (boost::shared_ptr, framepos_t position); - void split (framepos_t at); - void shift (framepos_t at, frameoffset_t distance, bool move_intersected, bool ignore_music_glue); - 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); + void replace_region (boost::shared_ptr old, boost::shared_ptr newr, samplepos_t pos); + void split_region (boost::shared_ptr, const MusicSample& position); + void split (const MusicSample& at); + void shift (samplepos_t at, sampleoffset_t distance, bool move_intersected, bool ignore_music_glue); + void partition (samplepos_t start, samplepos_t end, bool cut = false); + void duplicate (boost::shared_ptr, samplepos_t position, float times); + void duplicate (boost::shared_ptr, samplepos_t position, samplecnt_t gap, float times); + void duplicate_until (boost::shared_ptr, samplepos_t position, samplecnt_t gap, samplepos_t end); + void duplicate_range (AudioRange&, float times); + void duplicate_ranges (std::list&, float times); + void nudge_after (samplepos_t start, samplecnt_t distance, bool forwards); boost::shared_ptr combine (const RegionList&); void uncombine (boost::shared_ptr); + void fade_range (std::list&); void shuffle (boost::shared_ptr, int dir); - void ripple (framepos_t at, framecnt_t distance, RegionList *exclude); - void ripple (framepos_t at, framecnt_t distance, boost::shared_ptr exclude) { + void ripple (samplepos_t at, samplecnt_t distance, RegionList *exclude); + void ripple (samplepos_t at, samplecnt_t distance, boost::shared_ptr exclude) { RegionList el; if (exclude) el.push_back (exclude); @@ -156,27 +173,29 @@ public: boost::shared_ptr cut (std::list&, bool result_is_hidden = true); boost::shared_ptr copy (std::list&, bool result_is_hidden = true); - int paste (boost::shared_ptr, framepos_t position, float times); + int paste (boost::shared_ptr, samplepos_t position, float times, const int32_t sub_num); - const RegionListProperty& region_list () const { return regions; } + const RegionListProperty& region_list_property () const { return regions; } + boost::shared_ptr region_list(); - boost::shared_ptr regions_at (framepos_t frame); - uint32_t count_regions_at (framepos_t) const; - boost::shared_ptr regions_touched (framepos_t start, framepos_t end); - boost::shared_ptr regions_with_start_within (Evoral::Range); - boost::shared_ptr regions_with_end_within (Evoral::Range); + boost::shared_ptr regions_at (samplepos_t sample); + uint32_t count_regions_at (samplepos_t) const; + boost::shared_ptr regions_touched (samplepos_t start, samplepos_t end); + boost::shared_ptr regions_with_start_within (Evoral::Range); + boost::shared_ptr regions_with_end_within (Evoral::Range); 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); - boost::shared_ptr find_next_region (framepos_t frame, RegionPoint point, int dir); - framepos_t find_next_region_boundary (framepos_t frame, int dir); + boost::shared_ptr top_region_at (samplepos_t sample); + boost::shared_ptr top_unmuted_region_at (samplepos_t sample); + boost::shared_ptr find_next_region (samplepos_t sample, RegionPoint point, int dir); + samplepos_t find_next_region_boundary (samplepos_t sample, int dir); bool region_is_shuffle_constrained (boost::shared_ptr); - bool has_region_at (framepos_t const) const; + bool has_region_at (samplepos_t const) const; - bool uses_source (boost::shared_ptr src) const; + bool uses_source (boost::shared_ptr src, bool shallow = false) const; + void deep_sources (std::set >&) const; - framepos_t find_next_transient (framepos_t position, int dir); + samplepos_t find_next_transient (samplepos_t position, int dir); void foreach_region (boost::function)>); @@ -192,12 +211,12 @@ public: PBD::Signal0 LayeringChanged; /** Emitted when regions have moved (not when regions have only been trimmed) */ - PBD::Signal2 > const &, bool> RangesMoved; + 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; + PBD::Signal1 > const &> RegionsExtended; static std::string bump_name (std::string old_name, Session&); @@ -228,13 +247,13 @@ public: return boost::shared_ptr (); } - framepos_t find_next_top_layer_position (framepos_t) const; + samplepos_t find_next_top_layer_position (samplepos_t) const; uint32_t combine_ops() const { return _combine_ops; } void set_layer (boost::shared_ptr, double); void set_capture_insertion_in_progress (bool yn); - + protected: friend class Session; @@ -247,7 +266,7 @@ public: class RegionWriteLock : public Glib::Threads::RWLock::WriterLock { public: - RegionWriteLock (Playlist *pl, bool do_block_notify = true) + RegionWriteLock (Playlist *pl, bool do_block_notify = true) : Glib::Threads::RWLock::WriterLock (pl->region_lock) , playlist (pl) , block_notify (do_block_notify) { @@ -269,8 +288,9 @@ public: 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; + PBD::ScopedConnectionList region_drop_references_connections; DataType _type; - int _sort_id; + uint32_t _sort_id; mutable gint block_notifications; mutable gint ignore_state_changes; std::set > pending_adds; @@ -279,13 +299,15 @@ public: bool pending_contents_change; bool pending_layering; + std::set _soloSelectedRegions; + /** 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; + std::list< Evoral::RangeMove > pending_range_moves; /** Extra sections added to regions during trims */ - std::list< Evoral::Range > pending_region_extensions; + std::list< Evoral::Range > pending_region_extensions; uint32_t in_set_state; bool in_undo; bool first_set_state; @@ -303,6 +325,7 @@ public: uint32_t subcnt; PBD::ID _orig_track_id; uint32_t _combine_ops; + std::list _shared_with_ids; void init (bool hide); @@ -318,7 +341,7 @@ public: void _set_sort_id (); - boost::shared_ptr regions_touched_locked (framepos_t start, framepos_t end); + boost::shared_ptr regions_touched_locked (samplepos_t start, samplepos_t end); void notify_region_removed (boost::shared_ptr); void notify_region_added (boost::shared_ptr); @@ -339,41 +362,42 @@ public: void sort_regions (); - void possibly_splice (framepos_t at, framecnt_t distance, boost::shared_ptr exclude = boost::shared_ptr()); - void possibly_splice_unlocked(framepos_t at, framecnt_t distance, boost::shared_ptr exclude = boost::shared_ptr()); + void possibly_splice (samplepos_t at, samplecnt_t distance, boost::shared_ptr exclude = boost::shared_ptr()); + void possibly_splice_unlocked(samplepos_t at, samplecnt_t distance, boost::shared_ptr exclude = boost::shared_ptr()); - void core_splice (framepos_t at, framecnt_t distance, boost::shared_ptr exclude); - void splice_locked (framepos_t at, framecnt_t distance, boost::shared_ptr exclude); - void splice_unlocked (framepos_t at, framecnt_t distance, boost::shared_ptr exclude); + void core_splice (samplepos_t at, samplecnt_t distance, boost::shared_ptr exclude); + void splice_locked (samplepos_t at, samplecnt_t distance, boost::shared_ptr exclude); + void splice_unlocked (samplepos_t at, samplecnt_t distance, boost::shared_ptr exclude); - void core_ripple (framepos_t at, framecnt_t distance, RegionList *exclude); - void ripple_locked (framepos_t at, framecnt_t distance, RegionList *exclude); - void ripple_unlocked (framepos_t at, framecnt_t distance, RegionList *exclude); + void core_ripple (samplepos_t at, samplecnt_t distance, RegionList *exclude); + void ripple_locked (samplepos_t at, samplecnt_t distance, RegionList *exclude); + void ripple_unlocked (samplepos_t at, samplecnt_t distance, RegionList *exclude); virtual void remove_dependents (boost::shared_ptr /*region*/) {} + virtual void region_going_away (boost::weak_ptr /*region*/) {} virtual XMLNode& state (bool); - bool add_region_internal (boost::shared_ptr, framepos_t position); + bool add_region_internal (boost::shared_ptr, samplepos_t position, int32_t sub_num = 0, double quarter_note = 0.0, bool for_music = false); int remove_region_internal (boost::shared_ptr); void copy_regions (RegionList&) const; - void partition_internal (framepos_t start, framepos_t end, bool cutting, RegionList& thawlist); + void partition_internal (samplepos_t start, samplepos_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), + boost::shared_ptr cut_copy (boost::shared_ptr (Playlist::*pmf)(samplepos_t, samplecnt_t, bool), std::list& ranges, bool result_is_hidden); - boost::shared_ptr cut (framepos_t start, framecnt_t cnt, bool result_is_hidden); - boost::shared_ptr copy (framepos_t start, framecnt_t cnt, bool result_is_hidden); + boost::shared_ptr cut (samplepos_t start, samplecnt_t cnt, bool result_is_hidden); + boost::shared_ptr copy (samplepos_t start, samplecnt_t cnt, bool result_is_hidden); void relayer (); void begin_undo (); void end_undo (); - void _split_region (boost::shared_ptr, framepos_t position); + virtual void _split_region (boost::shared_ptr, const MusicSample& position); typedef std::pair, boost::shared_ptr > TwoRegions; @@ -393,8 +417,10 @@ public: private: void setup_layering_indices (RegionList const &); - void coalesce_and_check_crossfades (std::list >); - boost::shared_ptr find_regions_at (framepos_t); + void coalesce_and_check_crossfades (std::list >); + boost::shared_ptr find_regions_at (samplepos_t); + + samplepos_t _end_space; //this is used when we are pasting a range with extra space at the end }; } /* namespace ARDOUR */