PluginInfo::type added to copy constructor. But why is the copy constructor defined...
[ardour.git] / libs / ardour / source.cc
index 7ade8a8573fdd7db1187520cd62cd6b3c0057dfc..16cc603089150c396434e1c2566419677ed1b932 100644 (file)
@@ -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 <sys/stat.h>
@@ -34,6 +33,7 @@
 #include <pbd/pthread_utils.h>
 
 #include <ardour/source.h>
+#include <ardour/playlist.h>
 
 #include "i18n.h"
 
@@ -46,13 +46,17 @@ Source::Source (Session& s, string name)
        : _session (s)
 {
        _name = name;
+       _analysed = false;
        _timestamp = 0;
+       _in_use = 0;
 }
 
 Source::Source (Session& s, const XMLNode& node) 
        : _session (s)
 {
        _timestamp = 0;
+       _analysed = false;
+       _in_use = 0;
 
        if (set_state (node)) {
                throw failed_constructor();
@@ -106,3 +110,67 @@ Source::set_state (const XMLNode& node)
        return 0;
 }
 
+void
+Source::add_playlist (boost::shared_ptr<Playlist> pl)
+{
+       std::pair<PlaylistMap::iterator,bool> res;
+       std::pair<boost::shared_ptr<Playlist>, 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<Playlist> (pl)));
+}
+
+void
+Source::remove_playlist (boost::weak_ptr<Playlist> wpl)
+{
+       boost::shared_ptr<Playlist> 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
+       }
+}
+