X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fregion.h;h=c3aac3dfa881959ad563911aaaa84c6525fc2594;hb=6698f5f686bef82b0c9568558c83a3b9b3344700;hp=3773a3b893fe21a52c03d2aa36a4cddebdb8dc7e;hpb=79fc27de2ef9db51a8c7c69764b663a9921c5a40;p=ardour.git diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index 3773a3b893..c3aac3dfa8 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -15,23 +15,26 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __ardour_region_h__ #define __ardour_region_h__ +#include +#include +#include + #include +#include #include -#include +#include class XMLNode; namespace ARDOUR { class Playlist; -class Source; enum RegionEditState { EditChangesNothing = 0, @@ -39,23 +42,11 @@ enum RegionEditState { EditChangesID = 2 }; -struct RegionState : public StateManager::State -{ - RegionState (std::string why) : StateManager::State (why) {} - - jack_nframes_t _start; - jack_nframes_t _length; - jack_nframes_t _position; - uint32_t _flags; - jack_nframes_t _sync_position; - layer_t _layer; - string _name; - mutable RegionEditState _first_edit; -}; - -class Region : public Stateful, public StateManager +class Region : public PBD::StatefulDestructible, public boost::enable_shared_from_this { public: + typedef std::vector > SourceList; + enum Flag { Muted = 0x1, Opaque = 0x2, @@ -75,6 +66,7 @@ class Region : public Stateful, public StateManager RightOfSplit = 0x8000, Hidden = 0x10000, DoNotSaveState = 0x20000, + PositionLocked = 0x40000, // range_guarantoor = USHRT_MAX }; @@ -89,168 +81,174 @@ class Region : public Stateful, public StateManager static Change LayerChanged; static Change HiddenChanged; - Region (jack_nframes_t start, jack_nframes_t length, - const string& name, layer_t = 0, Flag flags = DefaultFlags); - Region (const Region&, jack_nframes_t start, jack_nframes_t length, const string& name, layer_t = 0, Flag flags = DefaultFlags); - Region (const Region&); - Region (const XMLNode&); - virtual ~Region(); + sigc::signal StateChanged; - const PBD::ID& id() const { return _id; } + virtual ~Region(); /* Note: changing the name of a Region does not constitute an edit */ string name() const { return _name; } void set_name (string str); - jack_nframes_t position () const { return _position; } - jack_nframes_t start () const { return _start; } - jack_nframes_t length() const { return _length; } - layer_t layer () const { return _layer; } + const DataType& data_type() const { return _type; } + + nframes_t position () const { return _position; } + nframes_t start () const { return _start; } + nframes_t length() const { return _length; } + layer_t layer () const { return _layer; } - jack_nframes_t sync_offset(int& dir) const; - jack_nframes_t sync_position() const; + nframes_t sync_offset(int& dir) const; + nframes_t sync_position() const; - jack_nframes_t adjust_to_sync (jack_nframes_t); + nframes_t adjust_to_sync (nframes_t); /* first_frame() is an alias; last_frame() just hides some math */ - jack_nframes_t first_frame() const { return _position; } - jack_nframes_t last_frame() const { return _position + _length - 1; } + nframes_t first_frame() const { return _position; } + nframes_t last_frame() const { return _position + _length - 1; } + Flag flags() const { return _flags; } bool hidden() const { return _flags & Hidden; } bool muted() const { return _flags & Muted; } bool opaque () const { return _flags & Opaque; } bool locked() const { return _flags & Locked; } + bool position_locked() const { return _flags & PositionLocked; } bool automatic() const { return _flags & Automatic; } bool whole_file() const { return _flags & WholeFile ; } - Flag flags() const { return _flags; } + bool captured() const { return !(_flags & (Region::Flag (Region::Import|Region::External))); } + bool can_move() const { return !(_flags & (Locked|PositionLocked)); } virtual bool should_save_state () const { return !(_flags & DoNotSaveState); }; void freeze (); void thaw (const string& why); - bool covers (jack_nframes_t frame) const { - return _position <= frame && frame < _position + _length; + bool covers (nframes_t frame) const { + return first_frame() <= frame && frame < last_frame(); } - OverlapType coverage (jack_nframes_t start, jack_nframes_t end) const { - return ARDOUR::coverage (_position, _position + _length - 1, start, end); + OverlapType coverage (nframes_t start, nframes_t end) const { + return ARDOUR::coverage (first_frame(), last_frame(), start, end); } - bool equivalent (const Region&) const; - bool size_equivalent (const Region&) const; - bool overlap_equivalent (const Region&) const; - bool region_list_equivalent (const Region&) const; - virtual bool source_equivalent (const Region&) const = 0; + bool equivalent (boost::shared_ptr) const; + bool size_equivalent (boost::shared_ptr) const; + bool overlap_equivalent (boost::shared_ptr) const; + bool region_list_equivalent (boost::shared_ptr) const; + bool source_equivalent (boost::shared_ptr) const; - virtual bool speed_mismatch (float) const = 0; - /* EDITING OPERATIONS */ - void set_length (jack_nframes_t, void *src); - void set_start (jack_nframes_t, void *src); - void set_position (jack_nframes_t, void *src); - void set_position_on_top (jack_nframes_t, void *src); - void special_set_position (jack_nframes_t); + void set_length (nframes_t, void *src); + void set_start (nframes_t, void *src); + void set_position (nframes_t, void *src); + void set_position_on_top (nframes_t, void *src); + void special_set_position (nframes_t); void nudge_position (long, void *src); + bool at_natural_position () const; void move_to_natural_position (void *src); - void trim_start (jack_nframes_t new_position, void *src); - void trim_front (jack_nframes_t new_position, void *src); - void trim_end (jack_nframes_t new_position, void *src); - void trim_to (jack_nframes_t position, jack_nframes_t length, void *src); + void trim_start (nframes_t new_position, void *src); + void trim_front (nframes_t new_position, void *src); + void trim_end (nframes_t new_position, void *src); + void trim_to (nframes_t position, nframes_t length, void *src); void set_layer (layer_t l); /* ONLY Playlist can call this */ - void raise (); - void lower (); void raise_to_top (); void lower_to_bottom (); - void set_sync_position (jack_nframes_t n); + void set_sync_position (nframes_t n); void clear_sync_position (); void set_hidden (bool yn); void set_muted (bool yn); void set_opaque (bool yn); void set_locked (bool yn); + void set_position_locked (bool yn); virtual uint32_t read_data_count() const { return _read_data_count; } - ARDOUR::Playlist* playlist() const { return _playlist; } + boost::shared_ptr playlist() const { return _playlist.lock(); } + virtual void set_playlist (boost::weak_ptr); - virtual UndoAction get_memento() const = 0; - - void set_playlist (ARDOUR::Playlist*); + void source_deleted (boost::shared_ptr); + + boost::shared_ptr source (uint32_t n=0) const { return _sources[ (n < _sources.size()) ? n : 0 ]; } + uint32_t n_channels() const { return _sources.size(); } - virtual void lock_sources () {} - virtual void unlock_sources () {} + std::vector master_source_names(); + + const SourceList& sources() const { return _sources; } + const SourceList& master_sources() const { return _master_sources; } /* serialization */ XMLNode& get_state (); virtual XMLNode& state (bool); virtual int set_state (const XMLNode&); + virtual int set_live_state (const XMLNode&, Change&, bool send); - sigc::signal GoingAway; - - /* This is emitted only when a new id is assigned. Therefore, - in a pure Region copy, it will not be emitted. + virtual boost::shared_ptr get_parent() const; + + uint64_t last_layer_op() const { return _last_layer_op; } + void set_last_layer_op (uint64_t when); - It must be emitted by derived classes, not Region - itself, to permit dynamic_cast<> to be used to - infer the type of Region. - */ + virtual bool is_dependent() const { return false; } + virtual bool depends_on (boost::shared_ptr other) const { return false; } - static sigc::signal CheckNewRegion; + protected: + friend class RegionFactory; - virtual Region* get_parent() = 0; + Region (boost::shared_ptr src, nframes_t start, nframes_t length, + const string& name, DataType type, layer_t = 0, Flag flags = DefaultFlags); + Region (SourceList& srcs, nframes_t start, nframes_t length, + const string& name, DataType type, layer_t = 0, Flag flags = DefaultFlags); - uint64_t last_layer_op() const { return _last_layer_op; } - void set_last_layer_op (uint64_t when); + Region (boost::shared_ptr, nframes_t start, nframes_t length, const string& name, layer_t = 0, Flag flags = DefaultFlags); + Region (boost::shared_ptr); + Region (boost::shared_ptr src, const XMLNode&); + Region (SourceList& srcs, const XMLNode&); + + /* this one is for derived types of derived types */ + + Region (nframes_t start, nframes_t length, const string& name, DataType, layer_t = 0, Flag flags = DefaultFlags); protected: XMLNode& get_short_state (); /* used only by Session */ - /* state management */ - void send_change (Change); - /* derived classes need these during their own state management calls */ - - void store_state (RegionState&) const; - Change restore_and_return_flags (RegionState&); - - void trim_to_internal (jack_nframes_t position, jack_nframes_t length, void *src); + void trim_to_internal (nframes_t position, nframes_t length, void *src); bool copied() const { return _flags & Copied; } void maybe_uncopy (); void first_edit (); - virtual bool verify_start (jack_nframes_t) = 0; - virtual bool verify_start_and_length (jack_nframes_t, jack_nframes_t) = 0; - virtual bool verify_start_mutable (jack_nframes_t&_start) = 0; - virtual bool verify_length (jack_nframes_t) = 0; + virtual bool verify_start (nframes_t); + virtual bool verify_start_and_length (nframes_t, nframes_t); + virtual bool verify_start_mutable (nframes_t&_start); + virtual bool verify_length (nframes_t); virtual void recompute_at_start () = 0; virtual void recompute_at_end () = 0; - - - jack_nframes_t _start; - jack_nframes_t _length; - jack_nframes_t _position; - Flag _flags; - jack_nframes_t _sync_position; + + string _name; + DataType _type; + Flag _flags; + nframes_t _start; + nframes_t _length; + nframes_t _position; + nframes_t _sync_position; layer_t _layer; - string _name; mutable RegionEditState _first_edit; int _frozen; - Glib::Mutex lock; - PBD::ID _id; - ARDOUR::Playlist* _playlist; - mutable uint32_t _read_data_count; // modified in read() - Change pending_changed; - uint64_t _last_layer_op; // timestamp + mutable uint32_t _read_data_count; ///< modified in read() + Change _pending_changed; + uint64_t _last_layer_op; ///< timestamp + Glib::Mutex _lock; + boost::weak_ptr _playlist; + SourceList _sources; + /** Used when timefx are applied, so we can always use the original source */ + SourceList _master_sources; }; } /* namespace ARDOUR */