X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsource.cc;h=16cc603089150c396434e1c2566419677ed1b932;hb=5a3a2fad4fd1c217a5771caa64efe92a0b305275;hp=ad0d0f8a133a957d67d1c8e6ad20ea3bc9ca5b8e;hpb=6535cd1b1dbab7cc59a356c81d92dbc2cf25333b;p=ardour.git diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc index ad0d0f8a13..16cc603089 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,15 +42,21 @@ using std::max; using namespace ARDOUR; -Source::Source (string name) +Source::Source (Session& s, string name) + : _session (s) { _name = name; + _analysed = false; _timestamp = 0; + _in_use = 0; } -Source::Source (const XMLNode& node) +Source::Source (Session& s, const XMLNode& node) + : _session (s) { _timestamp = 0; + _analysed = false; + _in_use = 0; if (set_state (node)) { throw failed_constructor(); @@ -69,7 +75,7 @@ Source::get_state () char buf[64]; node->add_property ("name", _name); - _id.print (buf); + _id.print (buf, sizeof (buf)); node->add_property ("id", buf); if (_timestamp != 0) { @@ -104,3 +110,67 @@ Source::set_state (const XMLNode& node) 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); + } + } +} + +uint32_t +Source::used () const +{ + return _playlists.size(); +} + +bool +Source::has_been_analysed() const +{ + Glib::Mutex::Lock lm (_analysis_lock); + return _analysed; +} + +void +Source::set_been_analysed (bool yn) +{ + { + Glib::Mutex::Lock lm (_analysis_lock); + _analysed = yn; + } + + if (yn) { + AnalysisChanged(); // EMIT SIGNAL + } +} +