summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/region_factory.h2
-rw-r--r--libs/ardour/ardour/session.h4
-rw-r--r--libs/ardour/playlist.cc1
-rw-r--r--libs/ardour/region_factory.cc12
-rw-r--r--libs/ardour/session.cc11
-rw-r--r--libs/ardour/track.cc13
6 files changed, 42 insertions, 1 deletions
diff --git a/libs/ardour/ardour/region_factory.h b/libs/ardour/ardour/region_factory.h
index c661fed019..e0041a1072 100644
--- a/libs/ardour/ardour/region_factory.h
+++ b/libs/ardour/ardour/region_factory.h
@@ -86,6 +86,8 @@ public:
/** create a region with specified sources @param srcs and XML state */
static boost::shared_ptr<Region> create (SourceList& srcs, const XMLNode&);
+ static boost::shared_ptr<Region> get_whole_region_for_source (boost::shared_ptr<ARDOUR::Source>);
+
static void get_regions_using_source (boost::shared_ptr<Source>, std::set<boost::shared_ptr<Region> >& );
static void remove_regions_using_source (boost::shared_ptr<Source>);
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 0453994d33..dac08af29b 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -1767,7 +1767,9 @@ public:
f ( (*i).second );
}
}
-
+
+ bool playlist_is_active( boost::shared_ptr<Playlist>);
+
private:
void reset_write_sources (bool mark_write_complete, bool force = false);
SourceMap sources;
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index 0c1860f2cd..417dd3c408 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -601,6 +601,7 @@ Playlist::flush_notifications (bool from_undo)
crossfade_ranges.push_back ((*s)->range ());
remove_dependents (*s);
RegionRemoved (boost::weak_ptr<Region> (*s)); /* EMIT SIGNAL */
+ Region::RegionPropertyChanged(*s, Properties::hidden);
}
for (s = pending_adds.begin(); s != pending_adds.end(); ++s) {
diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc
index 9ecc6e10da..e7d0528b96 100644
--- a/libs/ardour/region_factory.cc
+++ b/libs/ardour/region_factory.cc
@@ -629,6 +629,18 @@ RegionFactory::new_region_name (string old)
return old;
}
+boost::shared_ptr<Region>
+RegionFactory::get_whole_region_for_source (boost::shared_ptr<Source> s)
+{
+ Glib::Threads::Mutex::Lock lm (region_map_lock);
+
+ for (RegionMap::const_iterator i = region_map.begin(); i != region_map.end(); ++i) {
+ if (i->second->uses_source (s) && i->second->whole_file()) {
+ return (i->second);
+ }
+ }
+}
+
void
RegionFactory::get_regions_using_source (boost::shared_ptr<Source> s, std::set<boost::shared_ptr<Region> >& r)
{
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index d955da9ac1..eb55e55508 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -5378,6 +5378,17 @@ Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
DataType::MIDI, *this, path, false, sample_rate()));
}
+bool
+Session::playlist_is_active (boost::shared_ptr<Playlist> playlist)
+{
+ Glib::Threads::Mutex::Lock lm (playlists->lock);
+ for (SessionPlaylists::List::iterator i = playlists->playlists.begin(); i != playlists->playlists.end(); i++) {
+ if ( (*i) == playlist ) {
+ return true;
+ }
+ }
+ return false;
+}
void
Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index 0cf2fc2010..4b5c7f250e 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -626,6 +626,13 @@ Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
return use_playlist (dt, playlist);
}
+void
+update_region_visibility(boost::shared_ptr<Region> r)
+{
+ Region::RegionPropertyChanged(r, Properties::hidden);
+}
+
+
int
Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
{
@@ -637,9 +644,15 @@ Track::use_playlist (DataType dt, boost::shared_ptr<Playlist> p)
}
}
+ boost::shared_ptr<Playlist> old = _playlists[dt];
+
if (ret == 0) {
_playlists[dt] = p;
}
+
+ //allow all regions of prior and new playlists to update their visibility?
+ if (old) old->foreach_region(update_region_visibility);
+ if (p) p->foreach_region(update_region_visibility);
_session.set_dirty ();
PlaylistChanged (); /* EMIT SIGNAL */