X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsource.cc;h=a11e82f1e81b245e912ca9f3e2a1439ee2fbd71c;hb=8ab17e96312f1a61c014c50687e15430d5ae786b;hp=e5aba19d2c32c86198a7de4190a160d44d152bf4;hpb=30c08ba655330232767554c48bda1975bfb5628c;p=ardour.git diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index e5aba19d2c..a11e82f1e8 100644 --- a/libs/ardour/source.cc +++ b/libs/ardour/source.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -34,6 +33,7 @@ #include #include +#include #include "i18n.h" @@ -42,25 +42,34 @@ using std::max; using namespace ARDOUR; -Source::Source (string name) +Source::Source (Session& s, const string& name, DataType type) + : SessionObject(s, name) + , _type(type) { - _name = name; - _use_cnt = 0; + // not true.. is this supposed to be an assertion? + //assert(_name.find("/") == string::npos); + _timestamp = 0; + _length = 0; + _in_use = 0; } -Source::Source (const XMLNode& node) +Source::Source (Session& s, const XMLNode& node) + : SessionObject(s, "unnamed source") + , _type(DataType::AUDIO) { - _use_cnt = 0; _timestamp = 0; + _length = 0; + _in_use = 0; - if (set_state (node)) { + if (set_state (node) || _type == DataType::NIL) { throw failed_constructor(); } } Source::~Source () { + notify_callbacks (); } XMLNode& @@ -70,7 +79,8 @@ Source::get_state () char buf[64]; node->add_property ("name", _name); - _id.print (buf); + node->add_property ("type", _type.to_string()); + _id.print (buf, sizeof (buf)); node->add_property ("id", buf); if (_timestamp != 0) { @@ -98,30 +108,68 @@ Source::set_state (const XMLNode& node) return -1; } + if ((prop = node.property ("type")) != 0) { + _type = DataType(prop->value()); + } + if ((prop = node.property ("timestamp")) != 0) { sscanf (prop->value().c_str(), "%ld", &_timestamp); } + + // Don't think this is valid, absolute paths fail + //assert(_name.find("/") == string::npos); return 0; } void -Source::use () +Source::update_length (nframes_t pos, nframes_t cnt) { - _use_cnt++; + if (pos + cnt > _length) { + _length = pos+cnt; + } } void -Source::release () +Source::add_playlist (boost::shared_ptr pl) { - if (_use_cnt) --_use_cnt; + 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::update_length (jack_nframes_t pos, jack_nframes_t cnt) +Source::remove_playlist (boost::weak_ptr wpl) { - if (pos + cnt > _length) { - _length = pos+cnt; + 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); + } } } +uint32_t +Source::used () const +{ + return _playlists.size(); +}