#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"
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<framepos_t, framepos_t> get_extent () const;
+ std::pair<framepos_t, framepos_t> get_extent_with_endspace() const;
layer_t top_layer() const;
EditMode get_edit_mode() const { return _edit_mode; }
/* Editing operations */
- void add_region (boost::shared_ptr<Region>, framepos_t position, float times = 1, bool auto_partition = false);
+ void add_region (boost::shared_ptr<Region>, framepos_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<Region>);
- void remove_region_by_source (boost::shared_ptr<Source>);
void get_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
void get_region_list_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
void get_source_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
void replace_region (boost::shared_ptr<Region> old, boost::shared_ptr<Region> newr, framepos_t pos);
- void split_region (boost::shared_ptr<Region>, framepos_t position);
- void split (framepos_t at);
+ void split_region (boost::shared_ptr<Region>, const MusicFrame& position);
+ void split (const MusicFrame& 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<Region>, framepos_t position, float times);
+ void duplicate (boost::shared_ptr<Region>, framepos_t position, framecnt_t gap, float times);
+ void duplicate_until (boost::shared_ptr<Region>, framepos_t position, framecnt_t gap, framepos_t end);
+ void duplicate_range (AudioRange&, float times);
+ void duplicate_ranges (std::list<AudioRange>&, float times);
void nudge_after (framepos_t start, framecnt_t distance, bool forwards);
boost::shared_ptr<Region> combine (const RegionList&);
void uncombine (boost::shared_ptr<Region>);
boost::shared_ptr<Playlist> cut (std::list<AudioRange>&, bool result_is_hidden = true);
boost::shared_ptr<Playlist> copy (std::list<AudioRange>&, bool result_is_hidden = true);
- int paste (boost::shared_ptr<Playlist>, framepos_t position, float times);
+ int paste (boost::shared_ptr<Playlist>, framepos_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<RegionList> region_list();
boost::shared_ptr<RegionList> regions_at (framepos_t frame);
uint32_t count_regions_at (framepos_t) const;
bool region_is_shuffle_constrained (boost::shared_ptr<Region>);
bool has_region_at (framepos_t const) const;
- bool uses_source (boost::shared_ptr<const Source> src) const;
+ bool uses_source (boost::shared_ptr<const Source> src, bool shallow = false) const;
+ void deep_sources (std::set<boost::shared_ptr<Source> >&) const;
framepos_t find_next_transient (framepos_t position, int dir);
void set_layer (boost::shared_ptr<Region>, double);
void set_capture_insertion_in_progress (bool yn);
-
+
protected:
friend class Session;
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) {
RegionListProperty regions; /* the current list of regions in the playlist */
std::set<boost::shared_ptr<Region> > 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<boost::shared_ptr<Region> > pending_adds;
uint32_t subcnt;
PBD::ID _orig_track_id;
uint32_t _combine_ops;
+ std::list<PBD::ID> _shared_with_ids;
void init (bool hide);
virtual void remove_dependents (boost::shared_ptr<Region> /*region*/) {}
+ virtual void region_going_away (boost::weak_ptr<Region> /*region*/) {}
virtual XMLNode& state (bool);
- bool add_region_internal (boost::shared_ptr<Region>, framepos_t position);
+ bool add_region_internal (boost::shared_ptr<Region>, framepos_t position, int32_t sub_num = 0, double quarter_note = 0.0, bool for_music = false);
int remove_region_internal (boost::shared_ptr<Region>);
void copy_regions (RegionList&) const;
void begin_undo ();
void end_undo ();
- void _split_region (boost::shared_ptr<Region>, framepos_t position);
+ virtual void _split_region (boost::shared_ptr<Region>, const MusicFrame& position);
typedef std::pair<boost::shared_ptr<Region>, boost::shared_ptr<Region> > TwoRegions;
void setup_layering_indices (RegionList const &);
void coalesce_and_check_crossfades (std::list<Evoral::Range<framepos_t> >);
boost::shared_ptr<RegionList> find_regions_at (framepos_t);
+
+ framepos_t _end_space; //this is used when we are pasting a range with extra space at the end
};
} /* namespace ARDOUR */