X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fsource.h;h=bf92e5a6e47bc2855e7d71137438068b957699a6;hb=2b9dc7b380bb4e40171067f42b4010970869a57d;hp=3109cb00ff1772d366b172603901552af00c9e2d;hpb=80c3677c837cc9eb432df3d65a34aba543fa7258;p=ardour.git diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h index 3109cb00ff..bf92e5a6e4 100644 --- a/libs/ardour/ardour/source.h +++ b/libs/ardour/ardour/source.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2000 Paul Davis + Copyright (C) 2000 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,87 +23,97 @@ #include #include -#include +#include +#include "pbd/statefuldestructible.h" -#include - -#include -#include -#include -#include +#include "ardour/ardour.h" +#include "ardour/session_object.h" +#include "ardour/data_type.h" namespace ARDOUR { class Session; -class Playlist; -class Source : public SessionObject, public ARDOUR::Readable +class Source : public SessionObject { public: - Source (Session&, const std::string& name, DataType type); + enum Flag { + Writable = 0x1, + CanRename = 0x2, + Broadcast = 0x4, + Removable = 0x8, + RemovableIfEmpty = 0x10, + RemoveAtDestroy = 0x20, + NoPeakFile = 0x40, + Destructive = 0x80 + }; + + Source (Session&, DataType type, const std::string& name, Flag flags=Flag(0)); Source (Session&, const XMLNode&); - + virtual ~Source (); - + DataType type() { return _type; } time_t timestamp() const { return _timestamp; } void stamp (time_t when) { _timestamp = when; } - - /** @return the number of items in this source */ - nframes_t length() const { return _length; } - virtual nframes_t natural_position() const { return 0; } + virtual framecnt_t length (framepos_t pos) const = 0; + virtual void update_length (framepos_t pos, framecnt_t cnt) = 0; + + virtual const Glib::ustring& path() const = 0; + + virtual framepos_t natural_position() const { return 0; } + + void mark_for_remove(); - virtual void mark_for_remove() = 0; virtual void mark_streaming_write_started () {} virtual void mark_streaming_write_completed () = 0; virtual void session_saved() {} - + XMLNode& get_state (); - int set_state (const XMLNode&); - - virtual bool destructive() const { return false; } - virtual bool length_mutable() const { return false; } - - void use () { _in_use++; } - void disuse () { if (_in_use) { _in_use--; } } - - void add_playlist (boost::shared_ptr); - void remove_playlist (boost::weak_ptr); - - uint32_t used() const; - - static sigc::signal SourceCreated; - sigc::signal > Switched; + int set_state (const XMLNode&, int version); + + bool destructive() const { return (_flags & Destructive); } + bool writable () const { return (_flags & Writable); } + virtual bool set_destructive (bool /*yn*/) { return false; } + virtual bool length_mutable() const { return false; } + + static PBD::Signal1 SourceCreated; + PBD::Signal1 > Switched; bool has_been_analysed() const; - virtual bool can_be_analysed() const { return false; } + virtual bool can_be_analysed() const { return false; } virtual void set_been_analysed (bool yn); virtual bool check_for_analysis_data_on_disk(); - sigc::signal AnalysisChanged; - + PBD::Signal0 AnalysisChanged; + AnalysisFeatureList transients; std::string get_transients_path() const; int load_transients (const std::string&); + sframes_t timeline_position() const { return _timeline_position; } + virtual void set_timeline_position (sframes_t pos); + + void set_allow_remove_if_empty (bool yn); + + Glib::Mutex& mutex() { return _lock; } + Flag flags() const { return _flags; } + protected: - void update_length (nframes_t pos, nframes_t cnt); - DataType _type; + Flag _flags; time_t _timestamp; - nframes_t _length; + sframes_t _timeline_position; bool _analysed; + mutable Glib::Mutex _lock; mutable Glib::Mutex _analysis_lock; Glib::Mutex _playlist_lock; - - typedef std::map, uint32_t > PlaylistMap; - PlaylistMap _playlists; private: - uint32_t _in_use; + void fix_writable_flags (); }; }