summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-03-21 02:39:12 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-03-21 02:39:12 +0000
commit767984b486086e3682e521179c2fb8364b3bba76 (patch)
tree3a03250848c776c0edf0de4df4a3d89397711c21 /libs
parent6525aaeb70ed7dcaf068e641dc04b4f7c5ba61e4 (diff)
probably fix cleanup issues, but testing required
git-svn-id: svn://localhost/ardour2/trunk@1632 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/playlist.h6
-rw-r--r--libs/ardour/ardour/source.h4
-rw-r--r--libs/ardour/audioregion.cc5
-rw-r--r--libs/ardour/playlist.cc13
-rw-r--r--libs/ardour/source.cc21
5 files changed, 42 insertions, 7 deletions
diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h
index 6e36d3120b..103e95929e 100644
--- a/libs/ardour/ardour/playlist.h
+++ b/libs/ardour/ardour/playlist.h
@@ -138,6 +138,12 @@ class Playlist : public PBD::StatefulDestructible, public boost::enable_shared_f
virtual bool destroy_region (boost::shared_ptr<Region>) = 0;
+ /* special case function used by UI selection objects, which have playlists that actually own the regions
+ within them.
+ */
+
+ void drop_regions ();
+
protected:
friend class Session;
diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h
index ae63b8c5fb..7ffa616a40 100644
--- a/libs/ardour/ardour/source.h
+++ b/libs/ardour/ardour/source.h
@@ -63,7 +63,9 @@ class Source : public PBD::StatefulDestructible
string _name;
time_t _timestamp;
- std::set<boost::shared_ptr<ARDOUR::Playlist> > _playlists;
+ Glib::Mutex playlist_lock;
+ typedef std::map<boost::shared_ptr<ARDOUR::Playlist>, uint32_t > PlaylistMap;
+ PlaylistMap _playlists;
private:
uint32_t _in_use;
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index 24249a6364..db6e5fc089 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -1057,7 +1057,6 @@ AudioRegion::separate_by_channel (Session& session, vector<boost::shared_ptr<Aud
boost::shared_ptr<Region> r = RegionFactory::create (srcs, _start, _length, new_name, _layer, f);
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
- cerr << "new region name is " << ar->name() << endl;
v.push_back (ar);
@@ -1281,7 +1280,6 @@ AudioRegion::normalize_to (float target_dB)
boost::shared_ptr<Playlist> pl (playlist());
if (pl) {
- cerr << "Send modified\n";
pl->Modified();
}
@@ -1368,6 +1366,7 @@ void
AudioRegion::set_playlist (boost::weak_ptr<Playlist> wpl)
{
boost::shared_ptr<Playlist> old_playlist = (_playlist.lock());
+
boost::shared_ptr<Playlist> pl (wpl.lock());
if (old_playlist == pl) {
@@ -1390,7 +1389,7 @@ AudioRegion::set_playlist (boost::weak_ptr<Playlist> wpl)
} else {
if (old_playlist) {
for (SourceList::const_iterator i = sources.begin(); i != sources.end(); ++i) {
- (*i)->remove_playlist (_playlist);
+ (*i)->remove_playlist (old_playlist);
}
}
}
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index 496be33950..ae9e23fcc9 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -574,6 +574,11 @@ Playlist::remove_region_internal (boost::shared_ptr<Region>region)
old_length = _get_maximum_extent();
}
+ if (!in_set_state) {
+ /* unset playlist */
+ region->set_playlist (boost::weak_ptr<Playlist>());
+ }
+
for (i = regions.begin(); i != regions.end(); ++i) {
if (*i == region) {
@@ -1175,6 +1180,14 @@ Playlist::region_changed (Change what_changed, boost::shared_ptr<Region> region)
}
void
+Playlist::drop_regions ()
+{
+ RegionLock rl (this);
+ regions.clear ();
+ all_regions.clear ();
+}
+
+void
Playlist::clear (bool with_signals)
{
{
diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc
index fe14fc72af..7f680e7100 100644
--- a/libs/ardour/source.cc
+++ b/libs/ardour/source.cc
@@ -111,7 +111,17 @@ Source::set_state (const XMLNode& node)
void
Source::add_playlist (boost::shared_ptr<Playlist> pl)
{
- _playlists.insert (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)));
}
@@ -124,10 +134,15 @@ Source::remove_playlist (boost::weak_ptr<Playlist> wpl)
return;
}
- std::set<boost::shared_ptr<Playlist> >::iterator x;
+ PlaylistMap::iterator x;
+ Glib::Mutex::Lock lm (playlist_lock);
if ((x = _playlists.find (pl)) != _playlists.end()) {
- _playlists.erase (x);
+ if (x->second > 1) {
+ x->second--;
+ } else {
+ _playlists.erase (x);
+ }
}
}