X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsource.cc;h=4c582f3ad741146d4af653e96ce5a5380dac5181;hb=204baa31d842d4c2f833d319b6fa55e402a1bfb8;hp=7ed4e584ce2606f33474daa5062be4bb48b998cf;hpb=79f91c7a205d981d2b8cc15e32a6da02d8423065;p=ardour.git diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index 7ed4e584ce..4c582f3ad7 100644 --- a/libs/ardour/source.cc +++ b/libs/ardour/source.cc @@ -36,7 +36,7 @@ #include "pbd/pthread_utils.h" #include "pbd/enumwriter.h" -#include "ardour/playlist.h" +#include "ardour/debug.h" #include "ardour/session.h" #include "ardour/source.h" #include "ardour/transient_detector.h" @@ -45,16 +45,18 @@ using namespace std; using namespace ARDOUR; +using namespace PBD; Source::Source (Session& s, DataType type, const string& name, Flag flags) : SessionObject(s, name) , _type(type) , _flags(flags) , _timeline_position(0) + , _use_count (0) + , _level (0) { _analysed = false; _timestamp = 0; - _in_use = 0; fix_writable_flags (); } @@ -63,12 +65,13 @@ Source::Source (Session& s, const XMLNode& node) , _type(DataType::AUDIO) , _flags (Flag (Writable|CanRename)) , _timeline_position(0) + , _use_count (0) + , _level (0) { _timestamp = 0; _analysed = false; - _in_use = 0; - if (set_state (node) || _type == DataType::NIL) { + if (set_state (node, Stateful::loading_state_version) || _type == DataType::NIL) { throw failed_constructor(); } @@ -77,10 +80,9 @@ Source::Source (Session& s, const XMLNode& node) Source::~Source () { - notify_callbacks (); + DEBUG_TRACE (DEBUG::Destruction, string_compose ("Source %1 destructor %2\n", _name, this)); } - void Source::fix_writable_flags () { @@ -98,7 +100,7 @@ Source::get_state () node->add_property ("name", name()); node->add_property ("type", _type.to_string()); node->add_property (X_("flags"), enum_2_string (_flags)); - _id.print (buf, sizeof (buf)); + id().print (buf, sizeof (buf)); node->add_property ("id", buf); if (_timestamp != 0) { @@ -120,9 +122,7 @@ Source::set_state (const XMLNode& node, int version) return -1; } - if ((prop = node.property ("id")) != 0) { - _id = prop->value (); - } else { + if (!set_id (node)) { return -1; } @@ -146,53 +146,17 @@ Source::set_state (const XMLNode& node, int version) _flags = Flag (_flags | Destructive); } - return 0; -} - -void -Source::add_playlist (boost::shared_ptr pl) -{ - std::pair res; - std::pair, uint32_t> newpair (pl, 1); - Glib::Mutex::Lock lm (_playlist_lock); - - res = _playlists.insert (newpair); - - if (!res.second) { - /* it already existed, bump count */ - res.first->second++; - } - - pl->GoingAway.connect (bind ( - mem_fun (*this, &Source::remove_playlist), - boost::weak_ptr (pl))); -} - -void -Source::remove_playlist (boost::weak_ptr wpl) -{ - boost::shared_ptr pl (wpl.lock()); - - if (!pl) { - return; - } - - PlaylistMap::iterator x; - Glib::Mutex::Lock lm (_playlist_lock); - - if ((x = _playlists.find (pl)) != _playlists.end()) { - if (x->second > 1) { - x->second--; - } else { - _playlists.erase (x); + if (version < 3000) { + /* a source with an XML node must necessarily already exist, + and therefore cannot be removable/writable etc. etc.; 2.X + sometimes marks sources as removable which shouldn't be. + */ + if (!(_flags & Destructive)) { + _flags = Flag (_flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy|CanRename)); } } -} -uint32_t -Source::used () const -{ - return _playlists.size(); + return 0; } bool @@ -234,7 +198,7 @@ Source::load_transients (const string& path) file >> val; if (!file.fail()) { - nframes64_t frame = (nframes64_t) floor (val * _session.frame_rate()); + framepos_t frame = (framepos_t) floor (val * _session.frame_rate()); transients.push_back (frame); } } @@ -255,7 +219,7 @@ Source::get_transients_path () const s = _session.analysis_dir (); parts.push_back (s); - s = _id.to_s(); + s = id().to_s(); s += '.'; s += TransientDetector::operational_identifier(); parts.push_back (s); @@ -286,10 +250,12 @@ Source::check_for_analysis_data_on_disk () void Source::mark_for_remove () { - // This operation is not allowed for sources for destructive tracks or embedded files. - // Fortunately mark_for_remove() is never called for embedded files. This function - // must be fixed if that ever happens. - if (_flags & Destructive) { + // This operation is not allowed for sources for destructive tracks or out-of-session files. + + /* XXX need a way to detect _within_session() condition here - move it from FileSource? + */ + + if ((_flags & Destructive)) { return; } @@ -316,3 +282,30 @@ Source::set_allow_remove_if_empty (bool yn) } } +void +Source::inc_use_count () +{ + g_atomic_int_inc (&_use_count); +} + +void +Source::dec_use_count () +{ +#ifndef NDEBUG + gint oldval = g_atomic_int_exchange_and_add (&_use_count, -1); + if (oldval <= 0) { + cerr << "Bad use dec for " << name() << endl; + abort (); + } + assert (oldval > 0); +#else + g_atomic_int_exchange_and_add (&_use_count, -1); +#endif +} + +bool +Source::writable () const +{ + return (_flags & Writable) && _session.writable(); +} +