X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fsource.h;h=78b3cfaa2110f369f80fc2b336fe996e55f7e30a;hb=2e27e21d3a09889311e18a8efe11abcaa6d9c8b3;hp=3781950fbf979a2a5422df049c43f5f1f5d6f9f1;hpb=9fdc36bac5fa1c004751c0dd42f9ff62b9d60814;p=ardour.git diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h index 3781950fbf..78b3cfaa21 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 @@ -15,172 +15,112 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __ardour_source_h__ #define __ardour_source_h__ -#include -#include #include +#include -#include +#include -#include +#include +#include "pbd/statefuldestructible.h" -#include - -#include -#include -#include - -using std::list; -using std::vector; -using std::string; +#include "ardour/ardour.h" +#include "ardour/session_object.h" +#include "ardour/data_type.h" namespace ARDOUR { -struct PeakData { - typedef Sample PeakDatum; - - PeakDatum min; - PeakDatum max; -}; - -const jack_nframes_t frames_per_peak = 256; +class Session; -class Source : public Stateful, public sigc::trackable +class LIBARDOUR_API Source : public SessionObject { public: - Source (bool announce=true); - Source (const XMLNode&); - virtual ~Source (); - - const string& name() const { return _name; } + enum Flag { + Writable = 0x1, + CanRename = 0x2, + Broadcast = 0x4, + Removable = 0x8, + RemovableIfEmpty = 0x10, + RemoveAtDestroy = 0x20, + NoPeakFile = 0x40, + Destructive = 0x80 + }; - ARDOUR::id_t id() const { return _id; } + Source (Session&, DataType type, const std::string& name, Flag flags=Flag(0)); + Source (Session&, const XMLNode&); - /* returns the number of items in this `source' */ + virtual ~Source (); - virtual jack_nframes_t length() const { - return _length; - } + DataType type() { return _type; } - virtual jack_nframes_t available_peaks (double zoom) const; + time_t timestamp() const { return _timestamp; } + void stamp (time_t when) { _timestamp = when; } - virtual jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const { - return 0; - } + virtual bool empty () const = 0; + virtual framecnt_t length (framepos_t pos) const = 0; + virtual void update_length (framecnt_t cnt) = 0; - virtual jack_nframes_t write (Sample *src, jack_nframes_t cnt, char * workbuf) { - return 0; - } + virtual framepos_t natural_position() const { return 0; } - virtual float sample_rate () const { return 0; } + void mark_for_remove(); - uint32_t use_cnt() const { return _use_cnt; } - void use (); - void release (); + virtual void mark_streaming_write_started () {} + virtual void mark_streaming_write_completed () = 0; - virtual void mark_for_remove() = 0; - virtual void mark_streaming_write_completed () {} + virtual void session_saved() {} - time_t timestamp() const { return _timestamp; } - void stamp (time_t when) { _timestamp = when; } + XMLNode& get_state (); + int set_state (const XMLNode&, int version); - void set_captured_for (string str) { _captured_for = str; } - string captured_for() const { return _captured_for; } + bool destructive() const { return (_flags & Destructive); } + bool writable () const; + virtual bool set_destructive (bool /*yn*/) { return false; } + virtual bool length_mutable() const { return false; } - uint32_t read_data_count() const { return _read_data_count; } - uint32_t write_data_count() const { return _write_data_count; } + static PBD::Signal1 SourceCreated; - int read_peaks (PeakData *peaks, jack_nframes_t npeaks, jack_nframes_t start, jack_nframes_t cnt, double samples_per_unit) const; - int build_peaks (); - bool peaks_ready (sigc::slot, sigc::connection&) const; + bool has_been_analysed() const; + virtual bool can_be_analysed() const { return false; } + virtual void set_been_analysed (bool yn); + virtual bool check_for_analysis_data_on_disk(); - static sigc::signal SourceCreated; - - sigc::signal GoingAway; - mutable sigc::signal PeaksReady; - mutable sigc::signal PeakRangeReady; - - XMLNode& get_state (); - int set_state (const XMLNode&); + PBD::Signal0 AnalysisChanged; - static int start_peak_thread (); - static void stop_peak_thread (); + AnalysisFeatureList transients; + std::string get_transients_path() const; + int load_transients (const std::string&); - int rename_peakfile (std::string newpath); + framepos_t timeline_position() const { return _timeline_position; } + virtual void set_timeline_position (framepos_t pos); - static void set_build_missing_peakfiles (bool yn) { - _build_missing_peakfiles = yn; - } - static void set_build_peakfiles (bool yn) { - _build_peakfiles = yn; - } + void set_allow_remove_if_empty (bool yn); - protected: - static bool _build_missing_peakfiles; - static bool _build_peakfiles; - - string _name; - uint32_t _use_cnt; - bool _peaks_built; - mutable Glib::Mutex _lock; - jack_nframes_t _length; - bool next_peak_clear_should_notify; - string peakpath; - time_t _timestamp; - string _captured_for; - - mutable uint32_t _read_data_count; // modified in read() - mutable uint32_t _write_data_count; // modified in write() - - int initialize_peakfile (bool newfile, string path); - void build_peaks_from_scratch (); - - int do_build_peak (jack_nframes_t, jack_nframes_t); - virtual jack_nframes_t read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const = 0; - virtual string peak_path(string audio_path) = 0; - - static pthread_t peak_thread; - static bool have_peak_thread; - static void* peak_thread_work(void*); - - static int peak_request_pipe[2]; - - struct PeakRequest { - enum Type { - Build, - Quit - }; - }; + Glib::Threads::Mutex& mutex() { return _lock; } + Flag flags() const { return _flags; } - static vector pending_peak_sources; - static Glib::StaticMutex pending_peak_sources_lock; - - static void queue_for_peaks (Source&); - static void clear_queue_for_peaks (); - - struct PeakBuildRecord { - jack_nframes_t frame; - jack_nframes_t cnt; - - PeakBuildRecord (jack_nframes_t f, jack_nframes_t c) - : frame (f), cnt (c) {} - PeakBuildRecord (const PeakBuildRecord& other) { - frame = other.frame; - cnt = other.cnt; - } - }; + virtual void inc_use_count (); + virtual void dec_use_count (); + int use_count() const { return g_atomic_int_get (const_cast(&_use_count)); } + bool used() const { return use_count() > 0; } + uint32_t level() const { return _level; } - list pending_peak_builds; + protected: + DataType _type; + Flag _flags; + time_t _timestamp; + framepos_t _timeline_position; + bool _analysed; + mutable Glib::Threads::Mutex _lock; + mutable Glib::Threads::Mutex _analysis_lock; + gint _use_count; /* atomic */ + uint32_t _level; /* how deeply nested is this source w.r.t a disk file */ private: - ARDOUR::id_t _id; - - bool file_changed (string path); + void fix_writable_flags (); }; }