From 3e6ce20fd71022dad54508b652e851148ae4a4c4 Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Tue, 16 Oct 2018 17:44:11 -0500 Subject: (Source List) Region List rewrite (libardour part) --- libs/ardour/ardour/region_factory.h | 2 ++ libs/ardour/ardour/session.h | 4 +++- libs/ardour/playlist.cc | 1 + libs/ardour/region_factory.cc | 12 ++++++++++++ libs/ardour/session.cc | 11 +++++++++++ libs/ardour/track.cc | 13 +++++++++++++ 6 files changed, 42 insertions(+), 1 deletion(-) 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 create (SourceList& srcs, const XMLNode&); + static boost::shared_ptr get_whole_region_for_source (boost::shared_ptr); + static void get_regions_using_source (boost::shared_ptr, std::set >& ); static void remove_regions_using_source (boost::shared_ptr); 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); + 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 (*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 +RegionFactory::get_whole_region_for_source (boost::shared_ptr 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 s, std::set >& 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) DataType::MIDI, *this, path, false, sample_rate())); } +bool +Session::playlist_is_active (boost::shared_ptr 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, 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 r) +{ + Region::RegionPropertyChanged(r, Properties::hidden); +} + + int Track::use_playlist (DataType dt, boost::shared_ptr p) { @@ -637,9 +644,15 @@ Track::use_playlist (DataType dt, boost::shared_ptr p) } } + boost::shared_ptr 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 */ -- cgit v1.2.3